CommonJS,AMD,CMD區別
- 博客分類:?
- seajs和requirejs
JavaScript
zccst轉載?
學得比較暈,再次看commonjs,amd, cmd時好像還是沒完全弄清楚,今天再整理一下:?
commonjs是用在服務器端的,同步的,如nodejs?
amd, cmd是用在瀏覽器端的,異步的,如requirejs和seajs?
其中,amd先提出,cmd是根據commonjs和amd基礎上提出的。?
為什么暈呢?是因為沒用,或用得太少。光看看文章是不行的。?
CommonJS?
CommonJs 是服務器端模塊的規范,Node.js采用了這個規范。?
根據CommonJS規范,一個單獨的文件就是一個模塊。加載模塊使用require方法,該方法讀取一個文件并執行,最后返回文件內部的exports對象。?
例如:?
// foobar.js?
//私有變量?
var test = 123;?
//公有方法?
function foobar () {?
??? this.foo = function () {?
??????? // do someing ...?
??? }?
??? this.bar = function () {?
??????? //do someing ...?
??? }?
}?
//exports對象上的方法和變量是公有的?
var foobar = new foobar();?
exports.foobar = foobar;?
//require方法默認讀取js文件,所以可以省略js后綴?
var test = require('./boobar').foobar;?
test.bar();?
CommonJS 加載模塊是同步的,所以只有加載完成才能執行后面的操作。像Node.js主要用于服務器的編程,加載的模塊文件一般都已經存在本地硬盤,所以加載起來比較快,不用考慮異步加載的方式,所以CommonJS規范比較適用。但如果是瀏覽器環境,要從服務器加載模塊,這是就必須采用異步模式。所以就有了 AMD? CMD 解決方案。?
AMD((Asynchromous Module Definition)?
AMD 是 RequireJS 在推廣過程中對模塊定義的規范化產出?
AMD異步加載模塊。它的模塊支持對象 函數 構造器 字符串 JSON等各種類型的模塊。?
適用AMD規范適用define方法定義模塊。?
//通過數組引入依賴 ,回調函數通過形參傳入依賴?
define(['someModule1', ‘someModule2’], function (someModule1, someModule2) {?
??? function foo () {?
??????? /// someing?
??????? someModule1.test();?
??? }?
??? return {foo: foo}?
});?
AMD規范允許輸出模塊兼容CommonJS規范,這時define方法如下:?
define(function (require, exports, module) {?
?????
??? var reqModule = require("./someModule");?
??? requModule.test();?
?????
??? exports.asplode = function () {?
??????? //someing?
??? }?
});?
CMD?
CMD是SeaJS 在推廣過程中對模塊定義的規范化產出?
CMD和AMD的區別有以下幾點:?
1.對于依賴的模塊AMD是提前執行,CMD是延遲執行。不過RequireJS從2.0開始,也改成可以延遲執行(根據寫法不同,處理方式不通過)。?
2.CMD推崇依賴就近,AMD推崇依賴前置。?
//AMD?
define(['./a','./b'], function (a, b) {?
??? //依賴一開始就寫好?
??? a.test();?
??? b.test();?
});?
//CMD?
define(function (requie, exports, module) {?
?????
??? //依賴可以就近書寫?
??? var a = require('./a');?
??? a.test();?
?????
??? ...?
??? //軟依賴?
??? if (status) {?
?????
??????? var b = requie('./b');?
??????? b.test();?
??? }?
});?
雖然 AMD也支持CMD寫法,但依賴前置是官方文檔的默認模塊定義寫法。?
3.AMD的api默認是一個當多個用,CMD嚴格的區分推崇職責單一。例如:AMD里require分全局的和局部的。CMD里面沒有全局的 require,提供 seajs.use()來實現模塊系統的加載啟動。CMD里每個API都簡單純粹。?
SeaJS 和 RequireJS的主要區別 在此有解釋