Vue3 里的 WeakMap 是干什么用的?深度理解响应式系统的内存管理

小墨同学_6427

小墨同学_6427

2026-05-23

178人浏览

原创

vue3用weakmap缓存原始对象与proxy代理映射,核心是防止内存泄漏:其弱引用特性确保组件卸载后对象被gc自动回收,避免普通map强引用导致的依赖残留。

vue3 里的 weakmap 是干什么用的?深度理解响应式系统的内存管理

Vue3 用 WeakMap 来缓存原始对象和它对应的 Proxy 代理之间的映射关系,核心目的不是“提速”,而是“不泄漏”——让响应式对象在组件卸载后能被垃圾回收器自动清理,无需手动干预。

WeakMap 存什么?为什么非它不可?

它只存一层关键映射:原始对象(target)→ 它的 Proxy 实例。比如你对 { count: 0 } 调用 reactive(),Vue 就把该对象作为 key、生成的 Proxy 作为 value 存进 WeakMap。

  • 同一对象多次调用 reactive() 时,WeakMap 可快速命中并复用已有代理,避免重复代理和递归陷阱
  • 键只能是对象,且是弱引用——这意味着它不参与 JavaScript 的可达性判定
  • 只要这个原始对象在其他地方失去所有强引用(比如组件实例被销毁、变量设为 null),GC 就会立刻回收它,连带 WeakMap 中的条目也一并消失

它怎么防止内存泄漏?对比普通 Map 就明白了

如果改用普通 Map 做缓存,问题就来了:Map 对 key 是强引用。即使组件已卸载,Map 还牢牢“抓着”那个原始对象,导致对象无法被 GC 回收,依赖它的 effect、Proxy、甚至整个组件状态都滞留在内存里。

vue-composition-api-best-practices
vue-composition-api-best-practices

Vue 3 组合式 API 与

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.2万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.5万人学习