javascript轻量级前端缓存代理通过cacheproxy与storageadapter组合实现,职责分离、支持智能key/ttl、并发去重、stale-while-revalidate及多扩展点,200行内可实现。

JavaScript 中可以通过面向对象方式封装一个轻量级前端缓存代理,核心是拦截数据请求、自动缓存响应、控制过期与刷新策略,同时保持调用接口简洁(如 cache.get(url))。关键不在于复杂度,而在于职责清晰、可扩展、不侵入业务逻辑。
设计核心类:CacheProxy 与 StorageAdapter
采用组合而非继承,分离「缓存策略」和「存储介质」:
- CacheProxy:对外统一接口,负责 key 生成、过期判断、命中逻辑、回源请求调度;
- StorageAdapter(如 MemoryAdapter / LocalStorageAdapter):只管存取,不关心 TTL 或请求流程;
- 所有异步操作统一返回 Promise,兼容 await 与 .then。
支持智能 key 与 TTL 管理
key 不只是 URL,应包含请求方法、参数序列化、自定义命名空间;TTL 支持绝对时间(毫秒)或相对时间(如 '5m'),并自动写入存储时附带过期时间戳:
- 内部用
JSON.stringify({ data, expiresAt })存储值; - 读取时先检查
expiresAt ,过期则自动丢弃并标记 miss; - 支持手动设置 TTL:
cache.get('/api/user', { ttl: '10m' })。
透明回源 + 并发请求去重
当缓存未命中,需发起真实请求;但多个相同请求并发时,应只触发一次网络请求,其余等待同一 Promise 结果:
- 用 Map 缓存进行中的 Promise:
inFlightPromises.set(key, promise); - 请求完成或失败后,清理该 key 对应的 inFlight 记录;
- 支持可选的「stale-while-revalidate」:命中过期缓存时,先返回旧数据,后台静默刷新。
提供实用扩展点
通过配置项或钩子暴露控制权,避免硬编码:
-
onMiss:缓存未命中时执行的 fetch 函数,默认使用fetch(); -
keyGenerator:自定义函数,接收 url、options、method,返回最终 key; -
onUpdate:每次成功写入缓存后回调,可用于日志或同步到其他存储; - 支持实例级开关:
cache.enable(false)临时关闭缓存,调试友好。
不复杂但容易忽略的是缓存一致性——比如 POST/PUT 请求后,应主动 cache.clearByPattern('/api/user/*') 或监听事件做失效。整个系统 200 行内可实现,重点在接口干净、行为可预测、错误不崩溃。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











