在单页应用中,用 static 属性构建跨实例本地缓存池可行高效,需封装为工具类、使用 map/weakmap、提供 set/get/clear 等方法并支持 ttl,仅限当前标签页共享,不替代服务端缓存。

在单页应用(SPA)中,用 static 属性构建跨实例、常驻内存的轻量级本地缓存池是可行且高效的,关键在于明确它的作用域边界、线程/执行上下文安全、以及与模块系统的配合方式。它不是“真正全局”,但对当前 JS 执行环境(即整个 SPA 运行时)而言,已足够实现统一缓存管理。
静态属性天然适配 SPA 的单实例生命周期
SPA 启动后,类只被定义一次,其 static 属性随类加载初始化,存活至页面卸载。所有组件实例、路由守卫、API 工具类只要导入同一个类,就共享同一份 static 缓存对象——无需事件总线、状态库或 window 挂载。
- 缓存结构建议用
Map或WeakMap(若 value 需自动释放) - 避免裸露
public static cache = new Map(),应封装读写方法,隐藏内部结构 - 不依赖构造函数初始化,确保首次 import 即可用,无竞态风险
封装成可复用、可控制的缓存类
把缓存逻辑收敛到一个工具类中,用 static 方法暴露接口,既保持简洁,又支持后续扩展淘汰策略或监控能力:
- 提供
set(key, value, ttl?)、get(key)、has(key)、clear()等基础操作 - ttl 可选:用
setTimeout+delete实现简易过期(适合短期缓存),或用时间戳 + 懒检查 - key 推荐用字符串或 symbol;若用对象作 key,需保证引用一致,否则 Map 查不到
配合 ES 模块导出,隔离污染不泄露
静态属性本身不会自动挂到 window 上,前提是它定义在模块文件中,并通过 export 显式导出类——未 import 的脚本完全不可见。
- 其他模块只需
import CachePool from './cache-pool.js'即可使用 - 多个组件 import 同一个类,访问的是同一份 static 缓存,天然跨实例共享
- 杜绝
const CACHE = new Map()放顶层的写法,那在非模块环境会变成window.CACHE
注意浏览器多标签/多窗口场景的局限性
static 缓存仅限当前标签页内有效。不同标签页之间不共享,这是正常行为,也是安全性设计。如需跨标签同步,需额外借助 localStorage + storage 事件或 BroadcastChannel。
- 不要误以为 static 缓存能替代 Redis 或服务端 session
- 适合存储用户偏好、接口响应快照、表单草稿、临时计算结果等轻量数据
- 敏感信息(如 token)不建议长期存在 static 缓存中,应结合有效期与手动清理











