Javascript 在第三方非AMD库中使用AMD定义的模块

Javascript 在第三方非AMD库中使用AMD定义的模块,javascript,requirejs,Javascript,Requirejs,我有一个库-称之为SomeLib-它被定义为支持各种模块加载器: (function(global, factory) { if (typeof define === 'function' && define.amd) { define([], factory); } else if (typeof module !== 'undefined' && module.exports) { module.exports

我有一个库-称之为SomeLib-它被定义为支持各种模块加载器:

(function(global, factory) {
    if (typeof define === 'function' && define.amd) {
        define([], factory);
    } else if (typeof module !== 'undefined' && module.exports) {
        module.exports = factory();
    } else {
        global.UriTemplate = factory();
    }
})(this, function() {
   ...
   // returns constructor function
});
我可以很容易地用RequireJS加载它,比如

require.config({
  paths: {
    'theLibrary: '../path/to/the/lib'
  }
});
然后我有另一个第三方库,称之为另一个库,它在内部使用类似

var the Lib = new SomeLib(...);
这意味着
SomeLib
必须在全球范围内可用

AnotherLib只是一个普通的JavaScript模块函数

(function(){
  // the code
})();
它不符合特定的模块加载程序

当我在RequireJS中包含另一个库时,我会执行以下操作

require.config({
  paths: {
    'theLibrary: '../path/to/the/lib',
    'anotherLib: '../path/to/anotherLib'
  },
  shim: {
     'anotherLib: [
        'theLibrary'
     ]
  }
});
问题是,我在另一个库中的行上得到了一个未定义的异常,它实例化了SomeLib(
newsomelib(…)
)。 这是因为SomeLib不是在全局对象上定义的,而是作为AMD模块发布的,而另一个库并不“需要”


我能以某种方式解决这个问题吗,或者另一个库必须是AMD兼容的,并且正确地需要一些库。

最好的办法是获得一个AMD兼容库,或者使库与AMD兼容。后一种选择需要手动修改源代码,或者使用构建步骤将不符合AMD的代码转换为真正的AMD模块。如何做到这一点取决于库的设计方式

一种适用于任何库的方法是故意将库所需的符号泄漏到全局空间:

  • 使
    anotherLib
    依赖于一个新模块,您可以调用
    SomeLib-leak

  • 创建新模块。此定义不必位于单独的文件中。我通常在调用
    require.config
    之前放置这样的“粘合”模块。模块如下所示:

    define('SomeLib-leak', ['SomeLib'], function (SomeLib) {
        window.SomeLib = SomeLib;
    });
    
    我确实有意让
    define
    在此处设置模块名称。通常,您不希望调用have
    define
    设置模块名称,但对于像上面所述那样放置的“粘合”模块,这是必要的


  • 在加载另一个库时,
    SomeLibrary
    将进入全局空间。

    这也是我的想法……目前正在与JS库的作者讨论(1)。(2) 这是一个可能的解决办法,虽然不是很好。Thx很多