Vue3 完整渲染流程(从 createApp → mount → update → unmount)

Vue3 完整渲染流程(从 createApp → mount → update → unmount)

一句话总纲

创建应用实例 → 解析组件生成渲染函数 → 首次渲染生成 VNode → patch 创建 DOM 挂载到页面
→ 数据变更触发响应式更新 → 异步队列调度重新渲染 → 新旧 VNode 使用优化 Diff 更新 DOM
→ 卸载时清理副作用、移除 DOM


一、初始化阶段:createApp

  1. 调用 createApp(App) 创建应用实例
  2. 初始化全局配置、全局指令、全局组件、插件安装
  3. 内部创建根渲染器 renderer,统一管理 DOM 操作逻辑
  4. 返回 app 实例,等待 mount

二、挂载阶段:app.mount('#app')

  1. 根据选择器获取根容器 DOM
  2. 创建根组件实例
  3. 执行组件初始化流程
    • 处理 props
    • 处理 slots
    • 执行 setup 函数
    • 处理 data、computed、methods 等(兼容 Options API)
  4. 创建响应式系统代理,对 data/reactive/ref 进行 Proxy 劫持
  5. 创建渲染副作用 effect(渲染 effect)
    这是组件更新的核心调度单元
  6. 执行 render 函数生成 VNode
    • 运行时执行编译后的渲染函数
    • 静态节点已提升,动态节点带 PatchFlag
    • 动态节点被收集进 Block Tree 扁平数组
  7. patch(VNode → 真实 DOM)
    • 首次渲染没有旧 VNode,直接创建 DOM 元素
    • 递归创建子节点
    • 处理属性、样式、事件、指令
  8. 将生成好的 DOM 插入到根容器
  9. 触发 onMounted 生命周期

三、更新阶段:数据变化 → 视图更新(最核心)

  1. 修改响应式数据 → 触发 set 代理
  2. trigger 派发更新 ,找到收集的渲染 effect
  3. effect 被标记为待执行,放入异步更新队列
  4. 队列通过 nextTick(微任务) 调度,避免同步多次更新
  5. 微任务执行:批量执行所有待更新的渲染 effect
  6. 组件重新执行 render,生成新 VNode
  7. 新旧 VNode 进行 Diff + patch
    • 只走 Block Tree 里的动态节点数组
    • 根据 PatchFlag 靶向更新,只对比动态部分
    • 同层级子节点使用双端比较 + 最长递增子序列 LIS
    • 尽可能复用 DOM,最少移动、最少创建删除
  8. 完成 DOM 更新
  9. 触发 onUpdated

四、卸载阶段:unmount

  1. 触发 onBeforeUnmount
  2. 递归卸载子组件
  3. 清理所有副作用
    • 停止渲染 effect
    • 移除依赖收集(dep 清理)
    • 移除事件监听、定时器、DOM 引用
    • 取消指令绑定
  4. 从父级移除真实 DOM
  5. 触发 onUnmounted

三者如何嵌入整个流程(必加分总结)

  • 响应式
    贯穿全程,负责在数据变化时精准触发组件的渲染 effect,控制更新范围。
  • 编译优化
    在 render 生成 VNode 时生效,提前标记动态内容、提升静态节点,让 Diff 极轻。
  • Diff 算法
    在更新 patch 时生效,用最小 DOM 操作完成视图更新

面试满分口述版(直接背)

  1. createApp 初始化应用、安装插件、创建渲染器;
  2. mount 创建组件实例、执行 setup、初始化响应式、创建渲染 effect,执行 render 生成 VNode,通过 patch 创建 DOM 并挂载;
  3. 更新时,数据变化触发 trigger,把渲染 effect 加入微任务队列,批量执行重新渲染,生成新 VNode;
  4. 结合 Block Tree、PatchFlag 做靶向 Diff,再通过双端比对 + LIS 实现最少 DOM 操作;
  5. unmount 时递归清理副作用、移除 DOM、完成卸载。
  6. 整个流程由响应式控制更新范围,编译优化减少 Diff 成本,Diff 最小化 DOM 操作,形成高效可预测的渲染体系。
相关推荐
前端Hardy2 小时前
Pinia 比 Vuex 好用 10 倍?Vue3 状态管理终于不折磨人了!(新手复制即用)
前端·javascript·vue.js
前端Hardy2 小时前
Vue3 的 v-model 双向绑定,90% 的人都用错了?(附 2026 最新避坑指南)
前端·javascript·vue.js
前端Hardy2 小时前
救命!Vue3 的 Composition API,居然能让我少写 80% 冗余代码?(新手也能直接抄)
前端·javascript·vue.js
李剑一2 小时前
前端必懂!一文搞懂 WebAssembly:Web/Electron/RN 全通用,你天天用的软件,底层都靠它
前端·webassembly
Definition3 小时前
Claude Code 能养宠物了,体验下抽卡的感觉
前端·程序员
Daiyaosei3 小时前
紧急安全警报:Axios npm 包被投毒事件详解与防护指南
前端·javascript·安全
We་ct3 小时前
LeetCode 295. 数据流的中位数:双堆解法实战解析
开发语言·前端·数据结构·算法·leetcode·typescript·数据流
青槿吖3 小时前
第一篇:Redis集群从入门到踩坑:3主3从保姆级搭建+核心原理一次性讲透|面试必看
前端·redis·后端·面试·职场和发展·bootstrap·html
美狐美颜sdk3 小时前
2026主流直播美颜sdk对比:效果、算法与成本分析
前端·人工智能·计算机视觉·美颜sdk·直播美颜sdk·第三方美颜sdk·视频美颜sdk