{T}

二、Webpack 与 Webpack CLI 版本对应

2.1 版本要求

官方要求:

code
┌─────────────────────────────────────────┐
│ Node.js  >= 14.15.0                     │
│ Webpack  = 5.x(如 5.88.2)              │
│ Webpack CLI = 5.x(如 5.1.4)            │
└─────────────────────────────────────────┘

查看方式:

code
Webpack 官网 → API → Command Line Interface

2.2 两个项目的关系

code
┌─────────────────────────────────────────┐
│              Webpack                    │
│         (核心打包库)                   │
│         CommonJS 规范                   │
│         处理打包流程                    │
└─────────────────────────────────────────┘
                    ↕
┌─────────────────────────────────────────┐
│            Webpack CLI                  │
│         (命令行工具)                   │
│         TypeScript 编写                 │
│         接收命令行参数                  │
└─────────────────────────────────────────┘

GitHub 仓库:

code
https://github.com/webpack/webpack
https://github.com/webpack/webpack-cli

三、环境搭建完整流程

3.1 项目初始化

bash
# 1. 创建项目目录
mkdir webpack-learn
cd webpack-learn

# 2. 初始化项目
npm init -y

# 3. 创建测试文件
mkdir src
touch src/index.js
touch src/utils.js
touch webpack.config.js

3.2 项目结构

code
webpack-learn/
├── webpack/              # Webpack 源码
├── webpack-cli/          # Webpack CLI 源码
├── src/
│   ├── index.js
│   └── utils.js
├── webpack.config.js
├── package.json
└── node_modules/

3.3 创建测试代码

src/utils.js:

javascript
export function sum(a, b) {
  return a + b
}

src/index.js:

javascript
import { sum } from "./utils.js"
const res = sum(1, 2)
console.log(res)

webpack.config.js:

javascript
module.exports = {
  mode: "development",
  entry: "./src/index.js"
}

3.4 下载源码

方式一:使用 Git Clone

bash
# 下载 Webpack 源码
git clone https://github.com/webpack/webpack.git

# 下载 Webpack CLI 源码
git clone https://github.com/webpack/webpack-cli.git

方式二:下载 ZIP 包

code
1. 访问 GitHub 仓库
2. 点击 Code → Download ZIP
3. 解压到项目根目录

四、源码构建与安装

4.1 官方贡献指南

查看位置:

code
GitHub → webpack/webpack → CONTRIBUTING.md
或
官网 → contributing documentation

官方指导步骤:

code
1. Clone 项目
2. yarn install
3. yarn bootstrap
4. yarn build

4.2 Webpack CLI 构建

步骤一:安装依赖

bash
cd webpack-learn

# 使用 yarn 安装(推荐)
yarn install

# 如果没有 yarn
npm install -g yarn

步骤二:运行 bootstrap

bash
# 安装所有 packages 的依赖
yarn bootstrap

步骤三:构建 Webpack CLI

bash
cd webpack-cli

# 构建 TypeScript
tsc --build

# 或者使用 yarn
yarn build

构建产物:

code
webpack-cli/
├── src/              # TypeScript 源码
├── lib/              # 编译后的 JS
│   └── webpack-cli.js
└── bin/
    └── webpack-cli.js  # 入口文件

4.3 Webpack 构建

查看构建配置:

javascript
// webpack/package.json
{
  "scripts": {
    "build": "tsc --build",
    "prebuild:ci": "yarn install && node scripts/setupBuild.js"
  }
}

构建命令:

bash
cd webpack

# 安装依赖
yarn install

# 构建(如果需要)
yarn build

注意: Webpack 使用 CommonJS 规范,通常不需要额外构建。


作用:

创建软链接,将本地包链接到全局或项目中。

工作原理:

