你想搞懂 Vue 3 从代码到页面渲染、数据更新、再到销毁的全过程,我用通俗语言 + 核心原理给你讲透,不搞玄学、不堆术语。
Vue 3 的核心运行机制可以浓缩为 4 大阶段 + 2 大核心引擎:
4 阶段:编译 → 挂载 → 更新 → 卸载 2 引擎:响应式系统(Proxy) + 虚拟 DOM + 渲染器
一、先搞懂:Vue 3 两大核心引擎
这是整个运行机制的地基,所有流程都围绕它们转。
1. 响应式引擎(数据驱动视图)
Vue 3 使用 ES6 Proxy 实现响应式(替代 Vue 2 的 Object.defineProperty)。
- 作用:监听数据的 读取/修改/删除
- 原理:
- 把你的普通数据(
ref/reactive)包装成代理对象 - 读取数据时 → 收集依赖(记录谁用到了这个数据)
- 修改数据时 → 触发更新(通知用到它的地方重新渲染)
- 把你的普通数据(
一句话:数据变 → 自动通知视图更新
2. 虚拟 DOM + 渲染引擎(高效更新页面)
- 虚拟 DOM(VDOM):用 JS 对象模拟真实 DOM,轻量、快
- 渲染器:负责把 VDOM 变成真实 DOM 渲染到页面
- Diff 算法:数据更新时,只对比变化的部分,最小化修改 DOM
一句话:不直接操作 DOM,用 JS 对象做对比,只改需要改的地方
二、Vue 3 完整运行流程(4 大阶段)
从你写的代码 → 显示在页面上 → 数据变化 → 销毁,全程如下:
阶段 1:编译阶段(template → 渲染函数)
你写的 <template> 不会直接被浏览器识别,必须先编译。
- 编译器把模板编译成 render 函数(虚拟 DOM 生成函数)
<div>{{ msg }}</div> <!-- 编译后变成 --> render() { return h('div', this.msg) } - 会做优化(Vue 3 独有):
- 标记静态节点(永远不变的内容,直接跳过 Diff)
- 标记动态节点(只对比变化的属性/文本)
- 提升静态节点(只创建一次,复用)
编译结果:生成可执行的渲染代码,为挂载做准备。
阶段 2:挂载阶段(首次渲染)
执行 createApp(App).mount('#app') 时触发。
完整流程:
- 创建组件实例 → 初始化
setup、生命周期、响应式数据 - 执行 render 函数 → 生成 虚拟 DOM 树(VDOM)
- 渲染器工作:
- 遍历 VDOM → 创建真实 DOM
- 把 DOM 插入页面 → 页面首次显示
- 依赖收集:
- 渲染时读取了响应式数据 → 记录“这个数据被组件使用了”
- 建立 数据 ↔ 视图 的关联
挂载完成:页面显示出来,响应式关系已建立。
阶段 3:更新阶段(数据变 → 视图变)
当你修改 ref/reactive 数据时触发:
- 触发代理拦截:Proxy 监听到数据被修改
- 派发更新:通知所有“依赖这个数据”的组件
- 重新执行 render:生成新的 VDOM 树
- Diff 对比:
- 新老 VDOM 快速对比
- 只找出变化的节点
- 打补丁(Patch):
- 渲染器只修改真实 DOM 中变化的部分
- 不变的内容完全不动
更新完成:视图高效刷新,性能极高。
阶段 4:卸载阶段(组件销毁)
组件消失、路由切换时触发:
- 执行
onUnmounted生命周期 - 销毁组件实例
- 移除真实 DOM
- 清空依赖、取消监听、释放内存
- 销毁子组件(递归)
卸载完成:防止内存泄漏。
三、一张图看懂核心链路(极简版)
模板编译 → render函数
↓
数据初始化 → 响应式代理(Proxy)
↓
执行render → 生成VDOM → 生成真实DOM → 页面显示(挂载)
↓
数据修改 → Proxy拦截 → 通知更新
↓
重新render → 新VDOM → Diff对比 → 只改变化DOM(更新)
↓
组件销毁 → 移除DOM → 释放内存(卸载)
四、Vue 3 相比 Vue 2 的机制升级(重点)
- 响应式升级:Proxy 替代 defineProperty
- 支持数组下标/长度修改
- 支持对象新增/删除属性
- 性能更好、支持更多数据类型
- 编译优化:静态提升、补丁标记
- Diff 算法只对比动态部分,速度提升 1.3~2 倍
- 按需引入:Tree-Shaking 更小体积
- 组合式 API:逻辑复用更友好,运行时更高效
五、最核心的 3 句话总结
- Vue 3 是数据驱动:一切从修改数据开始,视图自动更新。
- 靠 Proxy 实现响应式:监听数据,收集依赖,触发更新。
- 靠虚拟 DOM 高效渲染:不直接操作 DOM,只更新变化部分。