想看源码但是无从下口怎么办?

· 浏览次数 : 168

小编点评

前言 不少同学都有过类似的经历,年初时制定了学习英语和源码的详细年度计划,但实际执行时却屡屡失败。本文将分享一些关于如何查看源码的心得,以及如何有效地学习和掌握Vue源码。 一、学习英语的方法 1. 制定详细计划:在年初时,为自己制定一份关于学习英语的详细年度计划,包括每天的学习任务、时间安排等。 2. 坚持执行:尽量按照计划执行,遇到困难时及时调整。 3. 多样化学习:通过听、说、读、写等多种方式学习,提高英语综合能力。 4. 参加交流活动:多参加英语角、语言交换等活动,与母语为英语的人交流,提高口语和听力水平。 二、学习源码的方法 1. 选择合适的项目:根据自己的兴趣和能力,选择适合学习源码的项目,如Vue、React等。 2. 查看源码结构:在查看源码之前,先了解源码的整体结构,可以使用`git log`或`git tree`等命令查看提交历史和目录结构。 3. 从宏观到微观:先从整体上了解源码的架构和流程,然后再深入到具体的实现细节。 4. 动手实践:通过阅读源码、编写代码、调试程序等方式,逐步加深对源码的理解。 5. 参与社区讨论:加入相关社区,与其他开发者交流学习心得,解决遇到的问题。 三、其他建议 1. 保持耐心和毅力:学习源码和学习英语都需要时间和努力,要保持耐心和毅力,不断积累经验。 2. 及时总结和反思:在学习过程中要及时总结自己的经验和教训,反思自己的不足之处,以便更好地改进和提高。 3. 寻求帮助和支持:在学习过程中遇到困难时,可以向老师、同学或专业人士寻求帮助和支持。 总之,学习英语和源码需要付出一定的时间和努力,但只要坚持不懈地学习和实践,就一定能够取得进步和成功。希望本文的经验和建议能够对大家有所帮助。

正文

前言

相信不少同学都有欧阳这种情况,年初的时候给自己制定了一份关于学习英语源码的详细年度计划。但是到了实际执行的时候因为各种情况制定的计划基本都没有完成,年底回顾时发现年初制定的计划基本都没完成。痛定思痛,第二年年初决定再次制定一份学习英语源码的详细年度计划,毫无疑问又失败了。

经过多年的摸索,对于如何查看源码欧阳终于有了一些自己的心得。有的同学还想问英语有什么心得没,不要问,再问欧阳哭给你看。

关注公众号:【前端欧阳】,给自己一个进阶vue的机会

一看源码就头晕

网上有一种说法是从头开始看,假如源码是一个线团,那么找到线团的头子,顺着头子向下捋就能将源码了解的七七八八了。

这种方法对于查看小项目的源码是没有问题,因为小项目的分支逻辑不多,复杂度也不高,顺着线团的头子向下捋确实能够搞清楚整个项目。

但是对于vue这种大型项目就不适用了,大型项目里面的分支逻辑特别多,而且每个分支的复杂度也很高。大型项目的源码就像是一棵树,那么我们找的线团的头子只是这棵树的根节点。

看源码的时候你从树的根节点向下走,下面有多个子节点。选了一个子节点接着向下走,结果发现这个子节点下面又有多个子节点。再次选了一个子节点向下走,结果发现还是有很多子节点,重复几次后你可能就把自己给搞的头晕了。

出现这个问题的原因是你查看源码的时候没有一个明确的目标,因为大型项目的源码分支流程是超级多的。没有明确的目标一头扎进源码中就会迷失在源码的海洋中,这个明确的目标就是我们查看vue源码要搞清楚的问题。

如何接手一个复杂的新项目

想想你平时接手一个不熟悉并且很复杂的新项目你会怎么办?

我的做法是先查看项目的README.md,了解项目是如何运行起来的。

然后再查看项目的目录,对整个项目的结构有一点了解。

