對於大型Web應用或者項目,動輒上萬行的代碼,給開發和後期維護帶來了不小的麻煩。所以,須要有一種規範化的模塊管理機制,幫助開發者集中處理模塊的定義與調用關係。node
在ES6正式出臺前,已經有很多人致力於推出適合Web開發的模塊化管理標準,CommonJS、AMD和CMD就是其中的成功表明。git
如下爲我查閱資料後,對三者最直觀的理解:github
一般被應用於服務器,實現表明:NodeJS。NodeJS相信你們都不陌生,它的出現成功將Javascript應用到了服務器端,使得前段開發者也能較爲省力得轉向後端開發,而無需學習一門新語言。json
在服務器端,模塊的加載和執行都在本地完成,所以,CommonJS並不要求模塊加載的異步化。後端
AMD(異步模塊加載)和CMD一般用於瀏覽器端,它們與CommonJS最明顯的不一樣就是異步加載。AMD的實現表明是require.js,它也是require.js在推廣過程當中的附加產物。數組
requirejs.config({ config: { 'bar': { size:'large' }, 'baz': { color: 'blue' } } }); //bar.js直接使用module模塊 define(function (require, exports, module) { var size = module.config().size; }); //baz.js使用了一個依賴數組,並要求一個特殊的依賴「module」 define(['module'], function(module) { var color = module.config().color; });
當「some/newmodule」調用了「require('foo')」,它將獲取到foo1.2.js文件;而當「some/oldmodule」調用「`require('foo')」時它將獲取到foo1.0.js。瀏覽器
requirejs.config({ map: { 'some/newmodule': { 'foo': 'foo1.2' }, 'some/oldmodule': { 'foo': 'foo1.0' } } });
CMD(通用模塊加載)是sea.js在推廣過程當中的產出,它與AMD主要有如下幾點區別(來自seajs的官方闡述):服務器
這造成了兩種大相徑庭的加載方式:「預加載」和「懶加載」。AMD提早將全部模塊的全部依賴加載完成後,纔開始執行主流程;而CMD是遇到一個依賴開始加載,完成後執行當前流程,遇到下一個依賴再次去加載,而後再執行下一步。固然,同一模塊的依賴之間仍然是異步加載的。異步
流程與AMD相似,再也不贅述,只簡單介紹seajs的API。模塊化
seajs.config({ // 變量配置 vars: { 'locale': 'zh-cn' } }); define(function(require, exports, module) { var lang = require('./i18n/{locale}.js'); //=> 加載的是 path/to/i18n/zh-cn.js });
使用變量須要用花括號包圍,如例中的{locale}。