Compilation

Compilation 模块会被 Compiler 用来创建新的编译(或新的构建)。Compilation 实例能够访问所有的模块和它们的依赖(大部分是循环依赖)。它会对应用程序的依赖图中所有模块进行字面上的 编译(iteral compilation)

在编译阶段,模块会被 加载(loaded)封存(sealed)优化(optimized)分块(chunked)哈希(hashed)重新创建(restored)

Compilation 类扩展(extend)自 Tapable,并提供了以下生命周期钩子。可以按照 compiler 钩子的相同方式,调用 tap

代码示例:

compilation.hooks.someHook.tap(...)

插件开发

Compilation 对象代表了一次资源版本构建。当运行 Webpack 开发环境中间件时,每当检测到一个文件变化,就会创建新的 compilation,从而生成一组新的编译资源。一个 Compilation 对象表现了当前的模块资源、编译生成资源、变化的文件、以及被跟踪依赖的状态信息,简单来讲就是把本次打包编译的内容存到内存里。Compilation 对象也提供了插件需要自定义功能的回调,以供插件做自定义处理时选择使用拓展。

简单来说,Compilation 的职责就是构建模块和 Chunk,并利用插件优化构建过程。和 Compiler 用法相同,钩子类型不同,也可以在某些钩子上访问 tapAsynctapPromise

代码示例:

Compilation

生命周期钩子

compiler 用法相同,取决于不同的钩子类型,也可以在某些钩子上访问 tapAsynctapPromise

事件名称内容说明参数类型
buildModule在模块构建开始之前触发moduleSync
rebuildModule在重新构建模块之前触发moduleSync
failModule模块构建失败时执行module errorSync
succeedModule模块构建成功时执行moduleSync
finishModules所有模块都完成构建modulesSync
finishRebuildingModule模块完成重新构建moduleSync
sealcompilation 停止接收新模块时触发-Sync
unsealcompilation 开始接收新模块时触发-Sync
optimizeDependenciesBasic-modulesSyncBail
optimizeDependencies依赖优化开始时触发modulesSyncBail
optimizeDependenciesAdvanced-modulesSyncBail
afterOptimizeDependencies-modulesSync
optimize优化阶段开始触发-Sync
optimizeModulesBasic-modulesSyncBail
optimizeModules-modulesSyncBail
optimizeModulesAdvanced-modulesSyncBail
afterOptimizeModules-modulesSync
optimizeChunksBasic-chunksSyncBail
optimizeChunks-chunksSyncBail
optimizeChunksAdavanced-chunksSyncBail
afterOptimizeChunkschunk 优化完成之后触发chunks modulesSync
optimizeTree异步优化依赖树chunks modulesAsyncSeries
afterOptimizeTree-chunks modulesSync
optimizeChunkModulesBasic-chunks modulesSyncBail
optimizeChunkModules-chunks modulesSync
optimizeChunkModulesAdvanced-chunks modulesSyncBail
afterOptimizeChunkModules-chunks modulesSync
shouldRecord--SyncBail
reviveModules从 records 中恢复模块信息modules recordSync
optimizeModuleOrder将模块从最重要的最不重要的进行排序modulesSync
advancedOptimizeModuleOrder-modulesSync
beforeModuleIds-modulesSync
moduleIds-modulesSync
optimizeModuleIds-chunksSync
afterOptimizeModuleIds-chunksSync
reviveChunks从 records 中恢复 chunk 信息modulesrecordsSync
optimizeChunkOrder将 chunk 从最重要的到最不重要的进行排序chunksSync
beforeOptimizeChunkIdschunk id 优化之前触发chunksSync
optimizeChunkIds优化每个 chunk 的 idchunksSync
afterOptimizeChunkIdschunk id 优化完成之后触发chunksSync
recordModules将模块信息存储到 recordsmodulesrecordsSync
recordChunks将 chunk 信息存储到 recordschunksrecordsSync
beforeHash在编译被哈希之前-Sync
afterHash在编译被哈希之后-Sync
recordHash-recordsSync
record将 compliaztion 相关信息存储到 records 中compilationrecordsSync
beforeModuleAssets--Sync
shouldGenerateChunkAssets--SyncBail
beforeChunkAssets在创建 chunk 资源(assets)之前-Sync
additionalChunkAssets为 chunk 创建附加资源(asset)chunksSync
recordss-compilationrecordsSync
additionalAssets为 compilation 创建附加资源(asset)这个钩子可以用来下载图像。-AsyncSeries
optimizeChunkAssets优化所有 chunk 资源(asset)。资源会被存储在 compilation.assets。每个 Chunk 都有一个 files 属性,指向这个 chunk 所创建的所有文件。附加资源被存储在 compilation.additionalChunkAssetschunksAsyncSeries
afterOptimizeChunkAssetschunk 资源(Asset)已经被优化chunksSync
optimizeAssets优化存储在 compilation.assets 中的所有资源(Asset)assetsAsyncSeries
afterOptimizeAssets资源优化已经结束assetsSync
needAdditionalSeal--SyncBail
afterSeal--AsyncSeries
chunkHash-chunkchunkHashSync
moduleAsset一个模块中的一个资源被添加到编译中modulefilenameSync
chunkAsset一个 chunk 中的一个资源被添加到编译中chunkfilenameSync
assetPath-filenamedataSyncWaterfall
needAdditionalPass--SyncBail
childCompiler-childCompilercompilerNamecompilerIndexSyncHook
normalModuleLoader普通模块 loader,真正(一个接一个地)加载模块图(Graph)中所有模块的函数loaderContextmoduleSync

参考资料