很多人对 Webpack 的掌握停留在「会改配置」:能照着文档配 entry、output、loader,能抄一段 splitChunks 的代码,但一旦打包结果不符合预期,或者要写一个自己的插件,就不知道从哪儿下手。这门课针对的正是这个缺口——不是教你多背几个配置项,而是把 Webpack 拆开,看它内部到底怎么把一堆文件变成几个 bundle。

先确认你缺的到底是哪一块

Webpack 的学习断层通常出现在三个位置。第一层是配置层:知道 rules 里写 test 和 use,但说不清 loader 的执行顺序为什么是从右到左,pitch 阶段又是什么。第二层是构建流程层:能跑通打包,但说不清从 entry 到 chunk 再到 asset 中间经历了哪些钩子,tapable 的同步、异步、串行、并行钩子分别在什么场景用。第三层是源码层:想读源码,打开 lib 目录几百个文件直接劝退,不知道该从 Compiler.js 还是 Compilation.js 切入。

如果你在上面任意一层卡过,这门课的内容才对得上。如果你连 loader 和 plugin 的区别都还模糊,建议先补齐基础配置实践,否则直接读源码会变成抄代码。

课程会碰到的几个硬骨头

  • AST 与 Babel:Webpack 处理模块依赖,本质上是对源码做解析、转换、再生成。你需要理解 AST 是什么形态,@babel/parser 和 @babel/traverse 在里面扮演什么角色,为什么 import 语句能被识别成依赖。
  • 依赖图与模块管理:从一个入口文件出发,Webpack 怎么递归收集依赖、怎么去重、怎么把模块映射成 module graph 上的节点,chunk 又是怎么从这张图上切出来的。
  • Loader 原理:loader 不只是「文件转换器」,它是一条可中断、可传递的链。normal 阶段和 pitch 阶段的区别,以及为什么有些 loader 必须写成异步。
  • Plugin 与钩子:tapable 是 Webpack 插件体系的骨架。看懂 SyncHook、AsyncSeriesHook 这些类的实现,才能明白 plugin 里 apply 方法拿到的 compiler 上那些钩子什么时候触发。
  • 源码阅读方法:面对大型源码库,怎么定位主流程、怎么打断点、怎么用一个最小 demo 反推执行路径,这部分比记住某个函数的实现更有长期价值。

配套练习建议这样用

光看源码解析容易产生「看懂了」的错觉。比较有效的做法是:每学完一个模块,自己动手写一个最小实现。比如学完 loader 的 pitch 机制,写一个能在 pitch 阶段提前返回结果的 loader;学完 tapable,手写一个简化版 AsyncSeriesHook;学完插件系统,写一个在 emit 阶段修改输出文件内容的 plugin,然后打断点验证钩子触发顺序。课程里如果有对应的示例工程,不要直接跑通就过,把关键代码删掉自己补一遍,补不出来说明还没真正理解。

另外建议准备一个空项目专门用来做实验,不要在自己负责的业务项目里试手,避免配置改乱后还要花时间恢复。

看完应该能回答这些问题

  • 一个 import 语句从被解析到进入依赖图,中间经过了哪些步骤?
  • loader 的 normal 和 pitch 执行顺序相反,这在实际开发中能解决什么问题?
  • plugin 里的 apply 方法为什么能拿到 compiler?compiler 和 compilation 的区别是什么?
  • tapable 的几种钩子类型分别对应什么使用场景,写错类型会有什么后果?
  • 给你一个打包异常,你能定位到是解析阶段、依赖收集阶段还是生成阶段出的问题吗?

如果这些问题你能不查资料讲清楚,说明这门课的核心内容已经吃进去了。如果还有几道答不上来,回到对应的章节再读一遍源码,比继续往后赶进度更划算。

Webpack源码专精

课程详情

课程介绍

本课程深入解析Webpack的核心原理,从AST、Babel、依赖管理到Loader原理,全面覆盖Webpack的工作流程。课程将带领学员逐步阅读Webpack源码,掌握Webpack插件和高级配置的使用。

