<meta charset="utf-8">
作者:玉伯
鏈接:https://www.zhihu.com/question/20351507/answer/14859415
來(lái)源:知乎
著作權(quán)歸作者所有鹦蠕。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)冒签,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
AMD 規(guī)范在這里:https://github.com/amdjs/amdjs-api/wiki/AMD
CMD 規(guī)范在這里:https://github.com/seajs/seajs/issues/242
AMD 是 RequireJS 在推廣過(guò)程中對(duì)模塊定義的規(guī)范化產(chǎn)出片部。
CMD 是 SeaJS 在推廣過(guò)程中對(duì)模塊定義的規(guī)范化產(chǎn)出镣衡。
類(lèi)似的還有 CommonJS Modules/2.0 規(guī)范,是 BravoJS 在推廣過(guò)程中對(duì)模塊定義的規(guī)范化產(chǎn)出档悠。
還有不少??
這些規(guī)范的目的都是為了 JavaScript 的模塊化開(kāi)發(fā),特別是在瀏覽器端的望浩。
目前這些規(guī)范的實(shí)現(xiàn)都能達(dá)成瀏覽器端模塊化開(kāi)發(fā)的目的辖所。
區(qū)別:
1. 對(duì)于依賴(lài)的模塊,AMD 是提前執(zhí)行磨德,CMD 是延遲執(zhí)行缘回。不過(guò) RequireJS 從 2.0 開(kāi)始吆视,也改成可以延遲執(zhí)行(根據(jù)寫(xiě)法不同,處理方式不同)酥宴。CMD 推崇 as lazy as possible.
2. CMD 推崇依賴(lài)就近啦吧,AMD 推崇依賴(lài)前置∽竟眩看代碼:
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此處略去 100 行
var b = require('./b') // 依賴(lài)可以就近書(shū)寫(xiě)
b.doSomething()
// ...
})
// AMD 默認(rèn)推薦的是
define(['./a', './b'], function(a, b) { // 依賴(lài)必須一開(kāi)始就寫(xiě)好
a.doSomething()
// 此處略去 100 行
b.doSomething()
...
})
雖然 AMD 也支持 CMD 的寫(xiě)法授滓,同時(shí)還支持將 require 作為依賴(lài)項(xiàng)傳遞,但 RequireJS 的作者默認(rèn)是最喜歡上面的寫(xiě)法肆糕,也是官方文檔里默認(rèn)的模塊定義寫(xiě)法般堆。
3. AMD 的 API 默認(rèn)是一個(gè)當(dāng)多個(gè)用,CMD 的 API 嚴(yán)格區(qū)分诚啃,推崇職責(zé)單一淮摔。比如 AMD 里,require 分全局 require 和局部 require始赎,都叫 require和橙。CMD 里,沒(méi)有全局 require造垛,而是根據(jù)模塊系統(tǒng)的完備性胃碾,提供 seajs.use 來(lái)實(shí)現(xiàn)模塊系統(tǒng)的加載啟動(dòng)。CMD 里筋搏,每個(gè) API 都簡(jiǎn)單純粹仆百。
4. 還有一些細(xì)節(jié)差異食磕,具體看這個(gè)規(guī)范的定義就好怕敬,就不多說(shuō)了蝉娜。