AMD 和 CMD 的區(qū)別有哪些?

作者:玉伯

鏈接:https://www.zhihu.com/question/20351507/answer/14859415

來源:知乎

著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。

AMD 規(guī)范在這里:https://github.com/amdjs/amdjs-api/wiki/AMD

CMD 規(guī)范在這里:https://github.com/seajs/seajs/issues/242

AMD 是 RequireJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。

CMD 是 SeaJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。

類似的還有 CommonJS Modules/2.0 規(guī)范,是 BravoJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。

還有不少??

這些規(guī)范的目的都是為了 JavaScript 的模塊化開發(fā),特別是在瀏覽器端的。

目前這些規(guī)范的實(shí)現(xiàn)都能達(dá)成瀏覽器端模塊化開發(fā)的目的。

區(qū)別:

1. 對于依賴的模塊,AMD 是提前執(zhí)行,CMD 是延遲執(zhí)行。不過 RequireJS 從 2.0 開始,也改成可以延遲執(zhí)行(根據(jù)寫法不同,處理方式不同)。CMD 推崇 as lazy as possible.

2. CMD 推崇依賴就近,AMD 推崇依賴前置??创a:

// CMD

define(function(require, exports, module) {

var a = require('./a')

a.doSomething()

// 此處略去 100 行

var b = require('./b') // 依賴可以就近書寫

b.doSomething()

// ...

})

// AMD 默認(rèn)推薦的是

define(['./a', './b'], function(a, b) {? // 依賴必須一開始就寫好

a.doSomething()

// 此處略去 100 行

b.doSomething()

...

})

雖然 AMD 也支持 CMD 的寫法,同時(shí)還支持將 require 作為依賴項(xiàng)傳遞,但 RequireJS 的作者默認(rèn)是最喜歡上面的寫法,也是官方文檔里默認(rèn)的模塊定義寫法。

3. AMD 的 API 默認(rèn)是一個(gè)當(dāng)多個(gè)用,CMD 的 API 嚴(yán)格區(qū)分,推崇職責(zé)單一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,沒有全局 require,而是根據(jù)模塊系統(tǒng)的完備性,提供 seajs.use 來實(shí)現(xiàn)模塊系統(tǒng)的加載啟動(dòng)。CMD 里,每個(gè) API 都簡單純粹。

4. 還有一些細(xì)節(jié)差異,具體看這個(gè)規(guī)范的定義就好,就不多說了。

另外,SeaJS 和 RequireJS 的差異,可以參考:https://github.com/seajs/seajs/issues/277

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容