上篇文章我们已经成功地下载了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方法中发现下图中红框里的内容都没有被执行;因此红框里的代码就不用关注了,只用跟随主线看执行了的逻辑;