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文件包含了经过加载和编译的最终源文件,所以它可以直接在浏览器中运行。