作者:玉伯
鏈接:https://www.zhihu.com/question/20351507/answer/14859415
來源:知乎
著作權歸作者所有供鸠,轉載請聯(lián)系作者獲得授權。
AMD 規(guī)范在這里:https://github.com/amdjs/amdjs-api/wiki/AMD
CMD 規(guī)范在這里:https://github.com/seajs/seajs/issues/242
AMD 是 RequireJS 在推廣過程中對模塊定義的規(guī)范化產出。
CMD 是 SeaJS 在推廣過程中對模塊定義的規(guī)范化產出摔癣。
類似的還有 CommonJS Modules/2.0 規(guī)范,是 BravoJS 在推廣過程中對模塊定義的規(guī)范化產出纬向。
還有不少??
這些規(guī)范的目的都是為了 JavaScript 的模塊化開發(fā)择浊,特別是在瀏覽器端的。
目前這些規(guī)范的實現(xiàn)都能達成瀏覽器端模塊化開發(fā)的目的逾条。
區(qū)別:
1. 對于依賴的模塊琢岩,AMD 是提前執(zhí)行,CMD 是延遲執(zhí)行师脂。不過 RequireJS 從 2.0 開始担孔,也改成可以延遲執(zhí)行(根據(jù)寫法不同,處理方式不同)吃警。CMD 推崇 as lazy as possible.
2. CMD 推崇依賴就近糕篇,AMD 推崇依賴前置∽眯模看代碼:
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此處略去 100 行
var b = require('./b') // 依賴可以就近書寫
b.doSomething()
// ...
})
// AMD 默認推薦的是
define(['./a', './b'], function(a, b) {? // 依賴必須一開始就寫好
a.doSomething()
// 此處略去 100 行
b.doSomething()
...
})
雖然 AMD 也支持 CMD 的寫法拌消,同時還支持將 require 作為依賴項傳遞,但 RequireJS 的作者默認是最喜歡上面的寫法安券,也是官方文檔里默認的模塊定義寫法墩崩。
3. AMD 的 API 默認是一個當多個用,CMD 的 API 嚴格區(qū)分侯勉,推崇職責單一鹦筹。比如 AMD 里,require 分全局 require 和局部 require址貌,都叫 require盛龄。CMD 里,沒有全局 require,而是根據(jù)模塊系統(tǒng)的完備性余舶,提供 seajs.use 來實現(xiàn)模塊系統(tǒng)的加載啟動啊鸭。CMD 里,每個 API 都簡單純粹匿值。
4. 還有一些細節(jié)差異赠制,具體看這個規(guī)范的定義就好,就不多說了挟憔。
另外钟些,SeaJS 和 RequireJS 的差異,可以參考:https://github.com/seajs/seajs/issues/277