Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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-在require流和内联流中加载AMD模块_Javascript_Asynchronous_Module_Requirejs_Inline - Fatal编程技术网

Javascript RequireJS-在require流和内联流中加载AMD模块

Javascript RequireJS-在require流和内联流中加载AMD模块,javascript,asynchronous,module,requirejs,inline,Javascript,Asynchronous,Module,Requirejs,Inline,考虑这一点: <script src='global.js'></script> <script src='require.js'></script> <script> require(['modular_foo'], function() { //do stuff }); 其中modular_foo和modular_bar都是匿名定义的AMD模块。使用requireJS,加载类似于上面的内容会给您带来我们最喜欢的错误 关于错误发

考虑这一点:

<script src='global.js'></script>
<script src='require.js'></script>
<script>
require(['modular_foo'], function() {
  //do stuff
});
其中modular_foo和modular_bar都是匿名定义的AMD模块。使用requireJS,加载类似于上面的内容会给您带来我们最喜欢的错误

关于错误发生的原因(如果你想知道的话,请阅读该页),这已经足够好了,但问题是,如果你无法摆脱这种情况,该怎么办

我在一个已建立的平台上工作,该平台正在逐渐迁移到RJS流,因为现在没有办法同时使用内联遗留脚本(其中一些脚本有AMD检查来触发define())和我们的requireJS入口点

在某些情况下,我可以简单地将内联AMD兼容脚本放在require.js库的加载之上,但当您需要根据DOM内容异步加载其他内容(modular_bar.js)时,这不起作用。我也可以注释掉从外部加载到RJ的文件中的所有AMD检查,但这防止了它们与模块化流程中加载的文件不兼容


有没有人有过类似的经历?如何混合流程以克服此类冲突?

我没有在生产环境中使用此解决方案的经验,但我花了几天时间研究这个问题,以找出解决此问题的最佳方法

您可以使用一个修改过的RequireJS库,该库不允许匿名
定义
,如果它被传递的话。另外,您可以通过删除下面代码段中
name
上字符串的类型检查来禁止任何
define
调用

以下代码段是对RequireJS的修改,如果被
eval
调用,它将忽略匿名定义。你可以找到那个

该代码依赖于。如果您不能在RequireJS之前包含该库,我建议将其连接到文件的顶部

//这是RequireJS的一个片段
// ...
定义=函数(名称、deps、回调){
var节点,上下文;
//我们将允许使用'eval'定义命名模块`
if(!(typeof name='string'| | name instanceof string))
{
var stack=parseStack(新错误());
//如果我们在堆栈中找到任何eval,请不要定义模块
//这是为了避免“不匹配的匿名define()模块”错误
//由于在没有requireJS的情况下执行匿名定义而导致
对于(var i=0;i
//global.js
$.getScript("modular_bar.js");
// This is a snippet of RequireJS
// ...
define = function (name, deps, callback) {
    var node, context;

    // We will allow named modules to be defined by `eval`
    if (!(typeof name == 'string' || name instanceof String))
    {
        var stack = parseStack(new Error());

        // If we find any eval in the stack, do not define the module
        // This is to avoid the "Mismatched anonymous define() module" error
        // Caused by executing an anonymous define without requireJS
        for(var i = 0; i < stack.length; i++)
        {
            if(stack[i].name == "eval")
            {
                return;
            }
        }
    }

    // ...