vue源码实现
Vue 源码实现解析
Vue.js 的核心实现可以分为响应式系统、虚拟 DOM、模板编译、组件化等几个关键部分。以下是对这些核心机制的详细解析。
响应式系统
Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据劫持。当数据发生变化时,依赖该数据的视图会自动更新。
Vue 2 的实现:
- 通过
Object.defineProperty劫持对象的属性,为每个属性添加getter和setter。 - 在
getter中收集依赖(Watcher),在setter中触发依赖更新。
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 的实现:
- 使用
Proxy代理整个对象,拦截所有属性的访问和修改。 - 通过
Reflect操作对象属性,避免直接操作原对象。
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 结构:
const vnode = {
tag: 'div',
props: { class: 'container' },
children: [
{ tag: 'p', children: 'Hello Vue' }
]
};
Diff 算法核心:

- 同级比较,不跨层级对比。
- 通过
key标识节点,优化列表渲染性能。 - 双端比较策略(Vue 3 引入),减少不必要的 DOM 操作。
模板编译
Vue 的模板编译将模板字符串转换为渲染函数。过程分为解析(Parse)、优化(Optimize)和生成(Generate)三个阶段。
解析阶段:
- 将模板字符串解析为抽象语法树(AST)。
- 使用正则表达式和状态机解析标签、属性、文本等。
优化阶段:
- 标记静态节点和静态根节点,避免重复渲染。
- 通过
markStatic和markStaticRoot函数标记。
生成阶段:

- 将 AST 转换为渲染函数的代码字符串。
- 通过
generate函数生成类似_c('div', {...}, [...])的代码。
function compile(template) {
const ast = parse(template);
optimize(ast);
const code = generate(ast);
return new Function(`with(this){return ${code}}`);
}
组件化实现
Vue 的组件化通过 Vue.extend 或 defineComponent 实现。每个组件实例拥有独立的响应式数据、生命周期和模板渲染逻辑。
组件定义:
const MyComponent = {
props: ['message'],
data() {
return { count: 0 };
},
template: `<div>{{ message }} - {{ count }}</div>`
};
组件挂载:
- 通过
Vue.component注册全局组件。 - 在父组件模板中通过
<my-component>使用。
生命周期管理
Vue 组件的生命周期钩子由内部调用,在特定阶段触发用户定义的逻辑。例如:
beforeCreate:实例初始化前。created:响应式数据初始化完成。mounted:DOM 挂载完成。
function callHook(vm, hook) {
const handlers = vm.$options[hook];
if (handlers) {
handlers.call(vm);
}
}
总结
Vue 的源码实现围绕响应式、虚拟 DOM、模板编译和组件化展开。通过数据劫持或代理实现响应式更新,利用虚拟 DOM 和 Diff 算法优化渲染性能,将模板编译为渲染函数,并通过组件化机制实现模块化开发。






