AMD 的好处是拥有一个模块系统,类似于其他语言中的命名空间系统。在 JavaScript 中,我们经常使用全局变量来伪造它,但模块提供了许多特定的好处:
为这些模块提供顶级范围的隐私,方便从其他模块导入单例对象,以及导出它们自己的 API。
--- 来自CommonJS Modules/1.1.1 spec,这一切都开始了。
这里的关键是进出口设施。以前每个人都在使用全局变量(如window.jQuery、window._ 等)来临时执行此操作。要了解 jQuery 的导出功能,您必须知道魔术名称,希望没有人与之冲突,并确保 jQuery 脚本在您的脚本之前加载。没有办法以声明方式指定您对 jQuery 的依赖,并且 jQuery 无法说“这是我导出的”,除了将它们填充到全局 window.jQuery 对象中。
模块格式解决了这个问题:每个模块都导出特定的功能,例如
// math.js
define(function (require, exports, module) {
exports.add = function (a, b) { return a + b; };
});
每个模块都可能需要特定的其他模块,例如
// perimeter.js
define(function (require, exports, module) {
var math = require("math");
exports.square = function (side) {
return math.add(math.add(side, side), math.add(side, side));
};
});
关于为什么 AMD 应该成为首选的模块系统,RequireJS 的作者——一个与 Dojo 非常相似的 AMD 加载程序——的作者 James Burke 写了 a blog post detailing why he thinks AMD is the best。