描述
知道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;
});