vue核心实现
Vue 的核心实现
Vue.js 的核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是这些核心机制的具体实现方式:
响应式系统
Vue 2.x 使用 Object.defineProperty 实现响应式,通过劫持对象的属性访问和修改来触发依赖收集和更新。每个被劫持的属性会关联一个 Dep 实例,用于管理依赖(即 Watcher 实例)。
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(); // 触发更新
}
});
}
Vue 3.x 改用 Proxy 实现响应式,能够直接监听对象而非属性,并支持动态新增属性。

function reactive(obj) {
return new Proxy(obj, {
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;
}
});
}
虚拟 DOM 与 Diff 算法
Vue 通过虚拟 DOM 描述真实 DOM 结构,并在数据变化时生成新的虚拟 DOM,通过 Diff 算法比较新旧虚拟 DOM 的差异,最小化 DOM 操作。
function patch(oldVnode, vnode) {
if (!oldVnode) {
createElm(vnode);
} else {
if (sameVnode(oldVnode, vnode)) {
patchVnode(oldVnode, vnode);
} else {
const parent = oldVnode.parentNode;
parent.replaceChild(createElm(vnode), oldVnode.el);
}
}
return vnode.el;
}
Diff 算法采用同层比较策略,通过双指针优化对比过程,优先处理头尾节点。

模板编译
Vue 的模板会编译为渲染函数(render 函数),分为以下步骤:
- 解析:将模板字符串转换为 AST(抽象语法树)。
- 优化:标记静态节点,避免重复渲染。
- 生成代码:将 AST 转换为可执行的渲染函数代码。
function compile(template) {
const ast = parse(template);
optimize(ast);
const code = generate(ast);
return new Function(`with(this){return ${code}}`);
}
组件化机制
Vue 的组件是一个扩展的 Vue 实例,通过 Vue.extend 或 defineComponent 创建。组件化实现包括:
- 生命周期管理:从创建到销毁的钩子调用。
- Props 传递:父组件向子组件传递数据。
- 事件通信:子组件通过
$emit触发父组件事件。 - 插槽机制:内容分发支持。
const ChildComponent = {
props: ['message'],
template: `<div>{{ message }}</div>`
};
new Vue({
components: { ChildComponent },
template: `<child-component message="Hello" />`
});
总结
Vue 的核心实现结合了响应式数据绑定、虚拟 DOM 的高效更新、模板编译的灵活性和组件化的模块设计,使其在开发效率和性能之间取得了平衡。Vue 3 的改进(如 Proxy 和 Composition API)进一步提升了灵活性和性能。






