Webpack
Webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具
核心概念
entry编译的入口文件output如何输出以及在哪里输出moduleWebpack 一切皆模块,一个模块对应一个文件chunk代码块,由多个 module 组成loaderWebpack 通过不同的 loader 对模块的源代码进行转换plugin插件 Webpack 在打包构建的生命周期中提供了不同的 hooks 允许调用方能够对打包的资源注入自己的逻辑处理compiler编译器,把控整个 Webpack 打包的构建流程compilation每一次构建的上下文对象包含了当次构建的所有信息dependence记录模块间依赖关系
构建流程
Init 初始化阶段
- 解析命令行与
webpack.config.js配置的参数,合并生成最后的配置 - 创建
compiler对象并开始启动插件- 调用
createCompiler函数创建compiler对象 - 遍历注册的
Plugins并执行其apply方法 - 调用
new WebpackOptionsApply().process方法,根据配置内容动态注入相应插件- 调用
EntryOptionPlugin插件,该插件根据entry值注入DynamicEntryPlugin或EntryPlugin插件 - 根据
devtool值注入Sourcemap插件SourceMapDevToolPluginEvalSourceMapDevToolPluginEvalDevToolModulePlugin
- 注入
RuntimePlugin用于根据代码内容动态注入webpack运行时
- 调用
- 调用
compiler.compile方法开始执行构建
- 调用
Make 构建阶段
- 读入文件内容
- 调用
Loader将模块转译为标准的JS内容 - 调用
acorn生成AST语法树 - 分析
AST确定模块依赖列表 - 解析模块依赖(对每一个依赖模块重新执行上述流程,直到生成完整的模块依赖图 ——
ModuleGraph对象)
Seal 生成阶段
- 遍历模块依赖图并执行操作
- 代码转译,如
import转换为require调用 - 分析运行时依赖
- 代码转译,如
- 合并模块代码与运行时代码并生成
chunk - 执行产物优化操作
Tree-shaking- 压缩
Code Split
- 输出结果(根据配置确定输出的路径和文件名,把文件内容写入到文件系统)
