当前位置:首页 > VUE

vue 实现原理比较

2026-02-19 01:34:21VUE

Vue 2 实现原理

Vue 2 的核心实现基于响应式系统虚拟 DOM。响应式系统通过 Object.defineProperty 劫持数据的 gettersetter,在数据变化时触发依赖更新。虚拟 DOM 则通过 diff 算法比对变化,高效更新真实 DOM。

  • 响应式系统
    初始化时递归遍历 data 对象,为每个属性添加 getter/setter。依赖收集通过 DepWatcher 实现,每个属性对应一个 DepWatcher 在渲染时触发 getter 并订阅 Dep,数据变化时 Dep 通知所有 Watcher 更新。

  • 虚拟 DOM
    模板编译为 render 函数,生成虚拟 DOM 树。通过 patch 方法对比新旧虚拟 DOM,计算出最小变更(如节点增删、属性更新),批量更新到真实 DOM。

    vue 实现原理比较

  • 模板编译
    模板通过 vue-template-compiler 转换为 render 函数,包含静态优化(标记静态节点避免重复渲染)。

Vue 3 实现原理

Vue 3 在响应式系统和编译优化上做了重大改进,性能显著提升。

vue 实现原理比较

  • 响应式系统
    使用 Proxy 替代 Object.defineProperty,支持动态添加/删除属性,无需递归初始化。依赖跟踪通过 effect(类似 Watcher)和 ReactiveEffect 实现,Proxyget/set 拦截更高效。

  • 虚拟 DOM 优化
    引入 Block TreePatch Flags

    • Block Tree:动态节点按结构划分,减少 diff 范围。
    • Patch Flags:标记动态节点类型(如 CLASSSTYLE),跳过静态节点比对。
  • 编译优化
    模板编译时生成更高效的 render 函数:

    • 静态提升:将静态节点提取为常量,避免重复创建。
    • 事件缓存:缓存内联事件处理函数,减少不必要的更新。

核心差异对比

特性 Vue 2 Vue 3
响应式 Object.defineProperty Proxy
虚拟 DOM 全量 diff 基于 Patch Flags 的靶向更新
性能 需递归劫持数据,初始化较慢 按需响应,初始化更快
Composition API 无(需 Mixins) 支持逻辑复用

代码示例

Vue 2 响应式实现片段

function defineReactive(obj, key) {
  const dep = new Dep();
  let val = obj[key];
  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) dep.depend(); // 收集依赖
      return val;
    },
    set(newVal) {
      val = newVal;
      dep.notify(); // 触发更新
    }
  });
}

Vue 3 响应式实现片段

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key); // 依赖收集
      return target[key];
    },
    set(target, key, value) {
      target[key] = value;
      trigger(target, key); // 触发更新
    }
  });
}

标签: 原理vue
分享给朋友:

相关文章

vue实现全文检索

vue实现全文检索

Vue 实现全文检索的方法 客户端全文检索(适用于小型数据集) 使用 flexsearch 或 lunr.js 等轻量级库实现前端全文检索: import FlexSearch from 'flex…

vue实现密码框的包

vue实现密码框的包

Vue 密码框实现方案 在 Vue 中实现密码框功能,可以通过原生 HTML 结合 Vue 指令或使用第三方组件库完成。以下是几种常见方案: 原生 HTML + Vue 双向绑定 <temp…

vue实现RTMP

vue实现RTMP

Vue 中实现 RTMP 流播放 RTMP(Real-Time Messaging Protocol)是一种用于实时音视频流传输的协议。在 Vue 中实现 RTMP 播放通常需要借助第三方库或播放器。…

vue实现slot

vue实现slot

Vue 中的 Slot 实现方法 Vue 的 slot 是一种内容分发机制,允许父组件向子组件插入内容。以下是几种常见的 Slot 实现方式: 默认 Slot 子组件通过 <slot>…

vue nexttick实现

vue nexttick实现

Vue 中 nextTick 的实现原理 Vue 的 nextTick 是一个用于在下次 DOM 更新循环结束之后执行延迟回调的方法。它的核心实现依赖于 JavaScript 的事件循环机制。 基…

vue实现双向

vue实现双向

Vue 实现双向绑定的方法 Vue 的双向绑定主要通过 v-model 指令实现,它结合了数据绑定和事件监听,适用于表单元素(如 input、select、textarea 等)。以下是几种常见的实现…