Webpack 构建流程详解
1. 面试题
Q: 请简述 Webpack 的整体构建流程?
2. 核心解答
Webpack 的构建流程是一个串行的过程,从启动到结束会依次执行以下流程:
(1) 初始化
- 读取配置:从配置文件 (
webpack.config.js) 和 Shell 语句 (--mode=production) 中读取与合并参数,得出最终的参数。
- 实例化 Compiler:用上一步得到的参数初始化
Compiler 对象,加载所有配置的插件,执行对象的 run 方法开始编译。
(2) 编译构建
- 确定入口:根据配置中的
entry 找出所有的入口文件。
- 编译模块:从入口文件出发,调用所有配置的
Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理。
- 完成模块编译:经过第 4 步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系(依赖图 Dependency Graph)。
(3) 输出
- 输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的
Chunk,再把每个 Chunk 转换成一个单独的文件加入到输出列表,这步是可以修改输出内容的最后机会。
- 写入文件:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统。
(4) 关键概念
- Compiler:Webpack 的整个生命周期对象。
- Compilation:一次编译过程的对象 (Watch 模式下会有多次 Compilation)。
- Entry -> Module -> Chunk -> Bundle (Assets)。
3. 面试加分项
Q: Loader 和 Plugin 在哪个阶段执行?
- Loader:在第 4 步 编译模块 (Make) 阶段执行。针对每一个文件进行转换。
- Plugin:贯穿整个生命周期。初始化阶段注册,在特定的钩子 (Hooks) 触发时执行。例如
emit 钩子就是在第 7 步输出文件前触发。
4. 总结
- Init: Config, Compiler.
- Make: Entry, Loader, Dependency Graph.
- Seal: Chunk, Optimization.
- Emit: Write to disk.