Commonjs,AMD,CMD和UMD的差別

 
   

CommonJS

一種服務器端模塊化的規範,Nodejs實現了這種規範,因此就說Nodejs支持CommonJS。javascript

CommonJS分爲三部分:
require 模塊加載
exports 模塊導出
module 模塊自己

根據規範一個單獨的JS文件就是一個module,每一個單獨的module是一個單獨的做用域。也就是說在一個文件裏定義的變量和函數都是私有,對其餘文件不可見,除非用exports導出了。java


AMD

Asynchronous Module Definition 的縮寫,意思是異步模塊定義,是一種異步模塊加載的規範,主要用於瀏覽器端的JS加載,爲了避免形成網絡阻塞。只有當依賴的模塊加載完畢,纔會執行回調。git

AMD使用define來定義模塊,require來加載模塊。
define(id?,dependencies?,factory);
require([module],callback);github

Note: AMD容許輸出的模塊兼容CommonJS。後端

RequireJS是AMD的一種實現。瀏覽器


CMD

Common Module Definition的縮寫,也是一種異步模塊定義規範,它和AMD的主要區別有兩點:
1.對於模塊的依賴,AMD是提早執行,CMD是延時執行。
2.AMD推崇依賴前置,CMD推崇就近依賴。服務器

//AMD
define(['./a','./b'], function (a, b) {

    //依賴一開始就寫好
    a.test();
    b.test();
});

//CMD
define(function (requie, exports, module) {

    //依賴就近書寫
    var a = require('./a');
    a.test();
});

固然還其餘區別這裏就不詳細講了。markdown

SeaJS是CMD的一種實現。


UMD

Universal Module Definition。從名字就能夠看出來UMD作的是大一統的工做,把先後端加載糅合在了一塊兒,提供了一個先後端統一的解決方案。支持AMD和CommonJS模式。網絡

UMD的實現很簡單:異步

1.先判斷是否支持Node.js模塊格式(exports是否存在),存在則使用Node.js模塊格式。
2.再判斷是否支持AMD(define是否存在),存在則使用AMD方式加載模塊。
3.前兩個都不存在,則將模塊公開到全局(window或global)。

各類具體的實現方式,能夠查看UMD的github。下面是Jquery的例子

// if the module has no dependencies, the above pattern can be simplified to
(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define([], factory);
    } else if (typeof exports === 'object') {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like environments that support module.exports,
        // like Node.
        module.exports = factory();
    } else {
        // Browser globals (root is window)
        root.returnExports = factory();
  }
}(this, function () {

    // Just return a value to define the module export.
    // This example returns an object, but the module
    // can return a function as the exported value.
    return {};
}));
相關文章
相關標籤/搜索