如何阅读框架源代码

无论对于那个段位的 Developer 来讲,读源码都是一件好处颇多的事情,特别于初学者而言,这能迅速的吸纳优秀框架精华代码养分,迅速成长。不巧的是,晦涩难懂的源码,很容易让人心生怯意。今天分享就来谈一谈读源码的方法,但愿能帮到一些有心读源码的朋友编程

1、了解框架解决了什么问题

这不光对读源码有帮助,对整个学习都颇有帮助。思考一个问题:你学习 Vue\React 的缘由,除了它们如日中天,再不学习都很差意思找工做了,还掺杂了一些它们的某些优秀特性能给我带来某某好处的思考么?设计模式

新潮的框架,开发者须要并且也应该去了解,用人单位须要固然是本能的驱动力,什么火学什么也无可厚非,可是在闷声学习以前,须要加上一层思考,相比以前的技术体系,这个框架到底解决了什么问题,优点在哪,怀着目的去学习才不至于迷茫,例如 Vue\React 最大的优势是什么呢?组件化吧,带着框架是如何解决这个问题的疑问去学习,定能事半功倍框架

对于读源码来讲,这一步就更关键了,若是都不了解代码是要干什么的,怎么会清楚它为何这么写呢?再细分一下,在仔细阅读某个模块的文件的时候,也应当对模块的功能有个总体的把握函数式编程

2、了解框架的设计思想

这一步尤其关键,咱们看不懂源码(或者看起来举步维艰),并非由于不懂某一句语法,而是不明白做者的思路。举一个简单的例子:函数

//这个方法能够得到point2顶角的弧度值
    function getAngle(point1, point2, point3) {
        var bb = (point2.y - point1.y)*(point2.y - point1.y) + (point2.x - point1.x)*(point2.x - point1.x);
        var aa = (point3.y - point1.y)*(point3.y - point1.y) + (point3.x - point1.x)*(point3.x - point1.x);
        var cc = (point3.y - point2.y)*(point3.y - point2.y) + (point3.x - point2.x)*(point3.x - point2.x);
        var cosa = (bb + cc - aa)/(2*Math.sqrt(bb)*Math.sqrt(cc));
        return Math.acos(cosa);
    }复制代码

getAngle方法接收三个坐标参数,能够计算出 point2 顶角的弧度值,若是不告诉你这使用了运用三角形的余弦定理,恐怕你看半天也看不出来这是怎么算出来的源码分析

那么咱们能够经过什么渠道去了解框架的设计思想:组件化

  • 到框架的官网看文档,开源的框架,甭管详不详细,这确定是第一手权威资料
  • 到网上搜别人的分析总结(源码分析也不会少),大多数状况下,都会有大神已经研究过了,站在巨人的肩膀上,能省很多事

另外,设计思想是整个框架层面的,对于每个实现细节,又会使用很多设计模式,例如函数式编程(Js 中最为经常使用)、单例模式、代理模式、工厂模式等等,这就须要平时的积累了。有必定代码量的积累以后,建议阅读一些设计模式类的书籍,对本身的代码设计,以及阅读别人的源码,都颇有益处。性能

3、搭建调试环境,摸清执行主脉络

第一节咱们提到,细分到每一个模块,要对模块功能有个总体的把握,如何去作到这个“把握”?除了官方文档和网上查阅的资料,最好的办法就是写一个简单的 Demo,搭建好测试环境,增长一些调试信息,天然能理清除框架的生命周期中,每一步须要调用那个模块(对于目录结构很清晰的优秀框架,有时候也能够凭直觉猜想,打印日志确认)学习

4、分清主次

框架源码就是一颗枝繁叶茂的参天大树,而你要作的事情是从根部网上爬。树要这么多分支,时间又是这么昂贵,阅读的策略很重要。咱们的阅读路径,要以主要流程为主(也就是树的主驱赶,这样才能尽量快的到达顶点),对于一些细枝末节,再这以后再来慢慢啃(或者有必要的时候)
例如,要去阅读 Vue 的源码,有个目录是解析模板,生成语法树 AST 从而最终生成 Render Function 的, 其实这一步最关键的是这个 Render Function 的生成结果,对于如何去解析模板、生成语法树,能够先放一放,回头须要的时候再回头看。不然你很容易卡死在某个点上出不来,从而产生放弃的念头测试

5、坚持不放弃

技术策略得当,遇到棘手过不去的问题也很正常,这个时候考验的就是毅力了,继续调试、搜索资料、或者找个大神来问一问都行,只要不放弃就好~~