RequireJS和window.define()冲突

时间:2015-04-14 09:28:57

标签: javascript requirejs

我正在开发一个聊天盒插件(实时聊天应用程序的一部分),它将被注入我的用户网站。我使用RequireJS来加载和运行插件。目前,我遇到了一个新用户的问题。在其网站上的图书馆中,其中一个将“window.define”定义为特定功能(与我的目的无关)。

问题是:在加载时,RequireJS在全局范围内定义了三个名称,包括“define”。因此,当我加载我的插件时(使用RequireJS,我的主模块作为data-main属性的值),我的代码实际上没有加载,因为有关“define”的冲突。

是否有正确的方法对这三个名字进行控制,以避免此类冲突?我知道我可以在RequireJS模块中更改代码来定义像“requirejsMyApp”/“defineMyAppy”这样的东西并保持安静......但这不是一个正确的方法。

感谢您的帮助。

1 个答案:

答案 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不需要进入网络:加载异步。)