我正在开发一个聊天盒插件(实时聊天应用程序的一部分),它将被注入我的用户网站。我使用RequireJS来加载和运行插件。目前,我遇到了一个新用户的问题。在其网站上的图书馆中,其中一个将“window.define”定义为特定功能(与我的目的无关)。
问题是:在加载时,RequireJS在全局范围内定义了三个名称,包括“define”。因此,当我加载我的插件时(使用RequireJS,我的主模块作为data-main属性的值),我的代码实际上没有加载,因为有关“define”的冲突。
是否有正确的方法对这三个名字进行控制,以避免此类冲突?我知道我可以在RequireJS模块中更改代码来定义像“requirejsMyApp”/“defineMyAppy”这样的东西并保持安静......但这不是一个正确的方法。
感谢您的帮助。
答案 0 :(得分:1)
您可以执行gillesc在comment中建议的内容并使用namespace
。以下是FAQ on the subject:
{
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的模块必须以require
之外的其他名称命名,因为模块名称require
是保留的。一旦您使用上述内容完成了构建,您只需加载构建的输出而不是加载RequireJS(因为RequireJS包含在构建中)。请务必阅读常见问题解答。
话虽如此,如果您的用例场景可以使用Almond的限制,我会使用Almond。它是一个替换RequireJS的加载器。它小于RequireJS,它可以同步加载代码。因此,当您构建捆绑包并使用script
这样的元素加载它时:
<script src="/path/to/bundle.js"></script>
您可以确定,当浏览器完成处理script
元素时,您的包中的代码可用于后面的其他代码。如果使用如前所示的构建配置构建带有RequireJS的bundle并按上面的方式加载bundle,则无法确定代码何时可以使用,因为RequireJS 总是加载模块是异步的。 (是的,即使所有模块都存在且RequireJS不需要进入网络:加载将异步。)