AMD 即
Asynchronous Module Definition
,中文名是“異步模塊定義”的意思。它是一個在瀏覽器端模塊化開發的規范,服務器端的規范是CommonJS。
模塊將被異步加載,模塊加載不影響后面語句的運行。所有依賴某些模塊的語句均放置在回調函數中。
AMD
是 RequireJS
在推廣過程中對模塊定義的規范化的產出。
define() 函數
AMD規范只定義了一個函數 define
,它是全局變量。函數的描述為:
define(id?, dependencies?, factory);
id:指定義中模塊的名字,可選;如果沒有提供該參數,模塊的名字應該默認為模塊加載器請求的指定腳本的名字。如果提供了該參數,模塊名必須是“頂級”的和絕對的(不允許相對名字)
。
模塊名的格式
模塊名是用正斜杠分割的有意義單詞的字符串 單詞須為駝峰形式,或者".",".." 模塊名不允許文件擴展名的形式,如“.js” 模塊名可以為 "相對的" 或 "頂級的"。如果首字符為“.”或“..”則為相對的模塊名 頂級的模塊名從根命名空間的概念模塊解析 相對的模塊名從 "require" 書寫和調用的模塊解析
模塊名用來唯一標識定義中模塊,它們同樣在依賴性數組中使用:
依賴dependencies:是一個當前模塊依賴的,已被模塊定義的模塊標識的數組字面量。 依賴參數是可選的,如果忽略此參數,它應該默認為["require", "exports", "module"]。然而,如果工廠方法的長度屬性小於3,加載器會選擇以函數的長度屬性指定的參數個數調用工廠方法。
工廠方法factory:模塊初始化要執行的函數或對象。依賴模塊必須根據模塊的工廠方法優先級執行,並且執行的結果應該按照依賴數組中的位置順序以參數的形式傳入(定義中模塊的)工廠方法中。如果為函數,它應該只被執行一次。如果是對象,此對象應該為模塊的輸出值。
例子
創建一個名為"alpha"的模塊,使用了require,exports,和名為"beta"的模塊:
define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {
exports.verb=function() {
return beta.verb();
//Or:returnrequire("beta").verb();
}
});
一個返回對象的匿名模塊:
define(["alpha"], function (alpha) {
return {
verb:function(){
return alpha.verb() +2;
}
};
});
一個沒有依賴性的模塊可以直接定義對象:
define({
add:function(x, y){
return x + y;
}
});
一個使用了簡單CommonJS轉換的模塊定義:
define(function (require, exports, module) {
var a =require('a'),
b =require('b');
exports.action=function () {};
});
require API
介紹: https://github.com/amdjs/amdjs-api/wiki/require
AMD
規范中文版:https://github.com/amdjs/amdjs-api/wiki/AMD-(%E4%B8%AD%E6%96%87%E7%89%88)
目前,實現AMD的庫有RequireJS 、curl 、Dojo 、Nodules
等。