code
┌─────────────────────────────────────────────────────────┐
│                    npm link 工作流程                     │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  步骤 1:npm link(在包目录执行)                        │
│  ┌─────────────┐          ┌─────────────────┐          │
│  │  本地包目录  │  ──────→ │ 全局 node_modules │          │
│  │  webpack/   │   link   │   webpack@local  │          │
│  └─────────────┘          └─────────────────┘          │
│                                                         │
│  步骤 2:npm link webpack(在项目目录执行)              │
│  ┌─────────────┐          ┌─────────────────┐          │
│  │ 项目目录     │  ──────→ │ 全局 node_modules │          │
│  │ node_modules │   link   │   webpack@local  │          │
│  └─────────────┘          └─────────────────┘          │
│                                                         │
└─────────────────────────────────────────────────────────┘

5.2 链接 Webpack CLI

bash
# 进入 webpack-cli 目录
cd webpack-cli

# 链接到全局
npm link

# 验证
webpack --version

5.3 链接 Webpack

bash
# 进入 webpack 目录
cd webpack

# 链接到全局
npm link

# 回到项目根目录
cd ..

# 链接到项目 node_modules
npm link webpack

5.4 验证链接

bash
# 查看全局 node_modules
ls /usr/local/lib/node_modules
# 或(使用 nvm)
ls ~/.nvm/versions/node/v18.15.0/lib/node_modules

# 应该看到:
# webpack -> ../../../webpack-learn/webpack
# webpack-cli -> ../../../webpack-learn/webpack-cli

Webpack CLI 的源码逻辑:

javascript
// webpack-cli/bin/webpack-cli.js

// 检查环境变量
if (process.env.WEBPACK_PACKAGE) {
  // 使用自定义路径
  webpack = require(process.env.WEBPACK_PACKAGE)
} else if (process.env.WEBPACK_IS_CUSTOM) {
  // 使用自定义配置
  webpack = require(process.env.WEBPACK_PACKAGE)
} else {
  // 默认从 node_modules 查找
  webpack = require("webpack")
}

关键点:

code
默认行为:
├── CLI 会从 node_modules 中查找 webpack
├── 如果找不到会提示安装
└── 所以必须在项目 node_modules 中有 webpack

解决方案:
├── 方式一:npm link webpack(推荐)
└── 方式二:设置环境变量 WEBPACK_PACKAGE

环境变量方式(替代方案):

bash
# 设置环境变量
export WEBPACK_PACKAGE=/path/to/webpack/lib/index.js
export WEBPACK_IS_CUSTOM=true

六、VS Code 调试配置

6.1 创建 launch.json

方式一:通过 VS Code 界面

code
1. 点击左侧"运行和调试"
2. 点击"创建 launch.json"
3. 选择 Node.js
4. 修改配置

方式二:手动创建

json
// .vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Webpack",
      "type": "node",
      "request": "launch",
      "program": "${workspaceFolder}/webpack-cli/bin/webpack.js",
      "runtimeVersion": "18.15.0",
      "args": ["--config", "webpack.config.js"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen"
    }
  ]
}

6.2 配置项说明

配置项说明
name调试配置名称
type调试类型(node)
program入口文件路径
runtimeVersionNode.js 版本
args命令行参数
console控制台类型
internalConsoleOptions内部控制台选项

6.3 入口文件定位

Webpack CLI 入口:

javascript
// webpack-cli/bin/webpack.js

// 程序入口
const runCLI = require("../lib/webpack-cli")

// 执行 CLI
runCLI(process.argv)

真正的入口函数:

javascript
// webpack-cli/lib/webpack-cli.js

function runCLI(args) {
  // 读取配置
  // 解析参数
  // 执行打包
}

6.4 调试技巧

常用快捷键(Mac):

快捷键功能
F5开始调试
F9切换断点
F10单步跳过
F11单步进入
Shift+F11单步跳出
Cmd+K Cmd+K折叠代码

调试步骤:

code
步骤 1:在入口文件打断点
    ↓
步骤 2:按 F5 启动调试
    ↓
步骤 3:程序停在断点处
    ↓
步骤 4:使用 F10 单步执行
    ↓
步骤 5:观察变量和调用栈
    ↓
步骤 6:分析执行流程

七、源码阅读技巧

7.1 入口分析

Webpack CLI 执行流程:

