本人上一篇博文里分析了一下Vue中的模板编译器的原理及其实现方式(如果感兴趣可以去看一下:Vue源码学习之模板编译器原理),如果把Vue看成一辆跑车,模板编译器可以看做是跑车的底盘,那么优化器便可以看做是一种更为轻便的合金材料,跑车没有这种材料,依旧能够正常行驶,但如果将跑车的底盘换成这种材料,便可以使得整个车身更加轻盈,跑得更快。优化器起到的便是通过将生成的抽象语法树中的一些静态节点(所谓静态节点,就是第一次渲染到页面上之后,就不会随着状态的改变而改变的节点)标记出来,在渲染阶段时,这些节点只需要首次渲染,以后无论是状态发生怎样的变化,他都不会变,减少了很多没有必要的diff判断和dom更新的操作,使得vue运行的效率更高。

?上面说了,优化器的原理其实就是标记静态节点,那么,我们要怎么判断哪些节点是静态节点,又要怎么去标记他呢?具体想看一下代码实现,其中有详细的注释解释,就不再赘述了:

 

从上面的源码可以看出,其实优化器只是做了两件事

1、找出静态节点并标记上static=true

2、找出静态根节点并标记上staticRoot=true

当然,只是打上这个标记的话,并没有什么太大的作用,真正起到优化作用的是在patching阶段根据这两个标记,可以绕过这些被标记的静态节点,这样就会节省了很多工作量,至于patching内部是如何判断的,不是本文研究范畴,这里就先不细说,之后整理出patching的文章后在里面在详细分析。