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