避免第三方AMD模块内的全局对象污染

时间:2013-04-26 00:05:58

标签: requirejs javascript amd js-amd

我有第三方模块,加载了requirejs。在其定义中,每个模块都需要加载一些所需的库(本地模块)。

// 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 */
}

如果不可能,我该怎么做才能避免全球环境污染?

请注意我无法更改模块的代码。

0 个答案:

没有答案