vue实现原理图
Vue 实现原理图
Vue 的实现原理主要围绕响应式系统、虚拟 DOM、模板编译和组件化展开。以下是核心原理的分解:
响应式系统
Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据劫持。当数据被访问或修改时,依赖收集和派发更新机制会自动触发视图重新渲染。
- 依赖收集:通过
getter收集当前依赖(如Watcher实例)。 - 派发更新:通过
setter通知所有依赖进行更新,触发重新渲染。
示例代码(Vue 2 响应式核心):
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(); // 触发更新
}
});
}
虚拟 DOM 与 Diff 算法
Vue 将模板编译为虚拟 DOM(VNode),通过 Diff 算法比对新旧 VNode,最小化 DOM 操作。
- Patch 过程:对比新旧 VNode 的差异,局部更新真实 DOM。
- Key 的作用:帮助 Diff 算法识别节点的唯一性,优化复用逻辑。
模板编译
Vue 的模板通过编译器转换为渲染函数(render 函数),分为三个阶段:
- 解析:将模板字符串解析为抽象语法树(AST)。
- 优化:标记静态节点,跳过后续比对。
- 生成:将 AST 转换为可执行的渲染函数代码。
示例渲染函数输出:
function render() {
return _c('div', { attrs: { id: 'app' } }, [_v('Hello World')]);
}
组件化
每个 Vue 组件实例对应一个独立的渲染过程,通过组件树管理父子通信和生命周期。
- 父子通信:
props向下传递,$emit向上触发事件。 - 插槽:内容分发机制,支持作用域插槽。
- 生命周期钩子:如
created、mounted,在特定阶段执行逻辑。
原理流程图概览
- 初始化阶段:创建实例,初始化数据响应式,编译模板。
- 挂载阶段:生成 VNode,执行首次渲染,绑定 DOM 事件。
- 更新阶段:数据变化触发重新渲染,Diff 算法局部更新 DOM。
- 销毁阶段:移除事件监听,清理子组件。
通过结合响应式数据、虚拟 DOM 和组件化设计,Vue 实现了高效且灵活的前端开发体验。







