Vue 实例挂载的过程中发生了什么?
答:
仔细阅读 new Vue() 的执行过程,可以得到以下结论:
1. _init 初始化流程
- 调用
_init(options)完成实例初始化:合并 options、初始化生命周期、初始化事件中心、初始化渲染、初始化 data / props / methods / watch / computed。 - 其中
initState方法完成 props / data / methods / watch / computed 的初始化。
2. 模板编译与挂载
- 调用
vm.$mount方法进入挂载阶段。 - 如果存在 render 函数则直接使用;否则将 template 编译成 render 函数(涉及 parse / optimize / generate 三个步骤)。
- 编译生成 render 函数后,挂载到 vm 上并再次调用 mount 方法。
3. _render 生成 VNode
render函数的作用主要是生成 VNode。
4. _update 转为真实 DOM
_update主要功能是调用patch,将 VNode 转换为真实 DOM,并更新到页面中。
5. mountComponent 渲染组件
updateComponent方法主要执行在 Vue 初始化时声明的 render 和 update 方法。new Watcher(vm, updateComponent, ...)把 updateComponent 接入响应式系统:当依赖变化时自动重渲染。
new Vue(options)
└─ _init(options)
├─ merge options
├─ initLifecycle
├─ initEvents
├─ initRender
├─ initState (props/data/methods/watch/computed)
└─ callHook('beforeCreate') / 'created'
└─ $mount(el)
└─ mountComponent
└─ new Watcher(updateComponent)
├─ vm._render() // 生成 vnode
└─ vm._update(vnode) // patch -> 真实 DOM
来源整理自:vue3js.cn 面试官系列



