vue原理实现
Vue 原理实现的核心机制
Vue.js 的核心原理基于响应式系统、虚拟 DOM 和模板编译等技术。以下从关键模块分析其实现机制:
响应式系统
Vue 2.x 使用 Object.defineProperty 实现数据劫持。通过递归遍历数据对象的属性,将其转换为 getter/setter:
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;
dep.notify(); // 触发更新
}
}
});
}
Vue 3.x 改用 Proxy 实现:
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;
}
});
};
依赖收集与派发更新
- Dep 类:管理依赖(Watcher实例)
- Watcher 类:作为中介,触发更新时执行回调
class Dep { constructor() { this.subs = new Set(); } addSub(watcher) { this.subs.add(watcher); } notify() { this.subs.forEach(watcher => watcher.update()); } }
虚拟 DOM 与 Diff 算法
Vue 通过 createElement 函数创建虚拟节点(VNode):
function createElement(tag, data, children) {
return { tag, data, children };
}
Diff 算法采用同级比较策略:
- 新旧节点不同时直接替换
- 相同节点时对比属性(patchProps)
- 子节点对比采用双端比较(头头、尾尾、头尾、尾头)
模板编译流程
- 解析器:将模板字符串转换为 AST(抽象语法树)
- 优化器:标记静态节点
- 代码生成器:将 AST 转换为渲染函数
function compile(template) { const ast = parse(template); optimize(ast); const code = generate(ast); return new Function(`with(this){return ${code}}`); }
组件化实现
组件实例化过程:
- 合并选项(mixins、extends)
- 初始化生命周期
- 建立父子组件关联
- 执行
$mount挂载
生命周期钩子触发时机
beforeCreate:实例初始化后,数据观测前created:数据观测完成beforeMount:挂载开始前mounted:挂载完成后- 更新和销毁阶段也有对应钩子
异步更新队列
Vue 通过 nextTick 实现异步更新批处理:
let callbacks = [];
function nextTick(cb) {
callbacks.push(cb);
if (!pending) {
pending = true;
Promise.resolve().then(flushCallbacks);
}
}
function flushCallbacks() {
callbacks.forEach(cb => cb());
}
插件系统
通过 Vue.use() 注册插件:
Vue.use = function(plugin) {
plugin.install.call(plugin, Vue);
};
以上实现展示了 Vue 如何通过响应式数据绑定、虚拟 DOM 差异更新和模块化设计,构建高效的前端框架。实际源码还包含更多边界情况处理和性能优化细节。







