当前位置: 首页 > news >正文

一. vue2和vue3的Proxy底层源码详细拆解

Vue3 在底层实现上确实通过 Proxy 的懒处理机制编译期的静态分析优化 解决了 Vue2 的性能问题,下面分两部分拆解其底层实现原理:


一、响应式系统:Proxy 的「惰性递归」实现

Vue3 的响应式核心是 Proxy + Reflect,通过 「访问时递归」 的机制实现按需响应式化。具体实现步骤如下:

1. 创建 Proxy 代理
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      const res = Reflect.get(target, key, receiver);
      // 关键点:访问属性时才递归响应式化
      if (isObject(res)) {
        return reactive(res); // 递归响应式化
      }
      track(target, key); // 依赖收集
      return res;
    },
    set(target, key, value, receiver) {
      const result = Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return result;
    }
  });
}

关键机制

  • 惰性递归:只有当访问到某个属性时(例如 obj.a.b),才会对 obj.a 进行响应式化,而不是初始化时递归全部属性
  • 依赖收集:在 get 中通过 track() 记录当前正在运行的 effect(副作用函数)
  • 触发更新:在 set 中通过 trigger() 通知所有关联的 effect 重新执行
2. 依赖关系存储结构
type Dep = Set<Effect>
type KeyToDepMap = Map<any, Dep>
const targetMap = new WeakMap<any, KeyToDepMap>()

// 数据结构示例:
targetMap: {
  [obj]: {
    [key]: [effect1, effect2, ...]
  }
}
  • WeakMap:用对象本身作为键,防止内存泄漏
  • 层级存储:每个对象的每个属性对应一个依赖集合(Set
3. 性能对比示例

假设有对象:

const data = { 
  a: { b: { c: 1 } }, 
  d: { e: 2 } 
}
  • Vue2:初始化时递归处理 a.b.cd.e,共 5 次 defineProperty
  • Vue3
    • 初始化时只处理 data 层(1 次 Proxy)
    • 如果代码中只访问 data.a.b.c
      • 访问 data.a 时处理 a 层(第 2 次 Proxy)
      • 访问 a.b 时处理 b 层(第 3 次 Proxy)
      • d.e 从未被处理

相关文章:

  • Kepware的OPC UA配置深入介绍
  • C++ 中将类的定义和实现都放在头文件中的优缺点分析
  • 【20250215】二叉树:94.二叉树的中序遍历
  • 深入理解Elasticsearch集群与分片:原理及配置方案
  • 【硬件设计细节】缓冲驱动器使用注意事项
  • Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
  • Git 本地项目上传 GitHub 全指南(SSH Token 两种上传方式详细讲解)
  • 代码随想录刷题攻略---动态规划---子序列问题1---子序列
  • 计算机视觉+Numpy和OpenCV入门
  • Plaid | 数据库切换历程:从 AWS Aurora MySQL 到 TiDB 的迁移之旅
  • ⚡️《静电刺客的猎杀手册:芯片世界里的“千伏惊魂“》⚡️
  • LeetCodehot 力扣热题100 从前序与中序遍历序列构造二叉树
  • 尚硅谷课程【笔记】——大数据之Hadoop【一】
  • Codeforces Round 1004 (Div. 2)(A-E)
  • HTML、Vue和PHP文件的区别与联系
  • mybatis-lombok工具包介绍
  • 第十五届蓝桥杯嵌入式省赛真题(满分)
  • Android Studio - 解决gradle文件下载失败
  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析④】
  • 蓝桥杯篇---超声波距离测量频率测量
  • 广东省原省长卢瑞华逝世,享年88岁
  • 金价大跌!足金饰品每克一夜便宜14元,涨势是否已终结?
  • 商务部召开外贸企业圆桌会:全力为外贸企业纾困解难,提供更多支持
  • 上海现有超12.3万名注册护士,本科及以上学历占一半
  • 国羽用冠军开启奥运周期,林丹:希望洛杉矶奥运取得更好成绩
  • 观众走入剧院空间,人艺之友一起“再造时光”