使用RequireJS实现多页面共用单一入口JS文件

作者:橙子时间:2026-10-22 04:48:47浏览:68

本文介绍如何利用RequireJS解决多页面应用中入口文件冗余的问题。通过配置统一的require.config.js,根据页面属性动态加载特定模块,并约定各模块暴露init方法,实现多页面共用一个入口JS文件,优化Grunt合并压缩效果。

需求背景与问题分析

描述

熟悉RequireJS的开发人员都知道,在模块化开发中,每个页面通常都需要一个独立的入口JS文件来进行模块配置。然而,当页面数量较多时,这种模式会导致data-main属性对应的入口文件数量激增。虽然从理论上看这并非问题,但在后续使用Grunt进行代码合并与压缩时,会产生大量入口JS文件。尽管这些入口文件已将配置的模块内容压缩其中,但不同入口文件合并后的结果中仍包含大量重复代码。因此,为了优化构建过程,考虑将所有入口文件统一为一个,这样在使用Grunt合并压缩时,最终生成的入口文件仅有一个,极大简化了构建流程。

统一入口实现原理

实现原理

1. 页面引入RequireJS,并设置id及当前页面信息的属性

页面引入与属性配置


<script src="/res/js/require.js" data-main="/res/js/require.config" id="current-page" current-page ="news" target-module="/res/js/module/newsCtrl" defer async="true" ></script>

2. 编写require.config.js,根据不同的页面初始化相应的页面信息

统一配置文件编写


/** * 1、所有页面使用公共的require配置
 * 2、根据current-page去加载相应地模块,不需要的模块不要去加载
 * 3、每个模块都要按约定去对外暴露一个init的初始化方法,用于页面信息加载时间监听
 * 
 */
require.config({ 
  urlArgs: "ver=1.0_" + (new Date).getTime(),   
  paths: {      
    "jquery": "/res/js/base/jquery-1.11.3.min",
    "vue":'/res/js/base/vue.min',
    "common": "/res/js/widgets/common"
  },
  shim: {
    'scroll': {      
      deps: ['jquery'],
      exports: 'jQuery.fn.scroll'    
    },
    'vue':{
      exports:'vue'
    },
    'common':['jquery']
  }
});
require(["jquery"], function ($) {
  require(["common"], function (common) {
    var currentPage = $("#current-page").attr("current-page");
    var targetModule = $("#current-page").attr("target-module");
    if (targetModule) {
      // 页面加载完毕后再执行相关业务代码比较稳妥
      $(function () {
        require([targetModule], function (targetModule) {
          // 不要在这里写业务代码
          //全部统一调用init方法
          //也就是每个模块都暴露一个init方法用于事件监听,页面内容加载等
          targetModule.init(currentPage);
        });
      });
      return;
    }
  });
});

3. 定义模块,实现init方法以进行事件监听和页面信息初始化

模块定义与初始化


define(['jquery', "common"], function ($, common) {    
  var newCtrl = {};
  newCtrl.init = function (page) {
    common.info("开始初始化页面信息");
  };
  newCtrl.login = function () {};
  return newCtrl;
});

以上所述是小编给大家介绍的使用requirejs模块化开发多页面一个入口js的使用方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!

作者最新文章