Javascript 在第三方非AMD库中使用AMD定义的模块
我有一个库-称之为SomeLib-它被定义为支持各种模块加载器: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
(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
在此处设置模块名称。通常,您不希望调用havedefine
设置模块名称,但对于像上面所述那样放置的“粘合”模块,这是必要的在加载另一个库时,
SomeLibrary
将进入全局空间。这也是我的想法……目前正在与JS库的作者讨论(1)。(2) 这是一个可能的解决办法,虽然不是很好。Thx很多