AMD 是 RequireJS 在推廣過(guò)程中對(duì)模塊定義的規(guī)范化產(chǎn)出祭示。CMD 是 SeaJS 在推廣過(guò)程中對(duì)模塊定義的規(guī)范化產(chǎn)出。類似的還有 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ū)別:
- 對(duì)于依賴的模塊,AMD 是提前執(zhí)行柿祈,CMD 是延遲執(zhí)行哈误。不過(guò) RequireJS 從 2.0 開(kāi)始,也改成可以延遲執(zhí)行(根據(jù)寫(xiě)法不同躏嚎,處理方式不同)蜜自。CMD 推崇 as lazy as possible.
- CMD 推崇依賴就近,AMD 推崇依賴前置卢佣≈剀看代碼:
//CMDdefine(function(require, exports, module) { var a = require('./a') a.doSomething()
//
此處略去 100 行
var b = require('./b') // 依賴可以就近書(shū)寫(xiě) b.doSomething() // ... })
//
AMD 默認(rèn)推薦的是define(['./a', './b'], function(a, b) { // 依賴必須一開(kāi)始就寫(xiě)好 a.doSomething() // 此處略去 100 行 b.doSomething() ...}) 雖然 AMD 也支持 CMD 的寫(xiě)法,同時(shí)還支持將 require 作為依賴項(xiàng)傳遞虚茶,但 RequireJS 的作者默認(rèn)是最喜歡上面的寫(xiě)法戈鲁,也是官方文檔里默認(rèn)的模塊定義寫(xiě)法尾膊。 - 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)單純粹。