一、响应式系统:数据的"监控摄像头"
响应式系统是 Vue 的心脏。当数据变化时,它能自动通知界面更新。Vue 3 用 Proxy 实现这一切。核心流程就三步:① 读数据时,Proxy 的 get 陷阱悄悄把当前副作用函数存入"依赖桶";② 改数据时,set 陷阱把桶里所有函数都执行一遍;③ 视图 render 函数就在桶里,于是自动重新渲染。
二、编译器:把模板"翻译"成函数
你写的 <template> 不能直接跑在浏览器里,编译器要把它翻译成 JavaScript 的 render() 函数。编译的关键优化是 PatchFlag:编译器在生成代码时就标注了"这个节点哪里会变",运行时 Diff 时直接跳过静态内容,只检查有标记的节点。这是 Vue 3 比 Vue 2 快很多的核心原因之一。
三、Virtual DOM 与 Diff 算法:最聪明的"找不同"Virtual DOM 的精髓是先在 JS 里比较,再最小化操作真实 DOM。直接操作真实 DOM 很慢,JS 对象操作很快。Diff 就是找出新旧两棵虚拟树的差异,只把"不一样的部分"同步到真实 DOM。
四、完整渲染流程:一个组件从出生到更新注意右侧的**调度器(Scheduler)**这一步非常重要:当你在一次事件里连续修改 10 个数据,Vue 不会更新 DOM 10 次,而是把它们合并成一次更新,这就是 nextTick 的原理——等当前批次全部执行完,再统一刷新 DOM。
五、互动演示:响应式依赖追踪
点击下面的按钮,亲眼看看响应式系统是怎么工作的:试试点击**"连续修改 5 次(看合并)"**,你会看到调度器把 5 次变化合并为 1 次 DOM 更新——这正是 nextTick 等待的那个"批次"。
总结:Vue 的三大支柱
| 支柱 | 核心机制 | 一句话 |
|---|---|---|
| 响应式 | Proxy + 依赖收集 | 数据是"被监视"的,变了自动通知 |
| 编译优化 | PatchFlag + 静态提升 | 编译时就标注"哪里会变",运行时跳过静态 |
| Virtual DOM | Diff + 最小化 patch | 先在 JS 里找不同,再最小代价改真实 DOM |
三者协同:响应式系统发现数据变了 → 通知运行时重新执行 render → 编译器生成的 VNode 带着 PatchFlag → Diff 只比较有标记的节点 → 精确 patch 到真实 DOM。这条流水线运转一次,你的界面就更新了。