Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在同一页面中加载两次时,requirejs冲突_Javascript_Requirejs - Fatal编程技术网

Javascript 在同一页面中加载两次时,requirejs冲突

Javascript 在同一页面中加载两次时,requirejs冲突,javascript,requirejs,Javascript,Requirejs,我正在将requirejs加载到如下页面: 然后,我在一个外部脚本的函数中有另一个requirejs代码,我正在加载到同一个页面中(因为它是一个使用requirejs的小部件)。问题是,第二个需求是从第一个需求获取配置。在我看来,全局范围存在冲突,我不理解,因为requirejs代码被封装到函数中 有问题吗 在不把事情搞砸的情况下,将requirejs加载两次到同一页面的最佳方式是什么?不要加载Require.js两次。如果您有一个内置AMD模块的库,那么它可以附带一个嵌入的ammond.js

我正在将requirejs加载到如下页面:

然后,我在一个外部脚本的函数中有另一个requirejs代码,我正在加载到同一个页面中(因为它是一个使用requirejs的小部件)。问题是,第二个需求是从第一个需求获取配置。在我看来,全局范围存在冲突,我不理解,因为requirejs代码被封装到函数中

有问题吗


在不把事情搞砸的情况下,将requirejs加载两次到同一页面的最佳方式是什么?

不要加载Require.js两次。如果您有一个内置AMD模块的库,那么它可以附带一个嵌入的ammond.js副本。Almond是为这种用途而设计的,它与Require.js由同一作者编写


这将允许您拥有全局级别的模块(由Require.js加载),这些模块本身可以在内部由内部/私有模块组成。

大约一年前,我实际上遇到了类似的问题

你需要的是requireJS的。在需要运行的页面上,弹出打开开发工具并键入以下内容:

require.s.contexts
您应该看到的是一个具有一个属性的对象,
:这是默认上下文。您需要的是运行两个完全独立的require实例或两个上下文。一小段示例代码,您可以使用以下代码替换当前的配置设置:

var requireContextOne = require.config({
    context: 'contextOne',
    baseUrl: 'whatever',
    /* THE REST OF YOUR FIRST CONFIG */
});

var requireContextTwo = require.config({
    context: 'contextTwo',
    baseUrl: 'whatever',
    /* THE REST OF YOUR SECOND CONFIG */
});

//Start both your contexts
(function(){
    //Remember to pass "require" as the first variable, otherwise you'll get all sorts of errors!
    requireContextOne(['require', 'topModule'], function(require, topModule){
        topModule.initialize();
    });

    //Your second context - even if you load the same module, it will be a separate "instance" from the one used in the first context
    requireContextTwo(['require', 'topModule'], function(require, topModule, anotherModule){
        topModule.initialize( anotherModule.start() );
    });
})();
现在,如果在控制台中运行
require.s.contexts
,您将看到有两个上下文:“contextOne”和“contextTwo”。此外,如果键入类似于
require.s.contexts.contextOne.defined
,则可以查看该特定上下文加载的所有模块

编辑了对@jplozano评论的建议回复

//Your widget's main file
define(function() {
    var widgetRequireContext = require.config({
        context: 'myWidget',
        baseUrl: 'whatever',
        /* THE REST OF YOUR WIDGET CONFIG */
    });

    //Note that I use "requirejs", not "require," to ensure we keep the reference to global variable
    widgetRequireContext(['require', 'submodule/a', 'submodule/b'], function(requirejs, subA, subB){
        /* THE REST OF YOUR MAIN MODULE CODE IS WRAPPED IN HERE */
    });
});

好的,我试试看。我忘了提到的一件事是,我对主要的需求完全没有控制权。我只能控制小部件的requirejs,因为它是我正在开发的。那么你的状态就不好了。你能再描述一下这个场景吗?我的直觉是,您可以在小部件的任何“主”模块(首先加载的模块)中创建上下文。我确实编辑了我的答案——不知道它是否有效,但试一试。天哪,那篇评论中的语法太糟糕了。我向英语道歉……别担心。我试过你的建议,但也没用。我用$.getScript加载依赖项,因为我不能在这上面再浪费时间了。仍然对RequireJS在全局范围内的工作方式感到失望。如果对您的项目有意义,请尝试浏览。它应该能够用一个工厂包装器导出一个带有单个IIFE的编译文件,然后由requireJS、commonJS、node等加载。我知道这很旧,但您还记得错误吗?不确定是否两次加载require。