# 一、开始
最近几个月看的源码比较多,记录下一些当下的理解。
# 二、为什么要阅读源码
个人阅读源码的动机主要是好奇心,好奇babel
究竟是如何转化JS的、vue-loader
内部究竟做了什么,再深入一点,webpack
的架构是什么,webpack
和rollup
打包原理是不是一样的、有什么不同?
阅读别人的文章终究不深刻,另外你也不知道他说的对不对,虽然一套套的,但很有可能别人的文章已经过时了。
webpack
的tree-shaking
是很好的例子,很多文章讲的某些案例不能实现tree-shaking
,但webpack
最新版本可能并不是这样。想一想原因,tree-shaking
不生效的原因是因为静态解析不完备、副作用不能排除,当解决了这个问题,就可以更好的进行tree-shaking
。
# 三、怎么阅读源码
如果一个框架有自己的文档的话,首先要读下它的文档,因为它的难度比较低,而且文档中也有对其核心功能、核心API的详细说明,读源码的时候可以重点看下这些对外的接口是怎样实现的。
另外,阅读某些源码可能需要一点门槛,通常是基础知识,比如@babel/core
中广泛用的generator
和gensync
、webpack
中用到的tapable
插件,对这些前置知识不熟悉的话需要补齐。
阅读源码过程中,应该抓住主流程。为什么呢?因为分支可能比你想象中要多,如果一开始就把精力放在每一个分支上,估计很快就放弃。当你对主流程掌握后,然后再阅读感兴趣的细节部分,应该是一个更好的选择。
阅读过程中,在思想层面上,一定要多思考、多对比,想一下为什么这样实现,有什么好处,为什么不那样实现,是不是有更好的实现方式。还可以对比一下与它类似的框架有什么不同,是什么原因造成了这种不同。
在方法层面上,至少是clone
下来,build/dev
下、自己跑一下,写几个demo
。另外,debug
调试、console
打印关键信息、画流程图辅助都是有用的。
读研究生时,一个老师说搞科研要“求源求新”,这句话放到读源码上也适用。”求源“就是看它第一次commit
是怎样的、v1.0.0
是怎样的,它最开始是为了解决什么问题而出现的。”求新“就是看它最新的版本是怎样的,架构有什么改动,加入了什么新的特性。
当你对某个框架有自己的感悟时,可以尝试写一篇文章。自己会和写出来是不一样的,在写的过程中,极有可能发现自己对某些知识点掌握得并不深刻,你需要说服自己,然后才能说服别人。
# 四、阅读源码的好处
一个很重要的好处是拓宽技术视野,即知识的广度和深度。有意思的是,阅读源码可以兼得广度和深度。深度指的是你都阅读源码了,都在学习原理了,还不深吗?广度指的是阅读过程中遇到的其他知识点,比如@babel/parser
中对unicode
的运用,还有上面提到的gensync
,广度的根本原因是很多框架都是站在巨人的肩膀上的。
拓宽技术视野又有什么好处呢?其实就跟“读万卷书,行万里路”一样,首先,当工作中遇到类似问题时,你可能会想到与之前不一样的解决办法,其次,当你想自己写一个框架来解决某个问题时,你可能会有较多的思路和想法。
# 五、什么是技术强
参考尤雨溪的回答 (opens new window),强可以理解为制造影响力的能力,影响力的本质来自于解决问题。如果一个领域的问题被解决得差不多了,那么在这个领域制造影响力的难度就大了许多。要想影响力大,要发现问题,并思考什么才是值得解决的问题,另外具备高质量的解决问题的技术水准。