AMD的主要优点之一是它应该防止全局命名空间污染。它可以通过不将任何模块名称附加到全局对象来实现这一点,但模块名称存储在内部。如果每个人都要采用AMD和模块加载器,那么"定义"现在实际上是全局对象。
像这样寻找构建的"优化"文件:
define("app/modA", [], { /**/ }),
define("app/modC", [], { /**/ }),
define("app/modB", ["app/modC"], { /**/ }),
define("app/app", ["app/modA", "app/modB"], { /**/ }),
require(["app/app"], { /**/ }),
define("main", function () {});
如果此文件包含在已经具有相同名称模块的较大代码库中,该怎么办?
您可以将命名空间选项传递给 r.js,它会输出如下内容:
foo.define("app/modA" ...
但是现在你有一个全球foo?这与使用单个全局对象文字作为命名空间和封装、模块模式等有何不同?
在配置中设置wrap: true
。现在,当您使用 r 进行编译时.js您的define
将不再位于全局命名空间中,并且您的任何模块名称都不会与页面上包含的其他文件中的任何其他模块定义冲突。