vue 实现原理比较
Vue 2 实现原理
Vue 2 的核心实现基于响应式系统和虚拟 DOM。响应式系统通过 Object.defineProperty 劫持数据的 getter 和 setter,在数据变化时触发依赖更新。虚拟 DOM 则通过 diff 算法比对变化,高效更新真实 DOM。
-
响应式系统
初始化时递归遍历data对象,为每个属性添加getter/setter。依赖收集通过Dep和Watcher实现,每个属性对应一个Dep,Watcher在渲染时触发getter并订阅Dep,数据变化时Dep通知所有Watcher更新。 -
虚拟 DOM
模板编译为render函数,生成虚拟 DOM 树。通过patch方法对比新旧虚拟 DOM,计算出最小变更(如节点增删、属性更新),批量更新到真实 DOM。
-
模板编译
模板通过vue-template-compiler转换为render函数,包含静态优化(标记静态节点避免重复渲染)。
Vue 3 实现原理
Vue 3 在响应式系统和编译优化上做了重大改进,性能显著提升。

-
响应式系统
使用Proxy替代Object.defineProperty,支持动态添加/删除属性,无需递归初始化。依赖跟踪通过effect(类似Watcher)和ReactiveEffect实现,Proxy的get/set拦截更高效。 -
虚拟 DOM 优化
引入Block Tree和Patch Flags:- Block Tree:动态节点按结构划分,减少
diff范围。 - Patch Flags:标记动态节点类型(如
CLASS、STYLE),跳过静态节点比对。
- Block Tree:动态节点按结构划分,减少
-
编译优化
模板编译时生成更高效的render函数:- 静态提升:将静态节点提取为常量,避免重复创建。
- 事件缓存:缓存内联事件处理函数,减少不必要的更新。
核心差异对比
| 特性 | Vue 2 | Vue 3 |
|---|---|---|
| 响应式 | Object.defineProperty |
Proxy |
| 虚拟 DOM | 全量 diff |
基于 Patch Flags 的靶向更新 |
| 性能 | 需递归劫持数据,初始化较慢 | 按需响应,初始化更快 |
| Composition API | 无(需 Mixins) | 支持逻辑复用 |
代码示例
Vue 2 响应式实现片段
function defineReactive(obj, key) {
const dep = new Dep();
let val = obj[key];
Object.defineProperty(obj, key, {
get() {
if (Dep.target) dep.depend(); // 收集依赖
return val;
},
set(newVal) {
val = newVal;
dep.notify(); // 触发更新
}
});
}
Vue 3 响应式实现片段
function reactive(obj) {
return new Proxy(obj, {
get(target, key) {
track(target, key); // 依赖收集
return target[key];
},
set(target, key, value) {
target[key] = value;
trigger(target, key); // 触发更新
}
});
}






