将嵌套模块与require.js优化器结合使用

时间:2013-02-09 02:47:54

标签: javascript requirejs amd r.js

我有以下内容。

require([ 'a', 'b' ], function() {     
   if(x){
       require([ 'c', 'd' ], function( ) {});
   }   
});

c将始终加载d。是否有优化器优化cd以便它们作为一个文件加载?

编辑:

我也使用r.js作为优化器。我的构建脚本的模块看起来像这样。

modules: [
    {
        name: "main",
    },
    {
        name: "c",
            include: ["d"]
    }
] 

这将包括d中的c,但cd仍在运行时加载。

2 个答案:

答案 0 :(得分:2)

r.js(我假设你的意思是“优化器”)不会触及cd,除非你明确要求[“你可以始终使用 include 选项明确添加通过优化程序静态分析找不到的模块。“ - 来自RequireJS docs]。如果你这样做,他们将最终进入优化输出,并将在运行时与ab及其余代码一起加载(即使x为{{1}永远不会到达false块。

如果不这样做,require将跳过该块,r.js将仅在运行时解析RequireJSc(如果d为{{ 1}}),当进行任何优化或连接时为时已晚。

RE:编辑

在[{1}}中强制包含xtrue的正确方法是:

c

这意味着:“明确要求包含所有内容d,但也要添加main modules: [ { name: "main", include: ["c", "d"] } ]

RE:评论:

哦,你说对了,你的配置也会创建一个包含main.jsc.js的优化d.js,但c.js会加载'standalone'{{ 1}}无论如何。奇怪的是,它仍将使用优化文件中的c,甚至不会评估独立d(通过编辑优化RequireJSd的内容进行检查。我猜RequireJS会立即请求所有列出的依赖项,因为它无法知道加载d会使d.js依赖性得到满足(这只在模块加载和处理后才知道)。这是有道理的,因为唯一的另一个选择是逐个请求文件 - 这将是一个瓶颈。

答案 1 :(得分:1)

我得到了答案here

您可以在制作中设置路径映射,以通知RequireJS d位于c

简单地说:

paths: {
  'd': 'c'
}