接着就是找到了解项目的测试或者产品,让他给我讲讲项目的大体流程和重要概念,这个时候可能听不懂或者听了就忘了,没关系,有个印象就可以了。

最后就是接到项目的迭代需求,从需求对应的代码出发开始了解项目。等需求做得足够多时,基本就将整个项目的代码过了一遍,此时我们已经完全接手这个项目了。

像接手新项目一样搞清楚源码

我们这里以vue举例,vue其实也是一个普通的js项目。本质上和我们的工作中接手的新项目没什么区别,对于查看vue源码我们也可以复用上面这个套路。

第一步:查看contributing.md文件

查看源码的contributing.md文件,这个文件就像是我们项目中的README.md。开源项目希望更多的人参与进来所以一般都会有个contributing.md文件。这个文件里面会教你源码项目是如何跑起来,项目结构是什么样的,怎么参与进来开发。

第二步:查看源码结构

第二步和接手新项目是一样的,查看vue源码的目录,让你对整个vue源码的结构有一些了解。

第三步:对源码大体流程和重要概念有初步印象

到了第三步就有问题了,不可能叫尤大充当测试或者产品的角色过来给我讲vue的大体流程和重要概念吧?此时我们可以换个思路,网上有很多讲解vue源码的文章或者书籍。可以让这些源码文章或者书籍充当测试和产品的角色。通过阅读这些vue源码文章或者书籍,你就能对vue的大体流程和重要概念有了初步的印象。

网上的文章都参差不齐,如何挑选出优质文章呢?

以掘金为例,你就在掘金上面去搜索vue源码。然后找出时间最近的,点赞和收藏最多的文章,这样找出来的文章基本都是优质且未过时文章(墙裂推荐欧阳的vue源码文章)。

当然如果你在之前没有接触过vue源码,第一次看vue源码文章或者书籍可能看不懂或者比较吃力。没关系,我们这一步只是让你对vue源码有个初步的印象就可以了。

第四步:带着问题去debug源码

直到这一步之前我们所做的事情都是让自己对源码有个大致的印象,最终想要看得懂源码还是得要自己上手去debug。

做项目时我们是通过不断的做业务需求,从而了解整个项目。在vue源码这里就是从一个你想要了解的具体问题出发,通过debug调试vue源码将这个问题搞清楚。这个问题就是我们在查看源码时的目标,和这个问题不相关的源码全部都忽略。

这种情况你带着问题去debug查看源码,此时的源码对于你来说就不是一棵树了,而是围绕着这个问题的一条线。我们的目标也很单纯,只是将这条线上面的源码搞清楚就行了。当你把这个问题搞清楚了后,在你的脑子里面关于vue源码就有一条线了。

还有一个进阶玩法,将“通过debug源码把某个问题搞清楚的过程”用自己的话说出来,这就形成了一篇优秀的源码文章,欧阳的所有源码文章都是这样写出来的

每个问题在我们脑子里都是一条关于vue源码的一条线,当我们搞清楚足够多问题时,这些线连到一起就形成了一棵vue源码树。

看到这里有的小伙伴就有疑问了,那么问题又从哪里来啊?

我们每天写代码就在用vue,vue提供了很多黑魔法,难道你对这些黑魔法不感兴趣吗?

举个例子,在vue的文档中有写defineProps是一个宏函数。所以我们使用他的时候不需要从vue中import导入,那么你有没有好奇过为什么他不需要从vue中import导入呢?

为了搞清楚这个问题,我们需要先找到线团的线头子。而这个线头子毫无疑问就是@vitejs/plugin-vue插件,vue文件就是由这个插件处理的。给这个线头子打上断点,顺着断点向下走,只关心和defineProps相关的代码。最终我们就找到在一个compileScript函数中,会将源代码中的defineProps宏函数给remove掉,并且同时会生成一个props属性,由于defineProps宏函数经过编译后已经被remove掉了,所以就不需要从vue中import导入。

