CommonJs是一個組織,它定了一個Modules規范,用來解決JS沒有模塊(js文件)化管理代碼的功能。
關鍵部分是require - 引入依賴;export - 導出模塊這兩個函數。然而這個Modules規范當初是為服務器端設計的,是一個同步模式,這種模式并不適合瀏覽器端,因為瀏覽器同步模式一個一個加載模塊會變得打開非常的慢。所以,這時候AMD就是為了解決這個問題而產生的,它最大的特點就是可以異步加載模塊,具體不同在于AMD有一個define函數,他可以讓當前模塊運行時先加載當前模塊所需要的模塊。
而RequireJs就是AMD現在用的最廣泛,最流行的實現。所以這三者之間的關系可以這樣理解:CommonJs(泛指Modules規范)和AMD都是為了解決JS模塊化的規范API,CommonJs更適合于服務器端,而AMD基本就是用于瀏覽器端(不過也可以用于服務器端,比如Node loader方向),而RequireJs就是AMD最流行的實現。
而CMD則是國內玉伯大神在開發SeaJs的時候提出來的,屬于CommonJs的一種規范
AMD:RequireJs
CMD : SeaJs
CMD和AMD都是CommonJs的一種規范的實現主義,SeaJs和RequireJs就是對應的實踐。說白了就是CMD和AMD是理論,SeaJs和RequireJs是對應的產物。
CMD和AMD的區別:CMD相當于按需加載,定義一個模塊的時候不需要立即制定依賴模塊,在需要的時候require就可以了(同步的),比較方便;而AMD則相反,定義模塊的時候需要制定依賴模塊,并以形參的方式引入factory中。
區別看下邊例子:
//AMD
define(['dep1','dep2'],function(dep1,dep2){
//內部只能使用制定的模塊
return function(){};
});
//CMD
define(function(require,exports,module){
//此處如果需要某XX模塊,可以引入
var xx=require('XX');
});
AMD規范后來也允許輸出的模塊兼容CommonJs規范(同步),這時define方法需要寫成下面這樣:
define(function (require, exports, module){
var someModule = require("someModule");
var anotherModule = require("anotherModule");
someModule.doTehAwesome();
anotherModule.doMoarAwesome();
exports.asplode = function (){
someModule.doTehAwesome();
anotherModule.doMoarAwesome();
};});