關於 CommonJS AMD CMD UMD

一、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的主要區別 在此有解釋


四、UMD

umd是AMD和CommonJS的糅合

AMD 瀏覽器第一的原則發展 異步加載模塊。

CommonJS 模塊以服務器第一原則發展,選擇同步加載,它的模塊無需包裝(unwrapped modules)。

這迫使人們又想出另一個更通用的模式UMD (Universal Module Definition)。希望解決跨平臺的解決方案。

UMD先判斷是否支持Node.js的模塊(exports)是否存在,存在則使用Node.js模塊模式。

在判斷是否支持AMD(define是否存在),存在則使用AMD方式加載模塊。

(function (window, factory) {
    if (typeof exports === 'object') {
     
        module.exports = factory();
    } else if (typeof define === 'function' && define.amd) {
     
        define(factory);
    } else {
     
        window.eventUtil = factory();
    }
})(this, function () {
    //module ...
});


轉載自http://my.oschina.net/felumanman/blog/263330?p=1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章