compilation.seal中逻辑梳理,目的是找到有效主流程逻辑
未用到:表示内置没有注册的插件
| seal: 钩子和调用 | 可能的注册和功能 |
|---|---|
| hooks.seal | WarnCaseSersitiveModulesPlugin |
| hooks.optimizeDependenciesBasic, hooks.optimizeDependencies, hooks.optimizeDependenciesAdvanced | 1. 未用到 2. FlagAllModulesAsUsedPlugin、FlagDependencyUsagePlugin、SideEffectsFlagPlugin (普通模式下没有用到 - 非必须- 优化策略应该) 3. 未用到 |
| hooks.afterOptimizeDependencies | 未用到 |
| hooks.beforeChunks | 未用到 |
| 构造初始ChunkGroupsh和EntryPoints | _preparedEntrypoints new EntryPoint()等 |
| buildChunkGraph | 由module-graph 初步构造 chunk-graph |
| sortModules() | |
| hooks.afterChunks | WebAssemblyModulesPlugin |
| hooks.optimize | AggressiveSplittingPlugin |
| hooks.optimizeModulesBasic, hooks.optimizeModules, hooks.optimizeModulesAdvanced | 1. 未用到 , 2. 未用到 , 3. 未用到 |
| hooks.afterOptimizeModules | 未用到 |
| hooks.optimizeChunksBasic, hooks.optimizeChunks, hooks.optimizeChunksAdvanced | 1. EnsureChunkConditionsPlugin、MergeDuplicateChunksPlugin、RemoveEmptyChunksPlugin、RemoveParentModulesPlugin 2. 未用到 3. RemoveEmptyChunksPlugin、AggressiveMergingPlugin、AggressiveSplittingPlugin、LimitChunkCountPlugin、MinChunkSizePlugin、RuntimeChunkPlugin、 SplitChunksPlugin |
| hooks.afterOptimizeChunks | FlagInitialModulesAsUsedPlugin |
| hooks.optimizeTree | 未用到 |
hooks.optimizeTree 回调中的逻辑
| 标题 | |
|---|---|
| hooks.afterOptimizeTree | 未用到: 表示webpack内部没有任何订阅 |
| hooks.optimizeChunkModulesBasic、hooks.optimizeChunkModules、hooks.optimizeChunkModulesAdvanced | 1. 未用到 2. ModuleConcatenationPlugin 3. 未用到 |
| hooks.afterOptimizeChunkModules | 未用到 |
| hooks.reviveModules | compilation.hooks.reviveModules.tap( "RecordIdsPlugin", |
| hooks.optimizeModuleOrder | OccurrenceOrderPlugin OccurrenceOrderModuleIdsPlugin 普通模式下未用到 |
| hooks.advancedOptimizeModuleOrder | 未用到 |
| hooks.beforeModuleIds | 未用到 |
| hooks.moduleIds | 未用到 ChunkModuleIdRangePlugin |
| applyModuleIds() | |
| hooks.optimizeModuleIds | 未用到 |
| hooks.afterOptimizeModuleIds | 未用到 |
| sortItemsWithModuleIds() | |
| hooks.reviveChunks | RecordIdsPlugin |
| hooks.optimizeChunkOrder | NaturalChunkOrderPlugin 有用到 OccurrenceOrderPlugin OccurrenceOrderModuleIdsPlugin |
| hooks.beforeChunkIds | NamedChunksPlugin |
| applyChunkIds() | |
| hooks.optimizeChunkIds | FlagIncludedChunksPlugin |
| hooks.afterOptimizeChunkIds | 未用到 |
| sortItemsWithChunkIds() | |
| hooks.beforeHash | 未用到 |
| createHash() | 1. … 2. JavascriptModulesPlugin.hooks.contentHash |
| hooks.afterHash | HotModuleReplacementPlugin |
| hooks.beforeModuleAssets | 未用到 |
| createModuleAssets() | NormalModule提供的loaderContext有emitFile,loader可以通过该接口将资源输出,此时并没有真正的输出文件,只是记录到 module.buildInfo.assets 中 这里的逻辑就是遍历所有的模块,将每个模块在loader阶段输出的文件添加到(调用compilation.emitAsset())compilation.assets中,统一走compilation的文件输出 file-loader中就有用到该emitFile接口,然后会进入 createModuleAssets() 中… |
| hooks.shouldGenerateChunkAssets、hooks.beforeChunkAssets | HotModuleReplacementPlugin shouldGenerateChunkAssets |
| createChunkAssets() | 生成Chunk内容 保存到 compilation.assets中 |
| hooks.additionalChunkAssets | HotModuleReplacementPlugin |
| summarizeDependencies() | |
| hooks.additionalAssets | 该钩子的回调中的钩子 hooks.optimizeChunkAssets - BannerPlugin hooks.afterOptimizeChunkAssets - SourceMapDevToolPlugin hooks.optimizeAssets - 无 hooks.afterOptimizeAssets - 无 hooks.needAdditionalSeal - AggressiveSplittingPlugin hooks.afterSeal - 无 |
所有插件??
WebpackOptionsApply中涉及的插件
| 插件 | 条件 | 备注 |
|---|---|---|
| FetchCompileWasmTemplatePlugin | options.target = 'web | |
| LoaderTargetPlugin | options.target = 'web | 给loaderContext设置target |
| LibraryTemplatePlugin | output.library | |
| ExternalsPlugin | externals | |
| EvalSourceMapDevToolPlugin | SourceMapDevToolPlugin | |
| EvalDevToolModulePlugin | devtool.includes("eval") | |
| SizeLimitsPlugin | performance | |
| NodeStuffPlugin | options.node !== false | parser相关;node相关忽略 |
| WebAssemblyModulesPlugin | y | |
| RecordIdsPlugin | y | |
| WarnCaseSensitiveModulesPlugin | y | |
| LoaderPlugin | y | 关注 |
| EnsureChunkConditionsPlugin | y | hooks.optimizeChunksBasic、optimizeExtractedChunksBasic |
| NodeSourcePlugin | options.target = 'web | parser相关,作用是? |
| EntryOptionPlugin | y | compiler.hooks.entryOption.call(options.context, options.entry);--- |
| UseStrictPlugin | y | parser相关;use strict |
| CompatibilityPlugin | y | parser相关;支持 Browserify风格的require(file, opts) |
| RequireIncludePlugin | y | parser相关;RequireIncludeDependencyParserPlugin; webpack提供的require.include |
| RequireEnsurePlugin | y | parser相关;RequireEnsureDependenciesBlockParserPlugin; webpack提供的require.ensure |
| RequireContextPlugin | y | parser相关;RequireContextDependencyParserPlugin; webpack提供require.context--- |
| SystemPlugin | y | parser相关;关注 模块定义系统;libraryTarget: 'system' |
| ImportPlugin | y | parser相关;ImportParserPlugin;import() |
| HarmonyModulesPlugin | y | parser相关,HarmonyDetectionParserPlugin、HarmonyImportDependencyParserPlugin、HarmonyExportDependencyParserPlugin、HarmonyTopLevelThisParserPlugin;es6规范 |
| AMDPlugin | RequireJsStuffPlugin | options.amd !== false |
| CommonJsPlugin | y | parser相关;RequireResolveDependencyParserPlugin、CommonJsRequireDependencyParserPlugin;commonjs简写规范(cjs) |
| CommonJsStuffPlugin | y | parser相关;cjs规范?;模块变量 :module.loaded、module.id等等 |
| APIPlugin | y | parser相关;模块变量 webpack_require、__webpack_public_path__等 |
| JsonModulesPlugin | y | createParser & creatGengerator |
| JavascriptModulesPlugin | y | 代码生成; |
| FunctionModulePlugin | options.target = 'web | 代码生成;FunctionModuleTemplatePlugin |
| JsonpTemplatePlugin | options.target = 'web | 代码生成 ;JsonpMainTemplatePlugin、JsonpChunkTemplatePlugin |
| TemplatedPathPlugin | y | 模板路径❓ |
optimization相关的插件
| 插件 | 条件 | 备注 |
|---|---|---|
| RemoveParentModulesPlugin | optimization.removeAvailableModules | |
| RemoveEmptyChunksPlugin | optimization.removeEmptyChunks | |
| MergeDuplicateChunksPlugin | optimization.mergeDuplicateChunks | |
| FlagIncludedChunksPlugin | optimization.flagIncludedChunks | |
| SideEffectsFlagPlugin | optimization.sideEffects | |
| FlagDependencyExportsPlugin | optimization.providedExports | |
| FlagDependencyUsagePlugin | optimization.usedExports | |
| ModuleConcatenationPlugin | optimization.concatenateModules | |
| SplitChunksPlugin | optimization.splitChunks | |
| RuntimeChunkPlugin | optimization.runtimeChunk | |
| NoEmitOnErrorsPlugin | optimization.noEmitOnErrors | |
| WasmFinalizeExportsPlugin | optimization.checkWasmTypes | |
| HashedModuleIdsPlugin | moduleIds="hashed" | |
| OccurrenceModuleOrderPlugin | optimization.occurrenceOrder => moduleIds="size" | {prioritiseInitial: true} |
| NamedModulesPlugin | optimization.namedModules => moduleIds="named" | |
| OccurrenceModuleOrderPlugin | moduleIds"total-size" | {prioritiseInitial: false} |
| NaturalChunkOrderPlugin | chunkIds="natural" | |
| OccurrenceChunkOrderPlugin && NamedChunksPlugin | chunkIds="named" | |
| OccurrenceChunkOrderPlugin | chunkIds="size" | {prioritiseInitial: true} |
| OccurrenceChunkOrderPlugin | chunkIds="total-size" | {prioritiseInitial: false} |
| DefinePlugin | nodeEnv | |
| minimizer.call/apply | minimizer in minimizer |