我们知道vue是一个编译时和运行时同时存在的框架,编译时说白了就是代码运行在nodejs阶段,运行时代码跑在在浏览器中。所以在debug源码的时候有时是在编译时进行,有时是在运行时进行。

在接下来的文章中我们会给你讲一些编译时和运行时debug源码的小技巧,如果你有更好用的技巧欢迎在评论区留言。

编译时debug源码小技巧

想要在编译时debug源码,首先我们需要启动一个debug终端。这里以vscode举例,打开终端然后点击终端中的+号旁边的下拉箭头,在下拉中点击Javascript Debug Terminal就可以启动一个debug终端。
debug-terminal

在debug终端执行对应的启动命令,比如yarn dev,断点将会停留在我们打断点的代码处。此时会有这样一排操作按钮,如下图:
step

上面的一排操作按钮欧阳平时debug源码时一般就使用了前四个,分别是:Continue(继续)、Step Over(单步跳过)、Step Into(单步调试)、Step Out(单步跳出)。

  • 第一个按钮Continue(继续):点击这个按钮后会让代码执行到下一个断点。

  • 第二个按钮Step Over(单步跳过):执行到下一条语句,如果下一条语句是函数,不会走进函数内部。

  • 第三个按钮Step Into(单步调试):执行到下一条语句,如果下一条语句是函数,将会走进函数内部。

  • 第四个按钮Step Out(单步跳出):跳出当前函数内部,断点将会走到外部调用当前函数的地方。

不一定每个问题你都能找到对应的线头子,这时你就不知道从哪里开始打断点了。比如还是defineProps宏函数,假如你不知道应该从@vitejs/plugin-vue插件开始打断点,那这种情况我们应该怎么办呢?

答案很简单,在源码中去搜索defineProps关键字,将搜索到的结果都打上断点。然后启动项目,发现代码走进了我们打的断点中,如下图:
call-stack

此时左侧的Call Stack调用栈就能派上用场了,他里面存了当前函数的所有调用栈。比如当前断点是停留在processDefineProps函数中,从Call Stack调用栈我们就能知道这个函数就是由compileScript调用的,而compileScript函数又是由resolveScript函数调用的。并且可以通过点击函数名就可以跳转到对应的函数中,并且恢复当时的上下文。

整个Call Stack调用栈是一条线,我们要找的问题的线头子就在这条线中。我们带着问题去debug源码的时候只需要将在Call Stack调用栈中,线头子后面的一系列函数逻辑搞清楚就行了。

运行时debug源码小技巧

大家都知道vue文件经过编译后会变成js文件,那么如何找到编译后的js文件给他打上断点呢?
network

很简单在network面板中找到对应的请求,这里我想找的是index.vue文件。然后右键,在弹出的菜单中选择第一个Open In Sources Panel。浏览器将会切换到source面板中,并且自动打开编译后的index.vue文件,然后我们就可以在这个文件中给对应的代码打断点。

关于Continue、Step Over这几个按钮,还有Call Stack调用栈都是和编译时是一样的,在这里我们就不赘述了,欢迎补充其他小技巧。

总结

大型项目的源码可以理解为是一棵树,如果我们直接从树的根节点开始去看源码肯定会被源码的各种分支逻辑搞的头晕。此时我们可以换个思路,按照以下四步去查看源码:

  • 查看源码的contributing.md文件,这个文件里面会教你源码项目是如何跑起来,项目结构是什么样的,怎么参与进来开发。

  • 通过查看源码目录让你对源码结构有个初步的印象。

  • 通过查看源码文章或者书籍让你对源码大体流程和重要概念有初步印象。

  • 带着你想要了解的问题去debug调试源码,和问题不相关的源码全部忽略掉。此时的源码就不再是一棵树,而是一条线,我们只需要将这条线的源码搞清楚就行了。当我们搞清楚足够多问题时,这些线将会汇聚成一棵树。

