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 {};
}));