webpack Compilation 执行过程
- 构建
Compilation
实例 - 调用
compilation.finish
执行构建 - 异步调用
finishModules
钩子函数 - 调用
compilation.seal
完成构建 - 构建
ChunkGraph
实例,并调用ChunkGraph.setChunkGraphForModule(module, chunkGraph)
- 同步调用
seal
钩子函数 - 同步调用
optimizeDependencies
钩子函数,等待钩子函数执行完毕 - 同步调用
afterOptimizeDependencies
钩子函数 - 同步调用
beforeChunks
钩子函数 - 构建
chunk
- 同步调用
afterChunks
钩子函数 - 同步调用
optimize
钩子函数 - 同步调用
optimizeModules
钩子函数,等待钩子函数执行完毕 - 同步调用
afterOptimizeModules
钩子函数 - 同步调用
optimizeChunks
钩子函数,等待钩子函数执行完毕 - 同步调用
afterOptimizeChunks
钩子函数 - 异步调用
optimizeTree
钩子函数 - 同步调用
afterOptimizeTree
钩子函数 - 异步调用
optimizeChunkModules
钩子函数 - 同步调用
afterOptimizeChunkModules
钩子函数 - 同步调用
shouldRecord
钩子函数 - 同步调用
reviveModules
钩子函数 - 同步调用
beforeModuleIds
钩子函数 - 同步调用
moduleIds
钩子函数 - 同步调用
optimizeModuleIds
钩子函数 - 同步调用
afterOptimizeModuleIds
钩子函数 - 同步调用
reviveChunks
钩子函数 - 同步调用
beforeChunkIds
钩子函数 - 同步调用
chunkIds
钩子函数 - 同步调用
optimizeChunkIds
钩子函数 - 同步调用
afterOptimizeChunkIds
钩子函数 - 若
shouldRecord
钩子函数为正,则同步调用recordModules
钩子函数 - 若
shouldRecord
钩子函数为正,则同步调用recordChunks
钩子函数 - 同步调用
optimizeCodeGeneration
钩子函数 - 同步调用
beforeModuleHash
钩子函数 - 同步调用
afterModuleHash
钩子函数 - 同步调用
beforeCodeGeneration
钩子函数 - 调用
codeGeneration
生成代码 - 同步调用
afterCodeGeneration
钩子函数 - 同步调用
beforeRuntimeRequirements
钩子函数 - 提取
modules
中的runtime
,对于每个module
的runtime
都同步调用additionalModuleRuntimeRequirements
钩子函数 - 若存在对应的
runtimeRequirementInModule
钩子函数,则同步调用该钩子函数 - 对每个
chunk
同步调用additionalChunkRuntimeRequirements
钩子函数 - 对每个
chunk
中依赖的runtime
调用runtimeRequirementInChunk
钩子函数 - 构建含有重复依赖的依赖树
- 每个入口文件的依赖进行扁平化处理,去掉重复依赖,然后同步调用
additionalTreeRuntimeRequirements
钩子函数 - 每个入口文件的依赖一次调用
runtimeRequirementInTree
钩子函数 - 同步调用
afterRuntimeRequirements
钩子函数 - 同步调用
beforeHash
钩子函数 - 同步调用
updateHash
钩子函数 - 若为非
fullHashModules
是同步调用contentHash
钩子函数 - 同步调用
fullHash
钩子函数 - 对每个
chunk
同步调用fullHash
钩子函数 - 同步调用
afterHash
钩子函数 - 若需要记录则同步调用
shouldRecord
钩子函数 - 清理
chunk
记录的文件 - 同步调用
beforeModuleAssets
钩子函数 - 针对
module
的每一个需要输出的资源同步调用moduleAsset
钩子函数 - 同步调用
shouldGenerateChunkAssets
判断是否需要输出资源 - 输出资源前同步调用
beforeChunkAssets
钩子函数 - 针对每个
chunk
构建一个manifest
文件 - 为每个
chunk
写入包含的资源 - 同步调用
chunkAsset
钩子函数 - 异步调用
processAssets
钩子函数 - 同步调用
afterProcessAssets
钩子函数 - 构建依赖
- 若需要记录则同步调用
record
钩子函数 - 同步调用
needAdditionalSeal
钩子函数,判读是否需要新增 - 异步调用
afterSeal
钩子函数 - 回调
Module
1 | { |
chunk
具有的属性
1 | { |
ChunkGraph
具有的属性
1 | { |
备注
- 对于一份同逻辑的代码,当我们手写下一个一个的文件,它们无论是
ESM
还是commonJS
或是AMD
,他们都是module
- 当我们写的
module
源文件传到webpack
进行打包时,webpack
会根据文件引用关系生成chunk
文件,webpack
会对这个chunk
文件进行一些操作; webpack
处理好chunk
文件后,最后会输出bundle
文件,这个bundle
文件包含了经过加载和编译的最终源文件,所以它可以直接在浏览器中运行。