Vue3响应式原理源码解析(通俗易懂版)
一、Vue3响应式核心流程
-
reactive():
- 通过Proxy代理目标对象
- 拦截get/set/deleteProperty等操作
- 使用Reflect执行默认行为
-
依赖收集:
- get时通过track函数收集依赖(当前执行的effect)
- 使用WeakMap建立"target -> key -> dep"的映射关系
-
触发更新:
- set时通过trigger函数通知所有依赖更新
- 采用调度器机制优化执行顺序
二、核心源码片段解析
// reactive实现
function reactive(target) {return createReactiveObject(target, reactiveHandlers)
}// Proxy处理器
const reactiveHandlers = {get(target, key, receiver) {track(target, get, key) // 依赖收集return Reflect.get(...arguments)},set(target, key, value, receiver) {const result = Reflect.set(...arguments)trigger(target, set, key) // 触发更新return result}
}
三、性能优化亮点
-
Proxy代替defineProperty:
- 无需递归初始化所有属性
- 完美支持数组和新增属性
-
依赖存储结构升级:
- WeakMap避免内存泄漏
- 依赖关系树形存储
-
effect调度机制:
- 支持异步批量更新
- 可自定义调度策略
四、与Vue2对比
特性 | Vue2 | Vue3 |
---|---|---|
实现方式 | defineProperty | Proxy |
数组处理 | 需要hack处理 | 原生支持 |
新增属性 | 需要$set | 自动响应 |
提示:调试响应式系统时,可以使用Vue3提供的
toRaw()
查看原始对象