默认情况下,在项目中调试 webpack 时,进入的是 node_modules 里 npm 发布版本的代码,而不是本地克隆的源码。要让断点落到源码上,需要用 npm link 把项目依赖的 webpack 替换为指向源码目录的符号链接。
步骤一:确认全局 webpack 已链接
# 在 webpack 源码目录执行(之前已完成)
cd /path/to/webpack
npm link
# 此时全局 webpack 指向源码步骤二:在 CLI 项目中链接 webpack
# 进入 webpack-cli 项目目录
cd /path/to/webpack-cli
# 将 node_modules 中的 webpack 链接到全局
npm link webpack执行效果:
链接前:
node_modules/webpack/ → npm 仓库发布的版本
链接后:
node_modules/webpack/ → 全局 webpack → webpack 源码在 VS Code 中验证:
左侧文件系统显示:
├── node_modules/
│ └── webpack → ← 出现箭头符号,表示已链接提示:链接成功后,
node_modules/webpack会显示一个小箭头图标,表示这是一个符号链接。
调试追踪路径:
// webpack-cli 中的调用
const webpack = require('webpack');
// 进入 webpack 源码位置
// lib/index.js 重导出 -> lib/webpack.js 中的 webpack 函数关键文件: webpack/lib/webpack.js(webpack 函数所在;lib/index.js 是重导出入口)
断点设置:
// webpack/lib/webpack.js(以 webpack 5.88.2 为例)
// 【断点 1】第 110 行 - webpack 函数定义
const webpack = (options, callback) => {
// 在这里打断点
// ...
};
// 【断点 2】第 117 行 - 函数内部的 create()
// 负责校验配置并创建 Compiler / MultiCompiler
// 【断点 3】函数末尾 - 依据 watch 调用 compiler.watch 或 compiler.run操作步骤:
1. 在 webpack/lib/webpack.js 的 webpack 函数处打断点
2. 启动调试(F5 或点击调试按钮)
3. 执行命令:webpack --config webpack.config.js
4. 程序停在 webpack 函数入口断点处调试界面操作:
| 操作 | 快捷键 | 说明 |
|---|---|---|
| Continue | F5 | 继续运行到下一个断点 |
| Step Over | F10 | 单步跳过(不进入函数) |
| Step Into | F11 | 单步进入(进入函数内部) |
| Step Out | Shift+F11 | 跳出当前函数 |
执行流程:
webpack-cli 执行
│
▼
require('webpack')
│
▼
webpack/lib/webpack.js(webpack 函数,断点)
│
▼
函数内部的 create()
│
▼
校验配置并创建 compiler 对象
│
▼
按 watch 与否调用 compiler.watch / compiler.runcreate 方法作用:
// webpack/lib/webpack.js 内部 create()(简化示意)
// 实际的 createCompiler 定义于同文件,配合 config/normalization、WebpackOptionsApply 完成初始化
function create() {
// 1. 归一化配置并创建 compiler 对象
const compiler = createCompiler(webpackOptions);
// 2. 应用内置与配置中的插件、初始化文件系统等
// 3. 返回 compiler 与 watch 信息
return { compiler, watch, watchOptions };
}npm link 工作原理:
第一步:创建全局链接
┌──────────────┐ npm link ┌──────────────────┐
│ webpack/ │ ─────────────────► │ 全局 npm 目录 │
│ (源码目录) │ │ node_modules/ │
└──────────────┘ │ webpack → 源码 │
└──────────────────┘
第二步:项目链接到全局
┌──────────────┐ npm link webpack ┌──────────────────┐
│ webpack-cli/ │ ─────────────────────► │ 全局 webpack │
│ node_modules/│ │ │
│ webpack → │ │ │
└──────────────┘ └──────────────────┘| 技巧 | 说明 |
|---|---|
| 符号链接识别 | 文件名旁出现箭头图标 |
| 断点验证 | 调试时能进入源码即链接成功 |
| 条件断点 | 右键断点可设置触发条件 |
| 调试控制台 | 可在断点处执行代码查看变量 |
| 问题 | 解决方案 |
|---|---|
| 链接后调试仍进入 node_modules | 删除 node_modules 重新安装,再执行 link |
| Windows 权限问题 | 以管理员身份运行终端 |
| 多版本冲突 | 使用 npm unlink 取消链接后重新操作 |
┌─────────────────────────────────────────────────────────┐
│ 完整调试链路 │
├─────────────────────────────────────────────────────────┤
│ │
│ webpack-cli 源码 │
│ │ │
│ │ npm link webpack │
│ ▼ │
│ node_modules/webpack → 全局 → webpack 源码 │
│ │ │
│ │ 打断点:lib/webpack.js │
│ ▼ │
│ webpack(options, callback) │
│ │ │
│ ▼ │
│ create() → compiler 创建 │
│ │
└─────────────────────────────────────────────────────────┘ 问题:调试时 node_modules 中的 webpack 非源码
解决:npm link webpack(在 CLI 项目目录执行)
验证:VS Code 中文件夹显示箭头图标
断点:webpack/lib/webpack.js 第 110 行(webpack 函数)与第 117 行(create)
效果:调试时可进入真正的 webpack 源码