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

ops/2025/2/13 14:38:08/

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


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

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

1. 创建 Proxy 代理
javascript">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. 性能对比示例

假设有对象:

javascript">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 从未被处理


http://www.ppmy.cn/ops/158062.html

相关文章

【Elasticsearch】Elasticsearch检索方式全解析:从基础到实战(二)

接着上一篇文章&#xff1b;我们继续来研究es的复杂检索 文章目录 (1) bool用来做复合查询&#xff08;2&#xff09;Filter【结果过滤】&#xff08;3&#xff09;term&#xff08;4&#xff09;Aggregation&#xff08;执行聚合&#xff09; (1) bool用来做复合查询 复合语…

Java面试:a+=a-=aa原理解析

Java面试&#xff1a;aa-a*a原理解析 aa-a*a属于Java基础中比较难以理解的&#xff0c;面试中也经常会遇到这个问题&#xff0c;本篇博客对此问题进行分享总结。 1.问题代码 public static void main(String[] args) {int a 2;aa-a*a;System.out.println("a"a);}我…

从0到1构建 Kubernetes中间件运维平台:标准化、可视化与全栈运维的最佳实践|得物技术

一、项目背景 传统运维的痛点与挑战 在传统的中间件运维过程中&#xff0c;存在以下几个突出问题&#xff1a; 管理分散&#xff1a;不同中间件&#xff08; Kafka和Elasticsearch&#xff09;都有独立的管理台&#xff0c;运维逻辑分散&#xff0c;难以形成统一规范。成本高…

【Linux系统】—— 简易进度条的实现

【Linux系统】—— 简易进度条的实现 1 回车和换行2 缓冲区3 进度条的准备代码4 第一版进度条5 第二版进度条 1 回车和换行 先问大家一个问题&#xff1a;回车换行是什么&#xff0c;或者说回车和换行是同一个概念吗&#xff1f;   可能大家对回车换行有一定的误解&#xff0…

【学习笔记】计算机网络(三)

第3章 数据链路层 文章目录 第3章 数据链路层3.1数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本功能3.1.3 其他功能 - 滑动窗口机制 3.2 点对点协议PPP(Point-to-Point Protocol)3.2.1 PPP 协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP 协议的工作状态 3.3 使用广播信…

【网络安全.渗透测试】Cobalt strike(CS)工具使用说明

目录 前言 一、工具显著优势 二、安装 Java 运行环境 三、实验环境搭建要点 四、核心操作流程详解 (一)环境准备与连接步骤 (二)主机上线与深度渗透流程 五、其他实用功能应用指南 (一)office 宏 payload 应用 (二)Https Payload 应用 (三)信息收集策略 …

使用EVE-NG-锐捷实现ACL访问控制

一、ACL基础知识 ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是网络安全和访问控制领域的重要概念 1.定义与基本原理 ACL是网络设备&#xff08;如路由器、交换机等&#xff09;中用于控制网络流量和访问权限的机制&#xff0c;由一系列规则组…

【C++】解锁<list>的正确姿势

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…