异步模块定义(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" });