gpt4 book ai didi

javascript - 在第 3 方、非 AMD 库中使用 AMD 定义的模块

转载 作者:行者123 更新时间:2023-11-29 21:54:31 26 4
gpt4 key购买 nike

我有一个库 - 称之为 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'
}
});

然后我有另一个第 3 方库 - 称之为 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 模块的构建步骤。如何做到这一点取决于库的设计方式。

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

  1. 使 anotherLib 依赖于一个新模块,您可以将其称为 SomeLib-leak

  2. 创建新模块。此定义不必位于单独的文件中。我通常在调用 require.config 之前放置此类“胶水”模块。该模块将是这样的:

    define('SomeLib-leak', ['SomeLib'], function (SomeLib) {
    window.SomeLib = SomeLib;
    });

    我特意让 define 在这里设置模块名称。通常,您不想调用 have define 设置模块名称,但对于像我上面指出的那样放置的“胶水”模块,这是必要的。

anotherLib 加载时,SomeLibrary 将在全局空间中。

关于javascript - 在第 3 方、非 AMD 库中使用 AMD 定义的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27154030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com