code
bin/webpack.js(入口)
    ↓
检查 CLI 是否安装
    ↓
检查 webpack 是否存在
    ↓
加载 webpack 配置
    ↓
runCLI(args)
    ↓
执行打包流程

7.2 关键代码追踪

javascript
// webpack-cli/bin/webpack.js

// 1. 检查 CLI 安装
const cliInstalled = require("./utils/cli-installed")

// 2. 获取包信息
const pkg = require("../package.json")

// 3. 运行 CLI
runCLI(process.argv, pkg)

7.3 阅读顺序建议

code
推荐阅读路径:
├── 1. webpack-cli/bin/webpack.js(入口)
├── 2. webpack-cli/lib/webpack-cli.js(CLI 核心)
├── 3. webpack/lib/webpack.js(Webpack 入口)
├── 4. webpack/lib/Compiler.js(编译器)
└── 5. webpack/lib/Compilation.js(编译过程)

八、常见问题与解决方案

问题原因解决方案
webpack: command not found未执行 npm link在 webpack-cli 目录执行 npm link
Cannot find module 'webpack'node_modules 中无 webpack执行 npm link webpack
TypeScript 编译失败tsc 未安装或配置错误安装依赖后运行 tsc --build
断点不生效入口文件路径错误检查 launch.json 中的 program 路径
调试直接结束没有断点或断点位置不对在正确位置添加断点
Source Map 不显示未生成 Source Map检查 tsconfig.json 的 sourceMap 配置

九、完整流程总结

9.1 环境搭建流程图

code
┌─────────────────────────────────────────────────────────┐
│              Webpack 源码调试环境搭建流程                │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│ 1. 项目初始化                                           │
│    mkdir webpack-learn && cd webpack-learn              │
│    npm init -y                                          │
│    创建测试文件和配置                                    │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│ 2. 下载源码                                             │
│    git clone webpack                                    │
│    git clone webpack-cli                                │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│ 3. 安装依赖                                             │
│    yarn install                                         │
│    yarn bootstrap                                       │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│ 4. 构建项目                                             │
│    cd webpack-cli && tsc --build                        │
│    cd webpack && yarn build(可选)                      │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│ 5. 创建软链接                                           │
│    cd webpack-cli && npm link                           │
│    cd webpack && npm link                               │
│    npm link webpack                                     │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│ 6. 配置 VS Code 调试                                    │
│    创建 launch.json                                     │
│    配置入口文件和参数                                    │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│ 7. 开始调试                                             │
│    在关键位置打断点                                      │
│    按 F5 启动调试                                       │
│    单步执行,分析流程                                    │
└─────────────────────────────────────────────────────────┘

9.2 关键命令汇总

bash
# 初始化
npm init -y

# 安装依赖
yarn install
yarn bootstrap

# 构建 TypeScript
cd webpack-cli && tsc --build

# 创建软链接
cd webpack-cli && npm link
cd webpack && npm link
npm link webpack

# 验证
webpack --version

# 调试
# 使用 VS Code 按 F5 启动

十、学习要点总结

  1. 源码调试是学习 Webpack 的最佳方式
    比看文章更直接,可以深入理解每个步骤

  2. npm link 是本地调试的关键
    理解 npm linknpm link package 的区别

  3. Webpack CLI 用 TypeScript 编写
    需要编译后才能在 Node.js 中运行

  4. 环境变量可以自定义 Webpack 路径
    WEBPACK_PACKAGEWEBPACK_IS_CUSTOM

  5. VS Code 调试配置是标准流程
    与调试普通 Node.js 程序一致


十一、延伸学习资源

官方资源

调试工具

相关知识


十二、思考题

  1. 为什么不直接调试 node_modules 中的代码?

  2. npm link 的工作原理是什么?为什么需要执行两次 link?

  3. Webpack CLI 如何找到 Webpack 核心库?

  4. 如何设置环境变量来指定自定义的 Webpack 路径?

  5. 在调试过程中,你发现了 Webpack 的哪些关键执行步骤?