vue框架实现原理
Vue 框架实现原理
Vue.js 是一个渐进式 JavaScript 框架,其核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。
响应式系统
Vue 通过 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)实现数据劫持。当数据被访问或修改时,依赖收集和派发更新机制会自动触发视图重新渲染。
// Vue 2.x 响应式实现简化版
function defineReactive(obj, key, val) {
Object.defineProperty(obj, key, {
get() {
console.log('get:', key);
return val;
},
set(newVal) {
if (newVal !== val) {
console.log('set:', key);
val = newVal;
// 触发更新
}
}
});
}
虚拟 DOM
Vue 通过虚拟 DOM 优化渲染性能。当数据变化时,会生成新的虚拟 DOM 树,通过 diff 算法比较新旧树的差异,最后仅更新实际变化的部分到真实 DOM。

// 虚拟 DOM 简化结构
const vnode = {
tag: 'div',
props: { id: 'app' },
children: [
{ tag: 'span', children: 'Hello' }
]
};
模板编译
Vue 模板会被编译为渲染函数。编译过程分为三步:解析模板生成 AST(抽象语法树)、优化静态节点、生成可执行的渲染函数代码。
// 模板编译结果示例
const render = function() {
return _c('div', { attrs: { "id": "app" } }, [
_c('span', [_v("Hello")])
]);
};
组件化机制
Vue 组件本质上是带有预设选项的 Vue 实例。组件系统通过递归的方式构建组件树,每个组件维护自己的作用域和生命周期。

// 组件定义示例
Vue.component('my-component', {
template: '<div>A custom component!</div>'
});
核心流程
- 初始化阶段:创建 Vue 实例,初始化数据、计算属性、方法等,建立响应式系统。
- 编译阶段:将模板编译为渲染函数(如果是运行时+编译器版本)。
- 挂载阶段:执行渲染函数生成虚拟 DOM,并转换为真实 DOM 插入页面。
- 更新阶段:当数据变化时,重新执行渲染函数生成新虚拟 DOM,通过 diff 算法高效更新 DOM。
- 销毁阶段:组件实例销毁时,移除所有监听器和子组件。
响应式原理细节
在 Vue 3 中使用 Proxy 实现响应式:
function reactive(obj) {
return new Proxy(obj, {
get(target, key) {
track(target, key); // 依赖收集
return Reflect.get(target, key);
},
set(target, key, value) {
Reflect.set(target, key, value);
trigger(target, key); // 触发更新
return true;
}
});
}
虚拟 DOM Diff 算法
Vue 的 diff 算法采用同级比较策略:
- 只比较同一层级的节点
- 通过 key 属性识别可复用的节点
- 采用双端比较算法优化比对过程
这种设计使得算法复杂度从 O(n³) 降到了 O(n),大幅提升了性能。






