webpack 执行顺序
🗺️ 第一阶段:resolve —— 找路径
目标:把代码里写的简写、别名、包名,翻译成硬盘上的绝对路径。
- 拿到引用字符串:Webpack 在 AST 里发现了一个依赖,比如
import x from 'my-ui'或import './style.css'。 - 查
alias:看看有没有配置路径别名(比如把@替换成真实的src目录)。 - 查
modules:如果是纯包名(如my-ui),就去node_modules里找这个文件夹。 - 查说明书:找到文件夹后,看
descriptionFiles(默认package.json),根据mainFields决定入口文件。 - 补全后缀:如果路径没有后缀,按
extensions数组的顺序依次去试(.js->.vue->.json)。 - 处理软链接:如果发现是快捷方式,根据
symlinks决定是顺着找真实路径,还是当成普通内部文件。 - 交卷:最终吐出一个确定的绝对路径(例如
D:\...\src\style.css)。
⚙️ 第二阶段:rules 与 noParse
目标:拿到真实路径后,决定用什么工具处理它,以及要不要扒它的内部依赖。
- 过安检(查
noParse):Webpack 拿到绝对路径后,第一件事是看它有没有命中noParse配置。- 如果命中(比如是
jquery),在心里盖个章:“这是个铁板,一会儿处理完不准解析它的依赖”。
- 如果命中(比如是
- 匹配加工厂(查
rules):拿着绝对路径,去module.rules里挨个对号入座(看test、include、exclude)。- 匹配成功,确定使用哪些 Loader(比如
babel-loader、style-loader)。
- 匹配成功,确定使用哪些 Loader(比如
- 读取与翻译(执行 Loader):Webpack 把文件从硬盘读成文本字符串,交给 Loader 处理。Loader 的执行顺序是从右到左。处理完毕后,Loader 必须交出一段合法的 JS 字符串。
- 决定是否解析(转 AST):
- 如果在第 1 步命中了
noParse:Webpack 直接拿着 Loader 交出的代码,跳过解析,准备打包。 - 如果没命中
noParse:Webpack 把代码转成 AST(抽象语法树),在里面找有没有新的import/require。
- 如果在第 1 步命中了
- 发现新依赖:如果 AST 里找到了新依赖,就把它丢回第一阶段(
resolve),循环往复,直到整张依赖图构建完毕。
📦 第三阶段:Plugin 与输出
- 插件介入:在构建的各个生命周期(Hooks)里,Plugin 开始干活(比如拆分代码、压缩、生成 HTML)。
- 写入磁盘:最终把打包好的文件输出到
dist目录。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 YianNotes!

