? ? ? ? 模塊化思想在前端的應(yīng)用層出不窮,它的出現(xiàn)也加快了前端內(nèi)容的開發(fā)祖很,和下部的復(fù)用漾脂,同時(shí)增加了合作性。做到模塊化骨稿,就要有一定的模塊規(guī)范, CommonJS為后端定制了特定的規(guī)范形耗,但是鑒于網(wǎng)絡(luò)的原因辙浑,CommonJS并不完全適合前端的應(yīng)用場(chǎng)景,經(jīng)過一段時(shí)間爭(zhēng)論后判呕,AMD(Asynchronous Module Definition,異步模塊定義)規(guī)范最終在前端應(yīng)用場(chǎng)景中勝出送滞。除此之外硼一,還有國(guó)內(nèi)玉伯的CMD。
1.AMD規(guī)范
AMD規(guī)范是CommonJS模塊規(guī)范的一個(gè)延伸,它的模塊定義如下:
define(id?,dependencies?,factory);
它的模塊id和依賴都是可選的奥吩,與node模塊相似的地方在于factory的內(nèi)容就是實(shí)際代碼中內(nèi)容。下面的代碼定義了一個(gè)簡(jiǎn)單的模塊:
define(function(){
? ?var exports = {};
? ?exports.sayHello=function(){
? ? ? ?alert('hello from module:' + module.id);
? }
? ?return exports;
})
不同的地方就是AMD模塊需要用define來(lái)明確定義一個(gè)模塊腮介,而Node實(shí)現(xiàn)中是隱式包裝的端衰,他們的目的都是作用域隔離(不知道啥是作用域隔離,去問度娘或者谷妹吧)旅东,僅在需要的時(shí)候被引入,避免掉過去那種通過全局變量或者全局命名空間的方式腾节,以免變量污染和不小心被修改荤牍。另一個(gè)區(qū)別就是內(nèi)容通過返回的方式實(shí)現(xiàn)導(dǎo)出。例如require.js的實(shí)現(xiàn)方式
2 CMD規(guī)范
它與AMD規(guī)范的主要區(qū)別在于定義模塊和依賴引入的部分康吵,AMD需要在聲明模塊的時(shí)候制定所有的依賴,通過形式參數(shù)傳遞依賴到模塊內(nèi)容中:
define(['dep1','dep2'],function(dep1,dep2)){
? ? ?return function(){};
});
而CMD模塊更接近于Node對(duì)CommonJS規(guī)范的定義:
define(factory);
在依賴部分同辣,CMD支持動(dòng)態(tài)引入耍铜,示例如下:
define(function(require,exports,module){
//這里來(lái)寫模塊內(nèi)容
})
require、exports和module通過形式參數(shù)傳遞給模塊棕兼,在需要依賴模塊時(shí),隨時(shí)調(diào)用require()引入即可靶衍。例如sea.js的實(shí)現(xiàn)方式
3.兼容多種模塊規(guī)范的寫法
前面廢話那么多,現(xiàn)在為了讓同一個(gè)模塊可以運(yùn)行在前后端颅眶,在寫作過程中需要考慮兼容前端也實(shí)現(xiàn)模塊規(guī)范的環(huán)境。為了保持前后端的一致性铡原,類庫(kù)開發(fā)者需要將類庫(kù)代碼包裝在一個(gè)閉包內(nèi)商叹。下面栗子演示如何將hello方法定義到不同的運(yùn)行環(huán)境中,兼容Node剖笙、AMD、CMD以及常見的瀏覽器環(huán)境中:(用的時(shí)候copy一下就ok了)
```
;(function(name,definition){
? ?//檢測(cè)上下文環(huán)境是否為AMD或者CMD
var hasDefine=typeof define==='function',
? ? ? hasExports=typeof module !=='undefined'&&module.exports;
if(hasDefine){
?//AMD/CMD
? ?define(definition);
}else if(hasExports){
? ? //定義為普通Node模塊
? ?module.exports=definition();
}else{
? //將模塊的執(zhí)行結(jié)果掛在window變量中过蹂,在瀏覽器中this指向window對(duì)象
? this[name]=definition();
?}
})('hello',function(){
? ? var hello=function(){};
?return hello;
})
```
至此 不足之處聚至,請(qǐng)批評(píng)指正(感謝樸靈的深入淺出nodejs)!
```
```