关注公众号:【前端欧阳】,给自己一个进阶vue的机会

与想看源码但是无从下口怎么办?相似的内容:

想看源码但是无从下口怎么办?

相信不少同学都有欧阳这种情况,年初的时候给自己制定了一份关于学习英语和源码的详细年度计划。但是到了实际执行的时候因为各种情况制定的计划基本都没有完成,年底回顾时发现年初制定的计划基本都没完成。痛定思痛,第二年年初决定再次制定一份学习英语和源码的详细年度计划,毫无疑问又失败了。

N 年前,为了学习分库分表,我把 Cobar 源码抄了一遍

10 几年前,互联网产业蓬勃发展,相比传统 IT 企业,互联网应用每天会产生海量的数据。 如何存储和分析这些数据成为了当时技术圈的痛点,彼时,分库分表解决方案应运而生。 当时最流行的 Java 技术论坛是 javaeye ,有位淘宝的技术人员分享了一篇分库分表的文章 ,这篇文章,我反复看了几十遍,想

2022 ICPC 杭州站

gym 知乎 尝试先读题而不是写缺省源感觉不太好 E 一头雾水。F 是签到就先上去写了,结果读错题交了个样例都没过的代码,小改了一下就过了。G 不太会做。zsy 把 M 丢给我想了一下 然后 gjk 把 D 过了。看榜发现 K 过了很多人,需要快速判断比较两个字符串等价于比较哪两个字符,反应了一下才

三星电视无法下载《条款和条件、隐私政策》的问题 (消息代码: 0-1)

因为想看一部影片引发的对三星电视 app 功能的探索,没有重刷固件、没有远程协助,解决问题的方案居然是再简单不过的手机热点,将解决过程记录下来希望能帮到更多的三星中国用户,从一个侧面见证了三星产品在中国大陆退潮的缩影…

2023年最新sentinel-dashbord部署安装(保姆级别)

[TOC] # Sentinel-dashboard安装下载 ### 前景提要 * 想看开源项目,有一个设计到这个工具,由于官方文档主要是在描述和开发相关的,对于很多只想使用界面的用户十分不友好,因此写了这个文章给那些只需要使用的小伙伴,希望对您有帮助,多多支持点赞。 ## 一、 构建环境 | 软件

无需学习Python,一个公式搞定领导想看的大屏

> 摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 **不要让“做不了”成为数字化转型的障碍** 随着数字化的脚步加快,越来越多的企业开始注重数

[转帖]优化工作中的取舍和大势判断

最近这段时间在参与一个优化项目,所以思考优化的事情比较多。因此最近的文章中,优化相关的内容会比较多,如果有朋友想看些其他方面的题材,可以留言告知。实际上我每天写的东西大多数都是前一天的思想内容,凭空找个话题来写上一篇,时间长了肯定会越来越空洞无物,我也没有那个本事,脑子里的积累写上几年还游刃有余。关

记一次 .NET某培训学校系统 内存碎片化分析

## 一:背景 ### 1. 讲故事 前些天有位朋友微信上找到我,说他们学校的Web系统内存一直下不去,让我看下到底是怎么回事,老规矩让朋友生成一个dump文件丢给我,看一下便知。 ## 二:WinDbg 分析 ### 1. 托管还是非托管 要想看托管还是非托管,可以用 `!address -sum

[转帖]Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)

https://www.cnblogs.com/PatrickLiu/p/8527770.html 一、介绍 今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分。话不多说,开始我们今天的讲解。如果要想看第一篇文章,地址如下:http://www.cnbl

vscode编写markdown

1. 需求分析 2. 环境搭建 1. 需求分析 最近在网上折腾了好久Markdown的写作环境,作为一个普通用户,总结一下个人对于Markdown写作环境的几点需求。由于本人刚接触Markdown不久,因此,需求也比较简单,想看具体搭建步骤的可以直接跳到第二章环境搭建: 本地存储。这一点主要是出于隐