1

我有第三方模块,加载了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 */
}

如果这不可能,我该怎么做才能避免全局上下文污染?

请注意我不能更改模块的代码。

4

0 回答 0