相同點(diǎn):三者都是為了實(shí)現(xiàn)javascript模塊化而產(chǎn)生的規(guī)范。
不同點(diǎn):
commonjs是隨著nodejs的火而火起來(lái)的,nodejs采用了commonjs規(guī)范,實(shí)現(xiàn)了(require、exports、module)等。
AMD 最好的實(shí)現(xiàn)模塊化的方式是實(shí)現(xiàn)前后端統(tǒng)一的標(biāo)準(zhǔn),無(wú)奈,commonjs并不適用于瀏覽器。比如:在后端使用
{
var math = require('math');
math.add(2, 3);
}
在加載完成math.js模塊之后,可以計(jì)算2+3,但是若是在前端使用,由于同步加載過(guò)程中,可能會(huì)造成瀏覽器“假死”的狀態(tài),不利用用戶的體驗(yàn),所以異步加載規(guī)范AMD誕生。其中的應(yīng)用實(shí)例是require.js。CMD 是在Sea.js中逐漸火起來(lái),推崇的是as lazy as possible。
AMD 和 CMD的主要區(qū)別
1: 對(duì)于依賴的模塊,AMD是提前執(zhí)行,CMD是延遲執(zhí)行。不過(guò)從require.js2.0起,AMD也實(shí)現(xiàn)延遲執(zhí)行(寫法不同,執(zhí)行方式不同),CMD思想是as lazy as possible.
2: AMD推崇依賴前置,CMD推崇依賴就近。代碼如下
//AMD
define(['./a', './b'], function(a, b){
a.doSomething();
......
b.doSomething();
})
//CMD
define(function(require, exports, module){
var a = require('./a');
a.doSomething();
......
var b = require('./b');
b.doSomething();
})
3: AMD的API默認(rèn)的是一個(gè)當(dāng)多個(gè)用,CMD比較嚴(yán)格,指責(zé)單一。