读了你的博文后我终于明白你的意图了。我对“顶级依赖项”这个词有点困惑。
您有两个模块(async-a
and async-b
)可以从任何地方按需加载(这里是一个模块main
)并且两者都有共享模块的引用(shared
).
- - -> on-demand-loading (i. e. System.import)
---> sync loading (i. e. import)
main - - -> async-a ---> shared
main - - -> async-b ---> shared
默认情况下,webpack 创建一个像这样的块树:
---> chunk uses other chunk (child-parent-relationship)
entry chunk [main] ---> on-demand chunk 1 [async-a, shared]
entry chunk [main] ---> on-demand chunk 2 [async-b, shared]
这很好,当shared
< async-a/b
或概率async-a
and async-b
同一用户同时使用的比例较低。这是默认设置,因为它是最简单的行为,并且可能是您所期望的:一System.import
=> 一大块。在我看来,这也是最常见的情况。
But if shared
>= async-a/b
以及概率async-a
and async-b
用户加载的数据量很高,有一个更有效的分块选项:(有点难以想象):
entry chunk [main] ---> on-demand chunk 1 [async-a]
entry chunk [main] ---> on-demand chunk 2 [async-b]
entry chunk [main] ---> on-demand chunk 3 [shared]
When main requests async-a: chunk 1 and 3 is loaded in parallel
When main requests async-b: chunk 2 and 3 is loaded in parallel
(chunks are only loaded if not already loaded)
这不是默认行为,但有一个插件可以将其存档:CommonChunkPlugin
在异步模式下。它在一堆块中找到公共/共享模块,并创建一个包含共享模块的新块。在异步模式下,它确实与原始(但现在更小)块并行加载新块。
new CommonsChunkPlugin({
async: true
})
// This does: (pseudo code)
foreach chunk in application.chunks
var shared = getSharedModules(chunks: chunk.children, options)
if shared.length > 0
var commonsChunk = new Chunk(modules: shared, parent: chunk)
foreach child in chunk.children where child.containsAny(shared)
child.removeAll(shared)
foreach dependency in chunk.getAsyncDepenendenciesTo(child)
dependeny.addChunk(commonsChunk)
请记住,CommonsChunkPlugin 有一个minChunks
定义模块何时线程化的选项shared
(随意提供自定义函数来选择模块)。
这是一个详细解释设置和输出的示例:https://github.com/webpack/webpack/tree/master/examples/extra-async-chunk https://github.com/webpack/webpack/tree/master/examples/extra-async-chunk
另一种配置更多:https://github.com/webpack/webpack/tree/master/examples/extra-async-chunk-advanced https://github.com/webpack/webpack/tree/master/examples/extra-async-chunk-advanced