CommonJs是一個(gè)組織,它定了一個(gè)Modules規(guī)范,用來(lái)解決JS沒(méi)有模塊(js文件)化管理代碼的功能育灸。
關(guān)鍵部分是require - 引入依賴;export - 導(dǎo)出模塊這兩個(gè)函數(shù)昵宇。然而這個(gè)Modules規(guī)范當(dāng)初是為服務(wù)器端設(shè)計(jì)的磅崭,是一個(gè)同步模式,這種模式并不適合瀏覽器端瓦哎,因?yàn)闉g覽器同步模式一個(gè)一個(gè)加載模塊會(huì)變得打開(kāi)非常的慢砸喻。所以,這時(shí)候AMD就是為了解決這個(gè)問(wèn)題而產(chǎn)生的蒋譬,它最大的特點(diǎn)就是可以異步加載模塊割岛,具體不同在于AMD有一個(gè)define函數(shù),他可以讓當(dāng)前模塊運(yùn)行時(shí)先加載當(dāng)前模塊所需要的模塊犯助。
而RequireJs就是AMD現(xiàn)在用的最廣泛癣漆,最流行的實(shí)現(xiàn)。所以這三者之間的關(guān)系可以這樣理解:CommonJs(泛指Modules規(guī)范)和AMD都是為了解決JS模塊化的規(guī)范API剂买,CommonJs更適合于服務(wù)器端惠爽,而AMD基本就是用于瀏覽器端(不過(guò)也可以用于服務(wù)器端,比如Node loader方向)瞬哼,而RequireJs就是AMD最流行的實(shí)現(xiàn)婚肆。
而CMD則是國(guó)內(nèi)玉伯大神在開(kāi)發(fā)SeaJs的時(shí)候提出來(lái)的,屬于CommonJs的一種規(guī)范
AMD:RequireJs
CMD : SeaJs
CMD和AMD都是CommonJs的一種規(guī)范的實(shí)現(xiàn)主義倒槐,SeaJs和RequireJs就是對(duì)應(yīng)的實(shí)踐旬痹。說(shuō)白了就是CMD和AMD是理論,SeaJs和RequireJs是對(duì)應(yīng)的產(chǎn)物。
CMD和AMD的區(qū)別:CMD相當(dāng)于按需加載两残,定義一個(gè)模塊的時(shí)候不需要立即制定依賴模塊永毅,在需要的時(shí)候require就可以了(同步的),比較方便人弓;而AMD則相反沼死,定義模塊的時(shí)候需要制定依賴模塊,并以形參的方式引入factory中崔赌。
區(qū)別看下邊例子:
//AMD
define(['dep1','dep2'],function(dep1,dep2){
//內(nèi)部只能使用制定的模塊
return function(){};
});
//CMD
define(function(require,exports,module){
//此處如果需要某XX模塊意蛀,可以引入
var xx=require('XX');
});
AMD規(guī)范后來(lái)也允許輸出的模塊兼容CommonJs規(guī)范(同步),這時(shí)define方法需要寫(xiě)成下面這樣:
define(function (require, exports, module){
var someModule = require("someModule");
var anotherModule = require("anotherModule");
someModule.doTehAwesome();
anotherModule.doMoarAwesome();
exports.asplode = function (){
someModule.doTehAwesome();
anotherModule.doMoarAwesome();
};});