如何阅读Vue3源码?

上篇文章我们已经成功地下载了Vue3的源码并运行了一个测试实例代码,在这样的一个测试实例代码中,Vue内部是如何执行的呢?本篇文章我们一起探究一下。 我们如何对Vue进行debugger操作呢?我想首先得要开启Vue的source-map功能吧。

如何开启source-map?

source-map功能是可查看到未打包时的代码,而不是查看打包之后的代码。我们来查看一下控制台里的源码,可以看到当前的源码就一个global文件,这对我们的dedugger是非常不友好的。那如何为Vue开启sourceMap呢?

首先看到build命令,执行的是scripts/目录下的build文件;

json 复制代码
"build": "node scripts/build.js",

让我们打开build.js文件,查看一下source-map的逻辑;

这样一行代码是干嘛的呢?这句SOURCE_MAP:true最终会被rollup进行构建,也就是说我们在rollup.config.js,在rollup的配置文件里查看一下source-map的逻辑;

output.sourcemap 取决于等号后面的一串值,等好后面的一串值就是build.js中的SOURCE_MAP:true;也就是说只要build.js里的sourceMap为true,rollup中的sourcemap就为true,这也是开启source-map的关键;

build.js中的sourceMap取决于args.sourcemap或者args.s,那这个args是什么呢?args是27行minimist包中的返回的值; 接着我们来查看一下minimist这个包,点击这里,minimist的介绍里有一个例子; minimist的作用就是执行npm命令的时候去增加一些参数,让我们一起去试一下!

我们的npm的命令在package.json,在build的命令后面添加-b test的代码,接着打印一下build.js中的args对象;

npm run build之后终端已经成功打印了我们刚添加的b参数了;

再回过头看build.js文件中,sourceMap的值取决于args中的sourcemap或者s; 那我们去刚才package.json位置修改一下代码; 这个时候再去打印一下agrs和sourceMap的值,此时sourceMap的值已经变成true了,也就是说在rollup中也成功开启sourceMap功能;

我们来看一下项目是否开启了sourceMap功能,执行npm run build打包命令之后,在packages/vue/dist路径下会生成一个vue.cjs.js.map文件,此时就证明我们已经成功开启sourceMap的功能啦ʚʕ̯•͡˔•̯᷅ʔɞ

如何对Vue进行debugger操作?

我们已经成功开启sourceMap功能了,再来查看一下控制台的源代码;可以看到明显的不同,我们已经能成功看到Vue中具体的模块了,这时我们就可以去进行debugger;上篇文章中的测试实例,我们可以看下reactive做了什么事情。 首先控制台打开reactive.ts文件,找到reactive方法,在前面打上断点,重新刷新页面,当前的代码已经成功进入了reactive方法中,这时我们就成功debugger啦ʚʕ̯•͡˔•̯᷅ʔɞ

如何阅读源代码?

俗话说得好,读书破万卷,下笔如有神;我觉得不仅在写作上是这样,编程也是这样的;只有阅读了好代码,才能写出好代码。

阅读源代码的误区

首先源代码代码量是非常大的,如果我们要求必须读明白每一行代码的意思,那可能一开始就劝退了大家,所以我们需要一条主线,沿着这条主线顺藤摸瓜逐步领会其中的奥秘。

阅读源代码的正确方式

想要高效、轻松的阅读源代码,一定要遵循这两点建议:

1.摒弃边缘情况;

2.跟随一条主线;

摒弃边缘情况:

在大型项目的源码中,会有非常多的业务代码,比如说下图的renderer文件中有一个变量,叫isSVG,是用来标识当前是否是svg图像,那么一定有if和else的逻辑,svg的逻辑在日常中使用的频率并不是很高,所以说它可以被看作是边缘情况先被忽略。

跟随一条主线

对于Vue这种大型项目来说,仅仅是阅读核心代码也是非常多的。Vue的核心可被分成三块: 1.响应时 2.运行时 3.编译器

在上文中的测试实例中,我们在reactive方法中打上断点,重新执行一下发现下图红框中的内容被跳过了;

那我们进入createReactiveObject方法中发现下图中红框里的内容都没有被执行;因此红框里的代码就不用关注了,只用跟随主线看执行了的逻辑;

相关推荐
捂月3 分钟前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
深度混淆10 分钟前
实用功能,觊觎(Edge)浏览器的内置截(长)图功能
前端·edge
Smartdaili China11 分钟前
如何在 Microsoft Edge 中设置代理: 快速而简单的方法
前端·爬虫·安全·microsoft·edge·社交·动态住宅代理
秦老师Q12 分钟前
「Chromeg谷歌浏览器/Edge浏览器」篡改猴Tempermongkey插件的安装与使用
前端·chrome·edge
滴水可藏海13 分钟前
Chrome离线安装包下载
前端·chrome
m512723 分钟前
LinuxC语言
java·服务器·前端
运维-大白同学1 小时前
将django+vue项目发布部署到服务器
服务器·vue.js·django
Myli_ing1 小时前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html
dr李四维2 小时前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
雯0609~2 小时前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存