适合人群

  • 前端工程师
  • Webpack开发者
  • 对Webpack源码感兴趣的学习者

学习收获

  • 理解Webpack的内部工作原理
  • 掌握Webpack源码阅读技巧
  • 能够自定义Loader和Plugin
  • 精通Webpack高级配置

课程亮点

  • 系统讲解Webpack核心原理
  • 逐行解析Webpack源码
  • 实战Webpack插件和高级配置
  • 提升Webpack开发技能

课程目录

1.AST、Babel、依赖
  1-0.pptx
  1-0.txt
  1-1 babel与AST
  1-2 把let变成var
  1-3 将代码转化为ES5
  1-4 分析index.js的依赖
  1-5 递归地分析嵌套依赖
  1-6 静态分析循环依赖
  课后测试.docx
2.Webpack核心原理
  2-1 webpack 要解决的两个问题
  2-2 编译 import 和 export 关键字
  2-3 把多个文件打包成一个
  2-4 最终文件长什么样子
  2-5 打包器完成
3.Loader原理
  3-1 如何加载 CSS 文件
  3-2 创建 CSS loader
  3-3 发现打包器的问题
  3-4 阅读style-loader源码理解 webpack
  3-5 raw-loader和css-loader源码赏析
  3-6 loader 面试题
4.阅读Webpack源码前的准备
  3 第三种调试方式 yarn link
  4 其他准备工作
  4-1 课程优势
  4-2 两种调试 webpack-cli 的方法
5.逐行于都Webpack源码(上)
  1 分析 webpack-cli 是如何调用 webpack 的
  2 创建编译器 Compiler 的过程
  3 Tapable 是什么
  4 分析 Webpack 的整体流程
  5 Webpack 是如何处理 Entry 的
  6 你怎么知道 facotery 就是 nmf 呢?
  文章.doc
6.逐行阅读Webpack源码(下)
  1 回顾上节课
  2 factory.create 与 module
  3 _source 与 _ast
  4 Webpack 借助 acorn 的 parser 分析 JS
  5 如何用目前的知识在面试官面前装X
  6 Webpack 分析 JS 的过程
  7 Webpack 整体流程复述
  8 你可以看懂别人写的博客了
7.Webpack插件原理
  1 Webpack Plugin 工作机制
  2 插件 1 源码讲解
  3 插件 2 源码讲解
  4 插件 3 源码讲解
  5 loader vs plugin 区别
  6 如何自己写 plugin
  7 看看网上的相关文章
8.Webpack高级配置举例(1)
  1 如何使用课程中的代码
  2 让webpack输出的代码支持IE
  3 用babel-loader打包JS
  4 用babel-loader打包JSX
  5 给webpack配置ESLint插件
  6 用babel-loader打包TypeScript
  7 让ESLint支持TypeScript
  8 用babel-loader打包TSX
  9 科普:CRLF是什么
  10 让JS和TS支持@alias
  11 问答:webpack应学到什么程度
  12 建议:使用src代替@
9.Webpack高级配置举例(2)
  1 让 webpack 支持 SCSS
  2 SCSS 自动 import 全局文件
  3 SCSS 分享变量给 JS
  4 让 Webpack 支持 LESS 文件
  5 LESS 自动引入全局文件
  6 LESS 分享变量给 JS
  7 对比 SCSS 和 LESS
  8 支持 Stylus 文件
  9 Webpack config 重构
  10 在生产环境提取单独的CSS文件
  11 自动生成HTML页面
10.Webpack高级配置举例(3)
  1 Webpack 优化之单独打包 runtime
  2 为什么要单独打包 runtime
  3 Webpack 优化之用 splitChunks 将 node 依赖单独打包
  4 Webpack 优化之固定 moduleIds(不重要)
  5 Webpack 多页面
  6 Webpack 优化之 common 插件
  7 无限多页面的实现思路
Webpack源码.jpg