AMD 的好处是拥有模块系统,类似于其他语言中的命名空间系统。在 JavaScript 中,我们经常使用全局变量来伪造这一点,但模块具有许多特定的好处:
这些模块提供了其顶级范围的隐私、从其他模块导入单例对象以及导出自己的 API 的功能。
- - 来自CommonJS 模块/1.1.1 规范 http://wiki.commonjs.org/wiki/Modules/1.1.1,这一切开始了。
这里的关键是进出口设施。以前每个人都是用全局变量(比如window.jQuery
, window._
, ETC。)。要获得 jQuery 的导出功能,您必须知道这个神奇的名称,希望没有人与它发生冲突,并确保 jQuery 脚本在您的脚本之前加载。没有办法以声明方式指定对 jQuery 的依赖,并且 jQuery 也没有办法说“这就是我导出的”,除了将它们填充到全局变量中之外。window.jQuery
object.
模块格式解决了这个问题:每个模块导出特定的功能,例如
// 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 应成为首选模块系统,James Burke,作者要求JS http://requirejs.org/---AMD 加载器很像 Dojo --- 写的一篇博客文章详细说明了为什么他认为 AMD 是最好的 http://tagneto.blogspot.com/2011/04/on-inventing-js-module-formats-and.html.