非同步模組定義(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" });