Jest 本身不直接检测内存泄漏,但可配合 DevTools、MemLab 或 WeakMap/WeakRef 断言构建自动化检查流程:用 Jest 组织触发逻辑并隔离环境,配合外部工具捕获堆状态,实现复现、比对与预防。

Jest 本身不直接检测内存泄漏,它专注逻辑断言和行为验证;但可以配合 DevTools、MemLab 或手动快照比对,构建可复现、可自动化的内存泄漏检查流程。关键不是“用 Jest 写内存测试”,而是用 Jest 组织触发逻辑 + 外部工具捕获状态。
用 Jest 触发泄漏场景并隔离测试环境
单元测试的价值在于稳定复现——把疑似泄漏的操作封装成可重复调用的函数,在 Jest 中控制生命周期:
- 每个 test 块内完成“准备 → 执行 → 清理”闭环,比如挂载/卸载组件、绑定/移除事件、启动/清除定时器
- 用 beforeEach 和 afterEach 确保无残留:清空全局缓存、清除 document.body 子节点、清除 setTimeout ID、重置 WeakMap 外部引用
- 避免在 test 外层定义变量(如
let el),防止闭包意外延长对象存活期 - 导出被测模块时禁用副作用,例如 React 组件加
React.memo或手动清理 ref,让测试更可控
配合 Chrome DevTools 手动快照比对(适合 CI 前验证)
虽不能全自动,但在本地开发或预发环境可固化为步骤:
- 在 Jest 测试中加入
console.log('SNAPSHOT_READY')标记关键节点(如组件 mount 后、unmount 后) - 运行
npx jest --runInBand --no-cache(禁用并发与缓存,保证顺序) - 打开 Chrome → DevTools → Memory 面板 → 点击 “Take heap snapshot” 拍摄两次:一次在标记前,一次在标记后
- 切换到 Comparison 视图,筛选 Retained Size 显著增长且带
(detached)或Closure的条目
用 MemLab 实现自动化内存泄漏检测
Meta 开源的 MemLab 是目前唯一面向 JS 的端到端内存泄漏测试框架,支持与 Jest 协同:
- 安装:
npm install -g memlab,再在项目中写交互脚本(如interactions.js),模拟用户打开弹窗、点击关闭、滚动等操作 - 运行:
memlab run --webpage file://./test.html --interaction-file ./interactions.js - 它会自动启动 Chromium、录制堆变化、生成泄漏报告(含 retainer trace),指出哪段闭包持有 DOM 或大数组
- 可将 MemLab 报告集成进 Jest:用
execSync('memlab ...')调用,失败时抛错,使 CI 失败并附带泄漏堆栈
轻量级预防:在测试中加 WeakMap / WeakRef 断言
不测“有没有泄漏”,而测“是否用了安全引用”——属于代码规范类测试:
- 检查是否误用
Map缓存 DOM 元素:expect(cache.constructor.name).toBe('WeakMap') - 验证 WeakRef 是否被及时释放:
const ref = new WeakRef(obj); obj = null; global.gc?.(); expect(ref.deref()).toBeUndefined()(需 Node 启动加--expose-gc) - 结合 ESLint 插件
eslint-plugin-no-leaking-state,在 test 运行前扫描源码中潜在泄漏模式(如未解绑的 addEventListener)











