vue内部实现原理
Vue 内部实现原理
Vue.js 的核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其核心原理的详细解析:
响应式系统
Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据劫持。当数据被访问或修改时,依赖收集和派发更新机制会自动触发视图更新。
- 依赖收集:每个响应式属性关联一个
Dep实例,用于存储依赖(Watcher)。 - 派发更新:数据变化时,
Dep通知所有Watcher执行更新。
示例代码(Vue 2 响应式核心):
function defineReactive(obj, key, val) {
const dep = new Dep();
Object.defineProperty(obj, key, {
get() {
if (Dep.target) dep.depend(); // 收集依赖
return val;
},
set(newVal) {
if (newVal === val) return;
val = newVal;
dep.notify(); // 触发更新
}
});
}
虚拟 DOM 与 Diff 算法
Vue 通过虚拟 DOM 优化渲染性能。当数据变化时,生成新的虚拟 DOM 树,与旧树通过 Diff 算法比较差异,最小化 DOM 操作。

- Patch 过程:通过
sameVNode判断节点是否可复用,按层级比较(不跨级)。 - Key 的作用:帮助识别节点身份,优化列表更新效率。
模板编译
Vue 模板通过编译生成渲染函数:
- 解析:将模板转换为 AST(抽象语法树)。
- 优化:标记静态节点,跳过 Diff。
- 生成代码:将 AST 转换为可执行的渲染函数。
示例输出:

// 模板: `<div>{{ message }}</div>`
function render() {
return _c('div', [_v(_s(message))]);
}
组件化机制
组件实例化时,Vue 会执行以下流程:
- 初始化生命周期、事件、响应式数据。
- 调用
$mount挂载组件,触发渲染和更新。
父子组件通信通过 props(父 → 子)和 $emit(子 → 父)实现,跨层级通信依赖 provide/inject 或全局状态管理(如 Vuex)。
Vue 3 的优化
- Proxy 响应式:替代
Object.defineProperty,支持数组和动态属性。 - Composition API:逻辑复用更灵活,替代 Options API 的碎片化问题。
- 性能提升:静态树提升(Hoisting)、补丁标志(PatchFlags)等优化 Diff 效率。
代码示例(Vue 3 响应式):
const reactive = (target) => {
return new Proxy(target, {
get(target, key, receiver) {
track(target, key); // 依赖收集
return Reflect.get(target, key, receiver);
},
set(target, key, value, receiver) {
Reflect.set(target, key, value, receiver);
trigger(target, key); // 触发更新
return true;
}
});
};






