一篇博客告訴你三者的區別:http://zccst.iteye.com/blog/2215317html
告訴你三者同requirejs seajs的區別:http://blog.chinaunix.net/uid-26672038-id-4112229.htmlnode
這個雖然重複的博客,可是他也能夠調到git上,http://www.cnblogs.com/yexiaochai/p/3214926.htmlgit
本人道聽途生的:編程
cmd和amd定義模塊的方式更趨近用define,而requirejs或者commonjs規範中都直接用Require來代替了define,cmd和amd中兼容commonjs這種方式。後端
commonjs的規範在node尚未產生之前,就有了,commonjs做爲一個後端的規範,雖而後端的Js之前發展緩慢,可是commonjs這個規範仍是比較完善的,隨着Node的普及,commonjs被徹底聽從和實現,commonjs普遍開來。api
commonjs是用在服務器端的,同步的,如nodejs
amd, cmd是用在瀏覽器端的,異步的,如requirejs和seajs 數組
amd規範提出用於瀏覽器端的模塊化,而cmd在amd和commonjs的規範的基礎上提出的。瀏覽器
根據CommonJS規範,一個單獨的文件就是一個模塊。加載模塊使用require方法,該方法讀取一個文件並執行,最後返回文件內部的exports對象。服務器
例如:
// foobar.js
//私有變量
var test = 123;
//公有方法
function foobar () {
this.foo = function () {
// do someing ...
}
this.bar = function () {
//do someing ...
}
}
//exports對象上的方法和變量是公有的
var foobar = new foobar();
exports.foobar = foobar;
//require方法默認讀取js文件,因此能夠省略js後綴
var test = require('./boobar').foobar;
test.bar(); 異步
CommonJS 加載模塊是同步的,因此只有加載完成才能執行後面的操做。像Node.js主要用於服務器的編程,加載的模塊文件通常都已經存在本地硬盤,因此加載起來比較快,不用考慮異步加載的方式,因此CommonJS規範比較適用。但若是是瀏覽器環境,要從服務器加載模塊,這是就必須採用異步模式。因此就有了 AMD CMD 解決方案。
===========================
===========================
AMD((Asynchromous Module Definition)
AMD 是 RequireJS 在推廣過程當中對模塊定義的規範化產出
AMD異步加載模塊。它的模塊支持對象 函數 構造器 字符串 JSON等各類類型的模塊。
適用AMD規範適用define方法定義模塊。
//經過數組引入依賴 ,回調函數經過形參傳入依賴
define(['someModule1', ‘someModule2’], function (someModule1, someModule2) {
function foo () {
/// someing
someModule1.test();
}
return {foo: foo}
});
AMD規範容許輸出模塊兼容CommonJS規範,這時define方法以下:
define(function (require, exports, module) {
var reqModule = require("./someModule");
requModule.test();
exports.asplode = function () {
//someing
}
});
=========================
========================
CMD
CMD是SeaJS 在推廣過程當中對模塊定義的規範化產出
CMD和AMD的區別有如下幾點:
1.對於依賴的模塊AMD是提早執行,CMD是延遲執行。不過RequireJS從2.0開始,也改爲能夠延遲執行(根據寫法不一樣,處理方式不經過)。
2.CMD推崇依賴就近,AMD推崇依賴前置。
//AMD
define(['./a','./b'], function (a, b) {
//依賴一開始就寫好
a.test();
b.test();
});
//CMD
define(function (requie, exports, module) {
//依賴能夠就近書寫
var a = require('./a');
a.test();
...
//軟依賴
if (status) {
var b = requie('./b');
b.test();
}
}); 雖然 AMD也支持CMD寫法,但依賴前置是官方文檔的默認模塊定義寫法。 3.AMD的api默認是一個當多個用,CMD嚴格的區分推崇職責單一。例如:AMD裏require分全局的和局部的。CMD裏面沒有全局的 require,提供 seajs.use()來實現模塊系統的加載啓動。CMD裏每一個API都簡單純粹。 SeaJS 和 RequireJS的主要區別 在此有解釋