RequireJS 和 window.define() 冲突
RequireJS and window.define() conflict
我正在开发一个聊天框插件(实时聊天应用程序的一部分),它将被注入到我的用户网站上。我使用 RequireJS 加载和 运行 插件。目前,我遇到了一个新用户的问题。在其网站上的图书馆中,其中一个将 "window.define" 定义为特定功能(与我的目的无关)。
问题是:在加载时,RequireJS 在全局范围内定义了三个名称,包括 "define"。所以当我加载我的插件时(使用 RequireJS,我的主模块作为 data-main 属性的值),我的代码实际上没有加载,因为关于 "define".
的冲突
是否有适当的方法来控制这三个声明的名称,以避免此类冲突?我知道我可以更改 RequireJS 模块中的代码来定义类似 "requirejsMyApp" / "defineMyAppy" 的东西并且保持安静......但这并不是一个正确的方法。
感谢您的帮助。
您可以按照 and use namespace
. Here is the example build config from the FAQ on the subject 中 gillesc 的建议进行操作:
{
appDir: "../",
baseUrl: "scripts",
dir: "../../appdirectory-build",
paths: {
requireLib: 'require'
},
//Indicates the namespace to use for require/requirejs/define.
namespace: "foo",
modules: [
{
name: "foo",
include: ["requireLib", "main"],
create: true
}
]
}
requireLib
位是为了将 RequireJS 包含到包中。包含 RequireJS 的 module 必须命名为 require
以外的名称,因为模块名称 require
是保留的。一旦您完成了上述构建,您只需加载构建的输出 而不是 加载 RequireJS(因为 RequireJS 包含在构建中)。请务必阅读常见问题解答以了解注意事项。
也就是说,如果您的用例场景可以忍受 Almond 的限制,我会改用 Almond。它是一个替代 RequireJS 的加载器。它比 RequireJS 更小,并且可以同步加载代码。因此,当您构建捆绑包并使用 script
元素加载它时,如下所示:
<script src="/path/to/bundle.js"></script>
您可以确定,当浏览器处理完 script
元素时,您的包中的代码可用于后面的其他代码。如果您使用 RequireJS 构建 bundle,并使用如前所示的构建配置并加载 bundle,则无法知道代码何时准备好使用,因为 RequireJS always 加载模块异步地。 (是的,即使所有模块都存在并且 RequireJS 不需要去网络:加载 将 是异步的。)
我正在开发一个聊天框插件(实时聊天应用程序的一部分),它将被注入到我的用户网站上。我使用 RequireJS 加载和 运行 插件。目前,我遇到了一个新用户的问题。在其网站上的图书馆中,其中一个将 "window.define" 定义为特定功能(与我的目的无关)。
问题是:在加载时,RequireJS 在全局范围内定义了三个名称,包括 "define"。所以当我加载我的插件时(使用 RequireJS,我的主模块作为 data-main 属性的值),我的代码实际上没有加载,因为关于 "define".
的冲突是否有适当的方法来控制这三个声明的名称,以避免此类冲突?我知道我可以更改 RequireJS 模块中的代码来定义类似 "requirejsMyApp" / "defineMyAppy" 的东西并且保持安静......但这并不是一个正确的方法。
感谢您的帮助。
您可以按照 namespace
. Here is the example build config from the FAQ on the subject 中 gillesc 的建议进行操作:
{
appDir: "../",
baseUrl: "scripts",
dir: "../../appdirectory-build",
paths: {
requireLib: 'require'
},
//Indicates the namespace to use for require/requirejs/define.
namespace: "foo",
modules: [
{
name: "foo",
include: ["requireLib", "main"],
create: true
}
]
}
requireLib
位是为了将 RequireJS 包含到包中。包含 RequireJS 的 module 必须命名为 require
以外的名称,因为模块名称 require
是保留的。一旦您完成了上述构建,您只需加载构建的输出 而不是 加载 RequireJS(因为 RequireJS 包含在构建中)。请务必阅读常见问题解答以了解注意事项。
也就是说,如果您的用例场景可以忍受 Almond 的限制,我会改用 Almond。它是一个替代 RequireJS 的加载器。它比 RequireJS 更小,并且可以同步加载代码。因此,当您构建捆绑包并使用 script
元素加载它时,如下所示:
<script src="/path/to/bundle.js"></script>
您可以确定,当浏览器处理完 script
元素时,您的包中的代码可用于后面的其他代码。如果您使用 RequireJS 构建 bundle,并使用如前所示的构建配置并加载 bundle,则无法知道代码何时准备好使用,因为 RequireJS always 加载模块异步地。 (是的,即使所有模块都存在并且 RequireJS 不需要去网络:加载 将 是异步的。)