CommonJS、AMD和CMD

CommonJS是用在服務器端的,同步的,如nodejs ;AMD,CMD是用在瀏覽器端的,AMD是異步模塊加載,如requirejs;CMD是通用模塊加載,如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; 

使用foobar.jsnode

//require方法默認讀取js文件,因此能夠省略js後綴 
var test = require('./boobar').foobar; 
test.bar();

CommonJS 加載模塊是同步的,因此只有加載完成才能執行後面的操做。像Node.js主要用於服務器的編程,加載的模塊文件通常都已經存在本地硬盤,因此加載起來比 較快,不用考慮異步加載的方式,因此CommonJS規範比較適用。但若是是瀏覽器環境,要從服務器加載模塊,這是就必須採用異步模式。因此就有了 AMD  CMD 解決方案。編程

AMD(Asynchromous Module Definition)

AMD 是 RequireJS 在推廣過程當中對模塊定義的規範化產出。AMD異步加載模塊。它的模塊支持對象 函數 構造器 字符串 JSON等各類類型的模塊。api

適用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寫法,但依賴前置是官方文檔的默認模塊定義寫法。requirejs

3.AMD的api默認是一個當多個用,CMD嚴格的區分推崇職責單一。例如:AMD裏require分全局的和局部的。CMD裏面沒有全局的 require,提供 seajs.use()來實現模塊系統的加載啓動。CMD裏每一個API都簡單純粹。ui

 

 

參考其餘博主的經驗以及部分我的總結,若有侵權,請及時聯繫本人,QQ:435641688,謝謝

相關文章
相關標籤/搜索