作用
配置文档
webpack SplitChunksPlugin 配置文档
默认cacheGroups
在
webpack/lib/webpack.js
文件中,createCompiler
时调用了applyWebpackOptionsDefaults
函数,该函数会为cacheGroups
设置两个默认值,这两个默认值就是webpack
的默认分包原则,其中defaultVendors
是应用于node_modules
:F(cacheGroups, "default", () => ({
idHint: "",
reuseExistingChunk: true,
minChunks: 2,
priority: -20
}));
F(cacheGroups, "defaultVendors", () => ({
idHint: "vendors",
reuseExistingChunk: true,
test: NODE_MODULES_REGEXP,
priority: -10
}));
触发时机
在
Compilation.js
文件中,调用seal
方法时,当调用buildChunkGraph
之后,就建立起了modules
和chunks
的关系,此时会开始触发hooks.optimizeChunks
钩子:while (this.hooks.optimizeChunks.call(this.chunks, this.chunkGroups)) {
/* empty */
}
此时会触发几个插件:
RemoveEmptyChunksPlugin
:for (const chunk of chunks) { // 移除不包含 runtime 的空 chunk if ( chunkGraph.getNumberOfChunkModules(chunk) === 0 && !chunk.hasRuntime() && chunkGraph.getNumberOfEntryModules(chunk) === 0 ) { compilation.chunkGraph.disconnectChunk(chunk); compilation.chunks.delete(chunk); } }
MergeDuplicateChunksPlugin
:// 合并”重复“的chunk。 if (chunkGraph.canChunksBeIntegrated(chunk, otherChunk)) { chunkGraph.integrateChunks(chunk, otherChunk); compilation.chunks.delete(otherChunk); }
-
SplitChunksPlugin
- 遍历 modules 匹配对应 cacheGroups
- 遍历
cacheGroups
- 根据 module 调用 getCombsByUsedExports
- getExportsChunkSetsInGraph开始
- 遍历所有 modules
- 找到 module 所在的 chunks,并遍历 chunks
- 根据 chunk + module.exportsInfo => 得出变量使用情况,形成 key
- 存放到groupedByUsedExports中 key => [chunks]
- groupedByExportsMap 存放 module =>groupedByUsedExports.values()
- 如果 chunks 长度为1 singleChunkSets.add(chunks[0]);
- 否则 chunkSetsInGraph.set(chunksKey, newSet(chunks));
- 遍历
groupedByExportsMap