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 不需要去网络:加载 是异步的。)