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