这次开始学习vue源码的知识,并且把学习的内容都写成笔记,方便以后复习。
这几节最后应该合并起来看,串联后是实现数据驱动的代码,写好了会补上链接
一、VUE源码笔记之new Vue
二、VUE源码笔记之$mount实例挂载
三、VUE源码笔记之render
四、VUE源码笔记之createElement
本节的内容是:了解$mount实例挂载。
1. $mount:实例挂载
我们本次分析的是带 compiler 版本的 $mount 实现。
代码中,首先缓存了Vue原型链上的$mount,然后重新定义了这个方法,先判断el是不是body或者html标签,如果是就抛出警告。

接下来,如果没有render函数,vue会把el或者template转换成render。我们分段来看:
如果有template(el和template都是在new Vue中定义的),且根据template是不是字符串进行不同逻辑处理。

如果没有template就会获取el,并把el处理成字符串。


处理后,生成render函数,把render挂在到option上,这部分我们后面会仔细写。最后执行了mount方法,这个mount方法就是我们之前缓存的$mount,在之前的文件中已经定义过了。

去看缓存的mount方法,发现执行了mountComponent函数。

再去看mountComponent函数,我们还是分成不同部分来看,如果刚刚没有生成render,就会抛出一个 警告。

之后定义了一个UpdateComponent方法,传入到下面的watcher当中。mark是性能埋点用到的逻辑,我们之后执行的else里面的逻辑。


所以我们再去看一下Watcher的定义,Watcher是一个class,上半部分定义了接受参数

然后初始化了一些参数,这些参数我们后期再看,暂时用不到。

下面的逻辑会判断传入的expOrFn是不是一个函数,我们这里传入的是函数,所以会把this.getter赋值为UpdateComponent函数,并且下面执行了get函数

get中又执行了getter方法,也就是执行了UpdateComponent

调用了vm中的_update方法,先执行 _render函数生成VNode(虚拟DOM),然后再执行 _update 更新 DOM。

Watcher 在这里起到两个作用,一个是初始化的时候会执行回调函数,另一个是当 vm 实例中的监测的数据发生变化的时候执行回调函数,这块儿我们会在之后的详细讲。
这里的重点其实就是通过 _render函数生成VNode, _update更新DOM,接下来我们会分析两个函数中的细节部分。