非同步模組定義(AMD)
AMD 是一個模組定義系統,試圖解決其他系統(如 CommonJS 和匿名閉包)的一些常見問題。
AMD 解決了這些問題:
- 通過呼叫
define()
來註冊工廠函式,而不是立即執行它 - 將依賴項作為模組名稱陣列傳遞,然後載入,而不是使用全域性變數
- 只有在載入並執行了所有依賴項後才執行工廠函式
- 將依賴模組作為引數傳遞給工廠函式
這裡的關鍵是模組可以具有依賴性,並且在等待載入時不會保留所有內容,而開發人員不必編寫複雜的程式碼。
以下是 AMD 的一個例子:
// Define a module "myModule" with two dependencies, jQuery and Lodash
define("myModule", ["jquery", "lodash"], function($, _) {
// This publicly accessible object is our module
// Here we use an object, but it can be of any type
var myModule = {};
var privateVar = "Nothing outside of this module can see me";
var privateFn = function(param) {
return "Here's what you said: " + param;
};
myModule.version = 1;
myModule.moduleMethod = function() {
// We can still access global variables from here, but it's better
// if we use the passed ones
return privateFn(windowTitle);
};
return myModule;
});
模組也可以跳過名稱並匿名。完成後,它們通常按檔名載入。
define(["jquery", "lodash"], function($, _) { /* factory */ });
他們也可以跳過依賴:
define(function() { /* factory */ });
一些 AMD 載入器支援將模組定義為普通物件:
define("myModule", { version: 1, value: "sample string" });