Javascript 动态加载require.js的依赖项
我正在使用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
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都将无法执行分析,并且会默默地失败
在您的情况下,这有两个后果:
main.js
中的模块(例如,当它尚未优化时)将被转换,以便将其定义为define(“main”),…
。优化器将名称添加到define
调用的开头。(仅当模块尚未命名时才会这样做。)
你怎么知道你的模块没有被优化器命名呢?除了错误消息(这是一条主要线索)之外,如果你看看r.js
产生了什么,你会发现你的模块被定义为define(deps,function
。注意模块的第一个参数不是它的名称
在它后面还会看到一个存根。只有当模块的代码不是实际的AMD类型模块时,才会出现此存根。例如,必须使用垫片配置的模块将具有这些存根。但是,您的模块不需要此存根
无论如何,优化器是完全混乱的,没有正确命名模块
中。
看起来是这样的:
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”],}]我很清楚你的方法,请你提供一个链接或解释一点细节。