1

我有以下。

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

c将始终加载d. 有没有办法让优化器优化cd以便它们作为一个文件加载?

编辑:

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

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

这将包括din c,但两者cd仍然在运行时加载。

4

2 回答 2

2

r.js(我假设这就是您所说的“优化器”的意思)不会触及cd除非您明确要求它 [ “您始终可以使用include选项明确添加通过优化器的静态分析找不到的模块。” - 来自RequireJS 文档]。如果你这样做,它们最终会出现在优化的输出中,并将在运行时与ab其他代码一起加载(即使xfalse并且require永远不会到达块)。

如果你不这样做,r.js将跳过该块,并且RequireJS只会在运行时解析cd(如果xtrue),当进行任何优化或连接为时已晚时。

回复:编辑

强制 includecdin的正确方法main是:

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

这意味着:“包括所有main.js需要明确但还添加c.jsd.js

回复:评论:

哦,你是对的,你的配置也将创建一个c.js包含两者的优化,cd无论如何都会RequireJS加载“独立” 。d奇怪的是,它仍然会使用d优化后的文件,甚至不会评估独立文件d.js(通过编辑优化c.js和的内容进行检查d.js)。我猜 RequireJS 会立即请求所有列出的依赖项,因为它无法知道加载c将满足d依赖项(这只有在加载和处理模块后才知道)。这是有道理的,因为唯一的其他选择是依次请求文件,一个接一个 - 这将是一个瓶颈。

于 2013-02-09T13:52:57.880 回答
1

我在这里得到了答案

您可以在生产环境中设置路径映射以通知d位于c.

只需这样做:

paths: {
  'd': 'c'
}
于 2013-02-11T20:08:53.977 回答