vue核心实现
Vue 的核心实现原理
Vue 的核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 核心实现的关键点:
响应式系统
Vue 通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据的响应式绑定。当数据发生变化时,依赖该数据的视图会自动更新。
-
Vue 2 的响应式实现:
function defineReactive(obj, key, val) { Object.defineProperty(obj, key, { get() { console.log(`get ${key}: ${val}`); return val; }, set(newVal) { if (newVal !== val) { console.log(`set ${key}: ${newVal}`); val = newVal; // 触发更新 } } }); } -
Vue 3 的响应式实现:
const reactive = (target) => { return new Proxy(target, { get(target, key, receiver) { console.log(`get ${key}`); return Reflect.get(target, key, receiver); }, set(target, key, value, receiver) { console.log(`set ${key}: ${value}`); Reflect.set(target, key, value, receiver); // 触发更新 return true; } }); };
虚拟 DOM
Vue 通过虚拟 DOM 优化渲染性能。虚拟 DOM 是一个轻量级的 JavaScript 对象,用于描述真实 DOM 的结构。当数据变化时,Vue 会生成新的虚拟 DOM,并通过 Diff 算法比较新旧虚拟 DOM 的差异,最终只更新必要的真实 DOM。
- 虚拟 DOM 示例:
const vnode = { tag: 'div', props: { id: 'app' }, children: [ { tag: 'span', props: { class: 'text' }, children: 'Hello Vue' } ] };
模板编译
Vue 的模板会被编译成渲染函数。模板编译过程包括:
- 解析模板生成 AST(抽象语法树)。
- 优化 AST,标记静态节点。
- 生成渲染函数代码。
- 渲染函数示例:
function render() { return h('div', { id: 'app' }, [ h('span', { class: 'text' }, 'Hello Vue') ]); }
组件化机制
Vue 的组件化是通过自定义元素和生命周期钩子实现的。每个组件都是一个独立的实例,拥有自己的模板、数据和方法。
- 组件定义示例:
const MyComponent = { data() { return { message: 'Hello' }; }, template: `<div>{{ message }}</div>` };
Vue 的更新机制
Vue 通过异步更新队列优化性能。当数据变化时,Vue 不会立即更新 DOM,而是将更新任务推入队列,在下一个事件循环中批量执行。
-
更新队列示例:
let queue = []; let flushing = false; function queueUpdate(watcher) { if (!queue.includes(watcher)) { queue.push(watcher); } if (!flushing) { flushing = true; Promise.resolve().then(flushQueue); } } function flushQueue() { queue.forEach(watcher => watcher.run()); queue = []; flushing = false; }
Vue 的生命周期
Vue 组件的生命周期包括创建、挂载、更新和销毁阶段。每个阶段都有对应的钩子函数,如 created、mounted、updated 和 destroyed。
- 生命周期钩子示例:
const Component = { created() { console.log('Component created'); }, mounted() { console.log('Component mounted'); } };
以上是 Vue 核心实现的关键点,涵盖了响应式系统、虚拟 DOM、模板编译和组件化机制。







