Use AMD defined module within 3rd party, non-AMD library(在第三方非AMD库中使用AMD定义的模块)
问题描述
我有一个库-称为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'
}
});
然后我有另一个第三方库-称为AnotherLib-它在内部使用SomeLib,如
var the Lib = new SomeLib(...);
这意味着SomeLib
必须全局可用。
AnotherLib只是一个普通的JavaScript模块函数
(function(){
// the code
})();
它与特定的模块加载器不兼容。
当我将AnotherLib包含在RequireJS中时,我会执行如下操作
require.config({
paths: {
'theLibrary: '../path/to/the/lib',
'anotherLib: '../path/to/anotherLib'
},
shim: {
'anotherLib: [
'theLibrary'
]
}
});
问题是我在AnotherLib中实例化SomeLib(new SomeLib(...)
)的那一行上得到了一个未定义的异常。
这是因为SomeLib未在全局对象上定义,而是发布为AnotherLib不"需要"的AMD模块。
我是否可以以某种方式解决此问题,或者AnotherLib是否必须符合AMD并正确要求SomeLib。
AMD
最好的方法是获得一个符合推荐答案的库,或者使该库符合amd。后一种选择需要手动修改源代码,或者执行一个构建步骤,将不符合AMD的代码转换为真正的AMD模块。如何执行此操作取决于库的设计方式。
适用于任何库的一种方法是故意将库需要的符号泄漏到全局空间:
使
anotherLib
依赖于可以称为SomeLib-leak
的新模块。创建新模块。此定义不必位于单独的文件中。我通常在调用
require.config
之前放置这样的"粘合"模块。该模块将如下所示:define('SomeLib-leak', ['SomeLib'], function (SomeLib) { window.SomeLib = SomeLib; });
我确实特意让
/li>define
在这里设置了模块名称。通常,您不希望调用hasdefine
设置模块名称,但是对于像我上面指出的那样放置的"粘合"模块,这是必要的。
加载anotherLib
时,SomeLibrary
将进入全局空间。
这篇关于在第三方非AMD库中使用AMD定义的模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在第三方非AMD库中使用AMD定义的模块
- 失败的 Canvas 360 jquery 插件 2022-01-01
- 400或500级别的HTTP响应 2022-01-01
- Fetch API 如何获取响应体? 2022-01-01
- Css:将嵌套元素定位在父元素边界之外一点 2022-09-07
- 使用RSelum从网站(报纸档案)中抓取多个网页 2022-09-06
- 如何使用 JSON 格式的 jQuery AJAX 从 .cfm 页面输出查 2022-01-01
- Flexslider 箭头未正确显示 2022-01-01
- Quasar 2+Apollo:错误:找不到ID为默认的Apollo客户端。如果您在组件设置之外,请使用ProvideApolloClient() 2022-01-01
- addEventListener 在 IE 11 中不起作用 2022-01-01
- CSS媒体查询(最大高度)不起作用,但为什么? 2022-01-01