如何阅读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方法中发现下图中红框里的内容都没有被执行;因此红框里的代码就不用关注了,只用跟随主线看执行了的逻辑;

相关推荐
Erishen4 小时前
🚀 重新定义前端组件安装体验:shadcn + Bun 的极致开发效率
前端
冬奇Lab4 小时前
Vercel部署全攻略:从GitHub到上线,10分钟让你的前端项目免费拥有自己的域名
前端·后端·node.js
牛马1114 小时前
Flutter Web性能优化标签解析
前端·flutter·性能优化
Bigger4 小时前
Tauri (25)——消除搜索列表默认选中的 UI 闪动
前端·react.js·weui
李少兄5 小时前
简单讲讲 SVG:前端开发中的矢量图形
前端·svg
前端小万5 小时前
告别 CJS 库加载兼容坑
前端·前端工程化
恋猫de小郭5 小时前
Flutter 3.38.1 之后,因为某些框架低级错误导致提交 Store 被拒
android·前端·flutter
JarvanMo5 小时前
Flutter 需要 Hooks 吗?
前端
光影少年5 小时前
前端如何虚拟列表优化?
前端·react native·react.js
Moment5 小时前
一杯茶时间带你基于 Yjs 和 reactflow 构建协同流程图编辑器 😍😍😍
前端·后端·面试