二、解决方案:npm link
2.1 链接操作
步骤一:确认全局 webpack 已链接
bash
# 在 webpack 源码目录执行(之前已完成)
cd /path/to/webpack
npm link
# 此时全局 webpack 指向源码步骤二:在 CLI 项目中链接 webpack
bash
# 进入 webpack-cli 项目目录
cd /path/to/webpack-cli
# 将 node_modules 中的 webpack 链接到全局
npm link webpack执行效果:
plaintext
链接前:
node_modules/webpack/ → npm 仓库发布的版本
链接后:
node_modules/webpack/ → 全局 webpack → webpack 源码2.2 链接验证
在 VS Code 中验证:
plaintext
左侧文件系统显示:
├── node_modules/
│ └── webpack → ← 出现箭头符号,表示已链接提示:链接成功后,
node_modules/webpack会显示一个小箭头图标,表示这是一个符号链接。
三、源码断点调试
3.1 定位源码入口
调试追踪路径:
javascript
// webpack-cli 中的调用
const webpack = require('webpack');
// 进入 webpack 源码位置
// webpack/lib/index.js关键文件: webpack/lib/index.js
3.2 关键断点位置
断点设置:
javascript
// webpack/lib/index.js
// 【断点 1】第 8 行 - webpack 函数入口
function webpack(options, callback) {
// 在这里打断点
const create = require('./create');
// ...
}
// 【断点 2】第 110 行 - create 导入
const create = require('./create');
// 【断点 3】第 117 行 - create 调用
create(options, callback);3.3 调试过程演示
操作步骤:
plaintext
1. 在 webpack/lib/index.js 第 8 行打断点
2. 启动调试(F5 或点击调试按钮)
3. 执行命令:webpack --config webpack.config.js
4. 程序停在第 8 行断点处调试界面操作:
| 操作 | 快捷键 | 说明 |
|---|---|---|
| Continue | F5 | 继续运行到下一个断点 |
| Step Over | F10 | 单步跳过(不进入函数) |
| Step Into | F11 | 单步进入(进入函数内部) |
| Step Out | Shift+F11 | 跳出当前函数 |
3.4 关键代码流程
执行流程:
plaintext
webpack-cli 执行
│
▼
require('webpack')
│
▼
webpack/lib/index.js 第 8 行(断点)
│
▼
第 110 行:导入 create
│
▼
第 117 行:调用 create(options, callback)
│
▼
create 方法内部
│
▼
创建 compiler 对象
│
▼
return compilercreate 方法作用:
javascript
// webpack/lib/create.js(简化示意)
function create(options, callback) {
// 1. 创建 compiler 对象
const compiler = new Compiler(options.context);
// 2. 挂载插件
// 3. 处理配置
// 4. 初始化文件系统
// 5. 返回 compiler
return compiler;
}四、补充说明
4.1 npm link 原理图
plaintext
npm link 工作原理:
第一步:创建全局链接
┌──────────────┐ npm link ┌──────────────────┐
│ webpack/ │ ─────────────────► │ 全局 npm 目录 │
│ (源码目录) │ │ node_modules/ │
└──────────────┘ │ webpack → 源码 │
└──────────────────┘
第二步:项目链接到全局
┌──────────────┐ npm link webpack ┌──────────────────┐
│ webpack-cli/ │ ─────────────────────► │ 全局 webpack │
│ node_modules/│ │ │
│ webpack → │ │ │
└──────────────┘ └──────────────────┘4.2 调试技巧总结
| 技巧 | 说明 |
|---|---|
| 符号链接识别 | 文件名旁出现箭头图标 |
| 断点验证 | 调试时能进入源码即链接成功 |
| 条件断点 | 右键断点可设置触发条件 |
| 调试控制台 | 可在断点处执行代码查看变量 |
4.3 常见问题
| 问题 | 解决方案 |
|---|---|
| 链接后调试仍进入 node_modules | 删除 node_modules 重新安装,再执行 link |
| Windows 权限问题 | 以管理员身份运行终端 |
| 多版本冲突 | 使用 npm unlink 取消链接后重新操作 |
五、学习总结
5.1 核心知识点
- npm link 的作用:将本地包链接到全局,实现跨项目共享
- 调试链路:CLI → require('webpack') → webpack 源码
- 断点位置:webpack/lib/index.js 是核心入口
5.2 调试流程图
plaintext
┌─────────────────────────────────────────────────────────┐
│ 完整调试链路 │
├─────────────────────────────────────────────────────────┤
│ │
│ webpack-cli 源码 │
│ │ │
│ │ npm link webpack │
│ ▼ │
│ node_modules/webpack → 全局 → webpack 源码 │
│ │ │
│ │ 打断点:lib/index.js │
│ ▼ │
│ webpack(options, callback) │
│ │ │
│ ▼ │
│ create() → compiler 创建 │
│ │
└─────────────────────────────────────────────────────────┘5.3 延伸学习
六、本节要点速查
plaintext
问题:调试时 node_modules 中的 webpack 非源码
解决:npm link webpack(在 CLI 项目目录执行)
验证:VS Code 中文件夹显示箭头图标
断点:webpack/lib/index.js 第 8 行、110 行、117 行
效果:调试时可进入真正的 webpack 源码