我有第三方模块,加载了requirejs。每个模块,在它的定义中,调用 require 来加载它需要的一些库(模块本地的)。
// SAMPLE MODULE
define(['require'], function(require) {
function init (args) {
require ([./somelibrary], function { /* ... */ });
}
return (initFunc: init);
}
该模块完美地独立工作。但是如果我尝试加载多个模块,它们可以加载同一个非 amd 库的不同版本。让我们举个例子:
如果somelibrary
在窗口对象中设置一个全局名称,例如在window.somelibrary = some_library_code
. 如果 module1 加载 somelibrary0.1 而 module2 在不久之后加载 somelibrary0.2,则 module1 使用 somelibrary0.2 结束,这是不好的。
考虑到我无法更改模块的工作方式,是否有一种方法可以“欺骗”要求我创建不同的窗口对象?像这样:
require ([module1, module2], function (mod_1, mod_2) {
// LOAD MODULE 1
var fakeWindow1 = {}
/* do the magic */
mod_1.init ();
/* somelibrary required by module1 ends up in fakeWindow1.somelibrary */
// LOAD MODULE 2
var fakeWindow2 = {}
/* do the magic */
mod_2.init ();
/* somelibrary required by module2 ends up in fakeWindow2.somelibrary */
}
如果这不可能,我该怎么做才能避免全局上下文污染?
请注意我不能更改模块的代码。