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 面试官系列