1. 對於依賴的模塊,AMD 是提早執行,CMD 是延遲執行。不過 RequireJS 從 2.0 開始,也改爲能夠延遲執行(根據寫法不一樣,處理方式不一樣)。CMD 推崇 as lazy as possible.jquery
2. CMD 推崇依賴就近,AMD 推崇依賴前置。看代碼:git
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此處略去 100 行
var b = require('./b') // 依賴能夠就近書寫
b.doSomething()
// ...
})github
// AMD 默認推薦的是
define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好
a.doSomething()
// 此處略去 100 行
b.doSomething()
...
}) api
雖然 AMD 也支持 CMD 的寫法,同時還支持將 require 做爲依賴項傳遞,但 RequireJS 的做者默認是最喜歡上面的寫法,也是官方文檔裏默認的模塊定義寫法。數組
3. AMD 的 API 默認是一個當多個用,CMD 的 API 嚴格區分,推崇職責單一。好比 AMD 裏,require 分全局 require 和局部 require,都叫 require。CMD 裏,沒有全局 require,而是根據模塊系統的完備性,提供 seajs.use 來實現模塊系統的加載啓動。CMD 裏,每一個 API 都簡單純粹。dom
4. 還有一些細節差別,具體看這個規範的定義就好,就很少說了。異步
1.seajs.config--用來對 Sea.js 進行配置。async
seajs.config({ // 設置路徑,方便跨目錄調用 paths: { 'domes': 'http://127.0.0.1:8020/seajs-master' }, // 設置別名,方便調用 alias: { 'dom': 'domes/dome/dom' }, // 變量配置 vars: { 'locale': 'zh-cn' } });
seajs.use('dom',function(d){ //=> 加載的是 http://127.0.0.1:8020/seajs-master/dome/dom.js d.d(); });
別名起到了變量的做用,'dom'表明'domes/dome/dom','domes'表明'http://127.0.0.1:8020/seajs-master' 則'domes/dome/dom'解析爲http://127.0.0.1:8020/seajs-master/dome/dom.js。函數
變量配置工具
define(function(require, exports, module){ // 獲取模塊 dom_1 的接口 var som=require('./dom/{locale}.js'); //加載的地址http://127.0.0.1:8020/seajs-master/dome/dom/zh-cn.js som.s(); exports.dom_2=function(){ console.log("dom_2"); }; });
{locale}就表明'zh-cn'
2.seajs.use
// 加載一個模塊 seajs.use('./a'); // 加載一個模塊,在加載完成時,執行回調 seajs.use('./a', function(a) { a.doSomething(); }); // 加載多個模塊,在加載完成時,執行回調 seajs.use(['./a', './b'], function(a, b) { a.doSomething(); b.doSomething(); });
3.define--用來定義模塊
define(id?, deps?, factory)
也能夠接受兩個以上參數。字符串 id 表示模塊標識,數組 deps 是模塊依賴。好比:
define('hello', ['jquery'], function(require, exports, module) {
});
id 和 deps 參數能夠省略。省略時,能夠經過構建工具自動生成。
注意:帶 id 和 deps 參數的 define 用法不屬於 CMD 規範,而屬於 Modules/Transport 規範。
define(function(require, exports, module) { //exports 用來在模塊內部對外提供接口。 // 對外提供 foo 屬性 exports.foo = 'bar'; // 對外提供 doSomething 方法 exports.doSomething = function() {}; //注意:require, exports, module這三個回掉函數參數切勿改變。 });
4.require--用來獲取指定模塊的接口
//注意,require 只接受字符串直接量做爲參數,詳細約定請閱讀 //require.async 用來在模塊內部異步加載一個或多個模塊。 define(function(require) { // 獲取模塊 a 的接口 var a = require('./a'); // 調用模塊 a 的方法 a.doSomething(); // 異步加載多個模塊,在加載完成時,執行回調 require.async(['./c', './d'], function(c, d) { c.doSomething(); d.doSomething(); }); });
5.exports--用來在模塊內部對外提供接口
define(function(require, exports, module) { //exports 用來在模塊內部對外提供接口。 // 對外提供 foo 屬性 exports.foo = 'bar'; // 對外提供 doSomething 方法 exports.doSomething = function() {}; //注意:require, exports, module這三個回掉函數參數切勿改變。 });
6.module.exports--用來在模塊內部對外提供接口
define(function(require, exports, module) { // 對外提供接口 module.exports = { name: 'a', doSomething: function() {}; }; });
與 exports 相似,用來在模塊內部對外提供接口。
7.require.resolve(id)--用來獲取指定模塊的絕對路徑
define(function(require, exports, module){ // 獲取模塊 dom_1 的接口 var som=require('./dom_2'); console.log(require.resolve('./dom_2'),'用來獲取指定模塊的絕對路徑'); });
這個能夠用來檢測你加載模塊時候,路徑是否正確。
做者:玉伯
連接:https://www.zhihu.com/question/20351507/answer/14859415
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
參考:https://github.com/seajs/seajs/issues/242
參考:https://github.com/amdjs/amdjs-api/wiki/AMD
參考:https://github.com/seajs/seajs/issues/266
參考:http://yslove.net/seajs/
amd與cmd是一種規範,而目前兩大加載器(seajs,requirejs)應用的規範是不一樣的。cmd推薦的是依賴就近原則,用到就加載。而amd則是依賴前置。只有加載纔可使用。相對於來講cmd比較符合使用習慣。