Javascript 动态加载require.js的依赖项

Javascript 动态加载require.js的依赖项,javascript,requirejs,Javascript,Requirejs,我正在使用require.js加载项目上的依赖项。差不多 var deps = []; if( some condition ) deps = [dep1, dep2, ...] else deps = [other1, other2, ...] define(deps, function(arg1, arg2, ....){ }); 这对我来说很好。问题是,当我缩小代码时,我遇到以下问题: Uncaught Error: Mismatched anonymous defin

我正在使用require.js加载项目上的依赖项。差不多

var deps = [];
if( some condition )
    deps = [dep1, dep2, ...]
else
    deps = [other1, other2, ...]
define(deps, function(arg1, arg2, ....){

});
这对我来说很好。问题是,当我缩小代码时,我遇到以下问题:

Uncaught Error: Mismatched anonymous define() module: function (e,t.....

任何知道解决办法的人,请帮我解决。提前感谢。

r.js将从阵列中检测要包含的DEP,但是如果DEP像您的情况一样是动态的,则不会被检测到


对于动态DEP,您可以配置build.js文件,使其包含模块所需的动态DEP

假设以下代码

main.js

var x = 1;
var deps=[];
if(x > 0){
    deps = ['.\mod1'];
}
else{
    deps = ['.\mod2'];
}
define(deps, function(x){
    return x * 10;
});
mod1.js

define([], function(){
    return 5;
});
mod2.js

define([], function(){
    return 10;
});
r、 js不会在main中包含mod1和mod2,因为它们不清楚dep,所以我们必须指示r.js mod1和mod2可能是main的dep,我们在build.js中这样做

build.js

({
    paths: {
    },
    shim: {
    },
    baseUrl: "app",
    removeCombined: true,
    findNestedDependencies: true,
    inlineText: true,
    optimizeAllPluginResources: true,
    stubModules: ['text'],
    dir: "app-dist",
    modules: [
        {
            name: "main",
            include: ["mod1","mod2"]
        }
    ]
})
通过此设置,我们指示r.js将mod1和mod2与main.js一起包含

希望这是问题的症结所在 RequireJS的优化器无法对运行时生成的依赖项执行依赖项分析。它至少能够以一种镜像运行时发生的情况的方式执行代码,并且仍然存在它无法处理的情况。因此,要使RequireJS的依赖关系分析成功,依赖关系必须是字符串的文本数组。在任何其他情况下,RequireJS都将无法执行分析,并且会默默地失败

在您的情况下,这有两个后果:

  • 优化器实际上并没有给您的模块命名。这解释了不匹配的匿名define()模块

    优化器的功能之一是为模块提供最终名称。因此,您放入
    main.js
    中的模块(例如,当它尚未优化时)将被转换,以便将其定义为
    define(“main”),…
    。优化器将名称添加到
    define
    调用的开头。(仅当模块尚未命名时才会这样做。)

    你怎么知道你的模块没有被优化器命名呢?除了错误消息(这是一条主要线索)之外,如果你看看
    r.js
    产生了什么,你会发现你的模块被定义为
    define(deps,function
    。注意模块的第一个参数不是它的名称

    在它后面还会看到一个存根。只有当模块的代码不是实际的AMD类型模块时,才会出现此存根。例如,必须使用
    垫片配置的模块将具有这些存根。但是,您的模块不需要此存根

    无论如何,优化器是完全混乱的,没有正确命名模块

  • 优化器找不到模块的依赖项

  • 解决方案:调整构建 mfarouk已经提到了如何修改您的构建,以便处理上面的第二个结果。我只想提到的一般规则是:您必须明确地将优化器未命中的所有模块的并集放入模块的
    中。看起来是这样的:

    modules: [
        ...,
        {
            name: "mymodule",
            include: [dependency1, dependency2, ...]
        },
        ...
    ]
    
    其中
    dependency1
    等是
    deps
    数组中的依赖项

    要处理第一个结果,您需要额外的定制。我建议使用优化器的
    onBuildRead
    选项:

    onBuildRead: function (moduleName, path, contents) {
        if (moduleName !== "main")
            return contents;
    
        return contents.replace(/define\(deps/,
                                'define("' + moduleName + '",deps');
    }
    

    当优化器读取每个模块时,会调用此函数。当它读取
    main
    时,会修改
    define
    调用以添加模块名称。优化器随后会看到模块已命名,将不使用名称,并且不会生成假存根。

    r.js minifier将检测要从数组中包含的DEP,但是,如果DEP像您的案例一样是动态的,它将不会被检测到,因此我建议您需要检查DEP是否包含在最终的简化版本中,尝试制作一个简单的案例,然后美化它以重复检查结果感谢您的回复,看起来依赖项没有正确加载。它没有进入定义范围我可以像我的案例一样动态加载依赖项。感谢againfor dynamic deps,您可以将build.js文件配置为包含此动态deps,以及您需要的模块类模块:[{name:“main”,include:[“mod1”,“mod2”],}]我很清楚你的方法,请你提供一个链接或解释一点细节。