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