在網上看到一篇比較好的文章,摘抄作參考。原文地址:https://segmentfault.com/a/1190000002515305;javascript
http://www.cnblogs.com/johnl/archive/2015/01/26/4251300.htmlphp
寫過php的人對於require函數都不陌生,它的做用爲文件導入,也能夠把文件理解爲模塊、導入理解爲調用,稱爲模塊調用html
隨着用戶體驗的極致追求,前端業務所佔比重逐漸增長,因而出現了前端領域的模塊化編程前端
可是模塊加載(javascript文件加載)的前後順序卻給咱們帶來了不小的麻煩,好比處理模塊間的依賴關係java
須要載入的文件:requirejquery
require能夠理解爲一個工具庫,幫助咱們更好的架構前端框架,其自己並不是前端框架編程
客戶端代碼被定義爲各模塊後,模塊之間錯綜複雜的依賴關係以及模塊的按需加載、加載順序就成了問題segmentfault
require很好的解決了這個問題,它的模塊化管理遵循AMD規範,模塊加載不影響後續語句執行前端框架
Asynchronous Module Definition - 異步加載模塊規範cookie
解決模塊化編程帶來的代碼加載前後順序問題及常規異步加載代碼帶來的不肯定因素
1
|
<script src=
"/static/js/require.min.js"
data-main=
"/static/js/shop"
></script>
|
data-main指定了入口配置文件shop.js,同時指定了基於shop.js的相對路徑baseUrl,baseUrl能夠在config配置方法內重置
1
2
3
|
require.config({
baseUrl :
'js/lib'
});
|
1
2
3
4
5
6
|
require.config({
paths : {
jquery :
'jquery.min'
,
control :
'control'
}
});
|
已配置路徑的模塊的調用方式
1
2
3
|
require([
'jquery'
,
'control'
],
function
($, Control){
return
true
;
});
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
require.config({
paths : {
underscore :
'underscore.min'
,
backbone :
'backbone.min'
},
shim : {
underscore : {
exports :
'_'
},
backbone : {
deps : [
'underscore'
],
exports :
'Backbone'
}
}
});
|
有時咱們須要使用非AMD定義模塊,如jQuery,須要shim參數來幫助解決這些庫的解析名稱及載入順序問題
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
require.config({
paths : {
jquery :
'jquery.min'
,
jqmd5 :
'jquery.md5'
,
cookie :
'public/cookie'
,
jqui :
'jquery.ui.min'
,
/* 前端UI框架 */
jquid :
'jquery.ui.dialog.min'
,
/* 前端UI框架 - 模態框模塊 */
jqtmpl :
'jquery.tmpl.min'
,
/* 模版引擎 */
jqvali :
'jquery.validation.min'
,
/* 表單驗證 */
jqvalicn :
'jquery.validation.cn.min'
,
/* 表單驗證漢化 */
base :
'base'
,
/* 基礎功能 */
control :
'control'
,
/* 控制器模塊 */
login :
'login/index'
,
/* 登陸頁模塊 */
register :
'register/index'
,
/* 註冊頁模塊 */
detail :
'detail/index'
/* 詳情頁模塊 */
}
});
require([
'control'
],
function
(Control){
Control.cookie();
Control.template();
});
|
1
2
3
4
|
define(
function
(){
var
control = {};
return
control;
});
|
該模塊調用不依賴其它模塊
1
2
3
4
|
define([
'base'
],
function
(){
var
control = {};
return
control;
});
|
該模塊調用須要依賴base模塊
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
define([
'jquery'
,
'jqmd5'
,
'cookie'
,
'base'
],
function
(){
var
control = {};
/**
* 登陸狀態檢測
*/
control.cookie =
function
(){
setTimeout(WK.LC.syncLoginState, 100);
};
/**
* 模塊調用及配置
*/
control.template =
function
(){
if
($(
'.naver'
).length > 0) base.naver();
if
(CATEGORY ==
'login'
)
{
if
(MODEL ==
'index'
){
// 登陸頁
require([
'login'
],
function
(Login){
Login.form();
});
};
if
(MODEL ==
'register'
|| MODEL ==
'check'
){
// 註冊頁
require([
'register'
],
function
(Register){
Register.form(MODEL);
});
};
};
if
(CATEGORY ==
'goods'
)
{
// 詳情頁
if
(MODEL ==
'index'
){
require([
'detail'
],
function
(Detail){
// Detail.form();
});
};
};
};
return
control;
});
|
1
2
3
4
|
require([
'control'
],
function
(Control){
Control.cookie();
Control.template();
});
|
定義模塊的define方法和調用模塊的require方法,合稱AMD模式
該模式的定義模塊方法清晰且不會污染全局環境,可以清楚的顯示依賴關係