有人可以解释 Webpack 的 CommonsChunkPlugin

Can someone explain Webpack's CommonsChunkPlugin

我得到了 CommonsChunkPlugin 查看所有入口点的一般要点,检查它们之间是否有共同点 packages/dependencies 并将它们分成自己的包。

那么,假设我有以下配置:

...
enrty : {
    entry1 : 'entry1.js', //which has 'jquery' as a dependency
    entry2 : 'entry2.js', //which has 'jquery as a dependency
    vendors : [
        'jquery',
        'some_jquery_plugin' //which has 'jquery' as a dependency
    ]
},
output: {
    path: PATHS.build,
    filename: '[name].bundle.js'
}
...

如果我不使用 CommonsChunkPlugin

进行捆绑

我将得到 3 个新的捆绑文件:

这显然很糟糕,因为我可能会在页面中加载 jquery 3 次,所以我们不希望这样。

如果我使用 CommonsChunkPlugin

捆绑

根据我传递给 CommonsChunkPlugin 的参数,将发生以下任何情况:

我不明白understand/I我不确定我是否理解

这就是 CommonsChunkPlugin 的工作原理。

公共块 "receives" 由多个入口块共享的模块。 可以在 Webpack repository.

中找到复杂配置的一个很好的示例

在Webpack的优化阶段CommonsChunkPlugin是运行,这意味着它在内存中运行,就在块被密封并写入磁盘之前。

当定义了几个公共块时,它们是按顺序处理的。在你的案例 3 中,它就像 运行 插件两次。但请注意,CommonsChunkPlugin 可以有更复杂的配置(minSize、minChunks 等),这会影响模块的移动方式。

案例 1:

  1. 有 3 个 entry 块(entry1entry2vendors)。
  2. 配置将 commons 块设置为公共块。
  3. 插件处理commons公共块(因为块不存在,所以创建):
    1. 它收集在其他块中多次使用的模块:entry1entry2vendors 使用 jquery 因此模块从这些块中删除块并添加到 commons 块。
    2. commons 块被标记为 entry 块,而 entry1entry2vendors 块未标记为 entry .
  4. 最后,由于 commons 块是一个 entry 块,它包含 运行 时间和 jquery 模块。

案例 2:

  1. 有 3 个 entry 块(entry1entry2vendors)。
  2. 配置将 vendors 块设置为公共块。
  3. 插件处理 vendors 公共块:
    1. 它收集在其他块中多次使用的模块:entry1entry2 使用 jquery 因此模块从这些块中删除(注意它是未添加到 vendors 块,因为 vendors 块已包含它)。
    2. vendors 块被标记为 entry 块,而 entry1entry2 块未标记为 entry
  4. 最后,由于vendors块是一个entry块,它包含运行时间和jquery/jquery_plugin模块。

案例 3:

  1. 有 3 个 entry 块(entry1entry2vendors)。
  2. 配置将vendors块和manifest块设置为普通块。
  3. 插件创建 manifest 块,因为它不存在。
  4. 插件处理 vendors 公共块:
    1. 它收集在其他块中多次使用的模块:entry1entry2 使用 jquery 因此模块从这些块中删除(注意它是未添加到 vendors 块,因为 vendors 块已包含它)。
    2. vendors 块被标记为 entry 块,而 entry1entry2 块未标记为 entry
  5. 插件处理manifest公共块(由于块不存在,所以创建):
    1. 它收集在其他块中被多次使用的模块:因为没有模块被多次使用,所以没有模块被移动。
    2. manifest 块被标记为 entry 块,而 entry1entry2vendors 未标记为 entry
  6. 最后,由于 manifest 块是一个 entry 块,它包含 运行 时间。

希望对您有所帮助。