认识
一、认识
Virtual DOM
就是用一个原生的 JS
对象去描述一个 DOM
节点,所以它比创建一个 DOM
的代价要小很多。在 Vue.js
中,Virtual DOM
是用 VNode
这么一个 Class
去描述。
VNode
生成过程如下:
-
组件实例初始化,最后执行
$mount
进入挂载阶段-
如果是只包含运行时的
vue.js
,只直接进入挂载阶段,因为这时候的组件已经变成了渲染函数,编译过程通过模块打包器 +vue-loader
+vue-template-compiler
完成的 -
如果没有使用预编译,则必须使用全量的
vue.js
-
-
挂载时如果发现组件配置项上没有
render
选项,则进入编译阶段 -
将模版字符 串编译成
AST
语法树,其实就是一个普通的JS
对象 -
然后优化
AST
,遍历AST
对象,标记每一个节点是否为静态静态;然后再进一步标记出静态根节点,在组件后续更新时会跳过这些静态节点的更新,以提高性能 -
接下来从
AST
生成渲染函数,生成的渲染函数有两部分组成:-
负责生成动态节点
VNode
的render
函数 -
还有一个
staticRenderFns
数组,里面每一个元素都是一个生成静态节点VNode
的函数,这些函数会作为render
函数的组成部分,负责生成静态节点的VNode
-
-
接下来将渲染函数放到组件的配置对象上,进入挂载阶段,即执行
mountComponent
方法 -
最终负责渲染组件和更新组件的是一个叫
updateComponent
方法,该方法每次执行前首先需要执行vm._render
函数,该函数负责执行编译器生成的render
,得到组件的VNode
-
将一个组件生成
VNode
的具体工作是由render
函数中的_c
、_o
、_l
、_m
等方法完成的,这些方法都被挂载到Vue
实例上面,负责在运行时设置组件配置信息,然后通过new VNode(组件信息)
生成组件的VNode
-
_c
负责生成组件或HTML
元素的VNode
,_c
是所有render helper
方法中最复杂,也是最核心的一个方法,其它的_xx
都是它的组成部分-
接收标签、属性
JSON
字符串、子节点数组、节点规范化类型作为参数
-