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?与使用单个全局对象文字作为命名空间和封装,模块模式等有何不同?
答案 0 :(得分:0)
在您的配置中设置wrap: true
。现在,当您使用r.js进行编译时,define
将不再位于全局命名空间中,并且您的模块名称都不会与页面上包含的其他文件中的任何其他模块定义冲突。