首先要理解webpack中比较核心的概念:
webpack编译过程中一个比较重要的概念compiler、compilation,如下:
webpack 执行流程和事件流如下图所示:
webpack的运行是一个串行过程,过程如下:
初始化:启动构建,读取与合并配置参数,加载 Plugin,实例化 Compiler。
编译:从 Entry 发出,针对每个 Module 串行调用对应的 Loader 去翻译文件内容,再找到该 Module 依赖的 Module,递归地进行编译处理。
输出:对编译后的 Module 组合成 Chunk,把 Chunk 转换成文件,输出到文件系统。
如果只执行一次构建,以上阶段将会按照顺序各执行一次。但在开启监听模式下,流程将变为如下:
具体运行过程:
这里主要最重要的就是compilation过程,compilation 实际上就是调用相应的 loader 处理文件生成 chunks并对这些 chunks 做优化的过程。几个关键的事件(Compilation对象this.hooks中):
补充
补充:webpack 的运行是一个串行过程,整体可分为四个阶段:
- 初始化:从
webpack.config.js+shell合并参数;加载所有Plugin;实例化Compiler(贯穿整个生命周期的全局对象,继承自Tapable);执行compiler.hooks.beforeRun/run/beforeCompile/compile等钩子。- 编译(make):从
entry出发,递归地:① 调用匹配的 loader 把源码转换为 JS;② 用 acorn 解析成 AST,提取import/require等依赖;③ 把新模块加入依赖图。这一阶段会产生compilation(单次构建上下文),触发make钩子。- 构建(build / seal):把模块组合成
Chunk(包含 entry 与其依赖),按splitChunks规则拆 chunk,再优化(tree shaking、scope hoisting、压缩等)。触发optimize、optimizeAssets等钩子。- 输出(emit):根据
output配置把每个 chunk 写出为最终文件(文件名含 hash)。触发emit钩子(这是插件修改产物的最后机会)。监听模式下(
webpack --watch或webpack-dev-server):第 2~4 步会循环执行,依赖图变化时增量重建并通过 WebSocket 通知浏览器做 HMR。关键对象:
Compiler:全局、单例,代表 webpack 从启动到退出的完整生命周期。Compilation:单次构建的上下文,模块、依赖、chunk 都归它管理;watch 模式下每次文件变更都会创建新的 Compilation。
来源整理自:我的有道云笔记



