使用requirejs模块化开发多页面一个入口js的使用方式


描述

知道requirejs的都知道,每一个页面需要进行模块化开发都得有一个入口js文件进行模块配置。但是现在就有一个很尴尬的问题,如果页面很多的话,那么这个data-main对应的入口文件就会很多。理论这样其实也没什么,但是到后面用grunt进行合并压缩就会有很多入口js,虽然这个入口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;
});


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM