掌握源码阅读的技巧 - Webpack 篇

2021-03-11 13:05:42 +08:00
 FrankFang128

高级前端面试中经常有这么几道题:

  1. 说一说 loader 和 plugin 的区别
  2. webpack 构建流程是怎样的
  3. 编写 webpack loader 的思路
  4. 编写 webpack plugin 的思路

网上能搜到一些答案,但是这些答案我一一看过了,要么过于肤浅留于表面,要么冗长繁杂难以卒读。

如果面试岗位的工资是 20k 以上,面试官必定会追问到更深层次。

因此,我花了一个星期把 Webpack 5 的源码逐行扫了一遍,理出了主要脉络。整个阅读过程我录制成了视频,,总时长不到 3 小时,但把 Webpack 的整体架构、打包思路、loader 实现思路、plugin 实现思路、parser 运行流程等都讲到了,最重要的是,通过视频你会掌握「阅读源码的技巧」。

如果你需要此视频课程,请加微信 xiedaimala03 留言「 webpack 源码课」即可。

接下来是文字教程(文字教程并不适合用来阐述源码,但好在免费):


webpack-cli 是如何调用 wepack 的

webpack = require('webpack')
compiler = webpack(options, callback)

hooks.xxx.call 是什么

Tapable 是 webpack 团队为了写 Webpack 而写的一个事件 /钩子库

用法

定义一个事件 /钩子
this.hooks.eventName = new SyncHook(["arg1", "arg2"]);
监听一个事件 /钩子
this.hooks.eventName.tap('监听理由', fn)
触发一个事件 /钩子
this.hooks.eventName.call('arg1', 'arg2')

Webpack 的整体流程是怎样的

至少有 env init run beforeCompile compile compilation make finishMake seal optimize afterCompile emit 等钩子

读取 index.js 并分析和收集依赖是在哪个阶段?

make - finishMake 阶段

make - finishMake 之间,做了什么

factory.create 中的 factory 是什么东西?

这个 factory 是哪里来的?

是从 factorizeModule(options 的 options.factory 来的。

这个 options.factory 是哪里来的?

是从 moduleFactory 来的。

moduleFactory 哪里来的?

是用 this.dependencyFactories.get(Dep) 得到的。

this.dependencyFactories.get(Dep) 是个啥?

你搜 compilation.tap 就知道,它是 normalModuleFactory,简称 nmf

老师,你 TM 怎么知道要搜这个?

我把所有钩子都搜了,搜了半个小时,能不知道吗?

结论:factory 就是 nmf,所以 factory.create 就是 nmf.craete

nmf.create 做了什么?

addModule 做了什么?

buildModule 做了什么?

Webpack 如何知道 index.js 依赖了哪些文件

Webpack 是怎么把 modules 合并成一个文件的?


今年,我将研读更多前端项目源码并做成新的视频课程,敬请期待。

如果有什么开源项目的源码是你想了解的,欢迎留言。

完。

1183 次点击
所在节点    分享发现
7 条回复
66beta
2021-03-12 14:32:17 +08:00
视频卖多少钱?
FrankFang128
2021-03-12 16:24:55 +08:00
PainAndLove
2021-03-12 20:57:45 +08:00
有 v 友众筹吗
Cbdy
2021-03-14 19:10:45 +08:00
啊这,已经在生产环境用上了 snowpack,感觉良好
467469274
2021-03-15 14:36:15 +08:00
好家伙 我以为是干货呢
lyhiving
2021-03-17 06:17:16 +08:00
一个前端的打包工具居然要这样,除了本文是软文,也层面说明 webpack 是一坨屎
leelz
2021-03-18 15:25:10 +08:00
期待出 vite 源码视频

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/760651

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX