vue的实现流程
Vue 的实现流程
Vue 的实现流程主要涉及初始化、模板编译、响应式系统、虚拟 DOM 和渲染等核心模块。以下是 Vue 的基本实现流程:
初始化阶段
-
创建 Vue 实例
通过new Vue()创建实例时,会调用_init方法进行初始化,合并配置、初始化生命周期、事件、渲染函数等。 -
数据观测
使用Object.defineProperty或Proxy(Vue 3)对数据进行劫持,实现响应式。每个数据属性会被转换为 getter/setter,并在依赖收集时建立与 Watcher 的关联。 -
初始化依赖注入与事件
处理provide/inject和父子组件的事件通信机制。
模板编译阶段
-
模板解析
将模板字符串转换为 AST(抽象语法树),解析指令、插值表达式等。 -
优化 AST
标记静态节点,避免重复渲染时不必要的比对。 -
生成渲染函数
将 AST 转换为可执行的渲染函数(render),形式类似:function render() { with(this) { return _c('div', { attrs: { id: 'app' } }, [_v("Hello " + _s(message))]); } }
响应式系统与依赖收集
-
依赖收集
在渲染函数执行时,触发数据的 getter,将当前 Watcher(渲染 Watcher)添加到依赖列表中。 -
派发更新
数据变化时触发 setter,通知依赖的 Watcher 执行更新。Vue 通过异步队列(nextTick)批量处理更新,避免重复渲染。
虚拟 DOM 与渲染
-
生成虚拟 DOM
执行render函数生成虚拟 DOM 树(VNode),描述真实 DOM 的结构。 -
Diff 算法
对比新旧 VNode,通过高效的 Diff 算法(如双端比对)找出最小变更,更新真实 DOM。 -
挂载或更新 DOM
初次渲染时直接挂载到目标节点;后续更新时通过patch方法局部更新 DOM。
生命周期钩子
在流程的关键节点触发生命周期钩子,例如:
beforeCreate:实例初始化后,数据观测前。created:数据观测完成,但 DOM 未生成。beforeMount:渲染函数首次执行前。mounted:DOM 挂载完成。beforeUpdate/updated:数据变化导致重新渲染前后。
Vue 3 的改进
-
响应式系统
使用Proxy替代Object.defineProperty,支持深层响应和数组索引修改。 -
组合式 API
通过setup函数组织逻辑,提高代码复用性。 -
编译优化
引入静态提升(Hoisting)、Patch Flags 等优化手段,减少运行时开销。
示例代码(Vue 2 响应式核心)
class Dep {
constructor() {
this.subs = [];
}
addSub(sub) {
this.subs.push(sub);
}
notify() {
this.subs.forEach(sub => sub.update());
}
}
class Watcher {
update() {
// 触发重新渲染
console.log('视图更新');
}
}
function defineReactive(obj, key, val) {
const dep = new Dep();
Object.defineProperty(obj, key, {
get() {
dep.addSub(new Watcher()); // 模拟依赖收集
return val;
},
set(newVal) {
val = newVal;
dep.notify(); // 触发更新
}
});
}
以上流程涵盖了 Vue 的核心实现机制,具体细节可能因版本不同而有所调整。






