响应式深度取决于 get 拦截中对嵌套对象的递归代理逻辑,而非 Proxy 套层数;需检查是否对 plain object/array 执行 reactive()、是否跳过不可代理类型、是否启用 WeakMap 缓存及循环引用防护。

Proxy 拦截本身不自动深入嵌套结构,所谓“深度”其实是靠 get 拦截中对返回值的类型判断和主动代理 实现的。分析拦截深度,关键不是看 Proxy 套了多少层,而是看哪些属性访问真正触发了 get、哪些返回值被再次代理——这决定了响应式能力的实际覆盖范围。
看 get 拦截是否对嵌套对象做递归代理
这是决定深度的核心逻辑。如果 get 中只返回原始值,那再深的路径也无响应;如果对 plain object / array 等做了 reactive() 包装,才算开启下一层拦截。
- 检查 handler.get 是否包含类似
if (res && typeof res === 'object' && !isRawType(res)) return reactive(res)的分支 - 确认跳过了 Date、RegExp、Promise、函数等不可代理或无需代理的类型
- 注意 null 和 undefined 直接透出,不参与任何代理逻辑
查 WeakMap 缓存是否生效,避免重复代理
没有缓存机制时,同一对象每次被读取都新建 Proxy,不仅浪费内存,还可能引发循环引用或栈溢出。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 确认有类似
const proxyCache = new WeakMap()的缓存结构 - 在 get 中先查缓存:
if (proxyCache.has(res)) return proxyCache.get(res) - 代理后立即存入:
proxyCache.set(res, proxied)
验深度限制与循环引用防护是否启用
深层递归不加约束极易失控,尤其面对大对象或环状结构(如 parent/child 互相引用)。
- 检查是否设置了最大代理层级(例如 depth > 6 就停止递归)
- 确认有循环检测:用另一个 WeakMap 记录当前代理链路中的目标对象,遇到重复 target 就直接返回缓存代理
- 对数组不做逐项代理,而是统一拦截索引赋值和 length 变更,用 trigger 批量通知
测实际触发路径,而非结构层级
响应式深度 ≠ 对象嵌套深度。一个 10 层深但从未被访问的属性,不会产生任何 Proxy;而一个两层深但高频读写的对象,可能已形成完整代理链。
- 在 get/set 中加入 console.log 或 debugger,观察哪些路径真正走到了拦截器
- 修改 state.a.b.c 后,看是否触发了 b 的 set、c 的 set,还是只触发了 a 的 set
- 用 Object.is() 对比新旧值,避免无意义触发(例如 set 同一引用对象)

















