Appearance
Vue 3 响应式系统:Proxy、effect、track 与 trigger
主题边界
- Vue 3 响应式系统不是一句“Vue 2 用 defineProperty,Vue 3 用 Proxy”就能讲完。
- 真正核心是 Monorepo 下的包职责拆分、依赖收集图和调度器如何把状态变化转成组件更新。
机制与流程
@vue/reactivity负责响应式,@vue/runtime-core负责组件实例、scheduler 和渲染主链,@vue/runtime-dom负责 DOM 平台适配,@vue/compiler-*负责模板编译。- 响应式内部以
targetMap -> depsMap -> dep(Set<ReactiveEffect>)组织依赖;读取时track()收集当前activeEffect,写入时trigger()找到依赖集合并触发调度。 - 组件渲染 effect 不会每次同步直跑,而是交给 scheduler 合并、去重、排序后再刷新。
关键差异
- Vue 2 的
defineProperty很难完整覆盖属性新增、删除、数组索引和集合类型;Vue 3 的 Proxy + Reflect 覆盖更完整。 - Vue 3 的性能提升不只在代理能力,还来自编译器与运行时分离、Block Tree、PatchFlags 和更细的组件更新边界。
边界条件
- 响应式层只回答“谁依赖了谁”,不直接决定 DOM 如何 patch;patch 逻辑仍在 runtime 层。
- Proxy 不是性能银弹,真正收益来自依赖图、调度批处理和编译优化共同作用。
工程落点
- 理解
@vue/reactivity和@vue/runtime-core的边界后,源码阅读、性能分析和副作用治理都会更清晰。 - 这道题如果能把 Monorepo、依赖图和 scheduler 串起来,已经明显高于 API 背诵层。