我有以下内容。
require([ 'a', 'b' ], function() {
if(x){
require([ 'c', 'd' ], function( ) {});
}
});
c
将始终加载 d
。有没有办法让优化器优化 c
和 d
以便它们作为一个文件加载?
编辑:
我还使用 r.js 作为优化器。我的构建脚本的模块看起来像这样。
modules: [
{
name: "main",
},
{
name: "c",
include: ["d"]
}
]
这将在 c
中包含 d
,但 c
和 d
仍会在运行时加载。
最佳答案
除非你明确要求它 [“您始终可以使用 include 选项明确添加通过优化器的静态分析找不到的模块。” - 来自 RequireJS docs ].如果这样做,它们将最终出现在优化输出中,并将在运行时与 a
和 b
以及其余代码一起加载(即使 x
为 false
并且永远不会到达 require
block )。
如果不这样做,r.js
将跳过该 block ,RequireJS
将仅解析 c
和 d
在运行时(如果 x
为 true
),此时进行任何优化或连接都为时已晚。
回复:编辑
在 main
中强制包含 c
和 d
的正确方法是:
modules: [ {
name: "main",
include: ["c", "d"]
} ]
这意味着:“包括 main.js
显式要求的所有内容,但还添加 c.js
和 d.js
”
回复:评论:
哦,你是对的,你的配置还将创建一个优化的 c.js
,其中包括 c
和 d
但 RequireJS
无论如何都会加载“独立”d
。奇怪的是,它仍然会使用优化文件中的 d
,甚至不会评估独立的 d.js
(通过编辑优化的 c.js 的内容进行检查
和 d.js
)。我猜 RequireJS 会立即请求所有列出的依赖项,因为它无法知道加载 c
是否会满足 d
依赖项(这只有在加载和处理模块后才知道) .这是有道理的,因为唯一的其他选择是按顺序逐个请求文件 - 这将成为瓶颈。
关于javascript - 将嵌套模块与 require.js 优化器结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14784424/