可直接用 localStorage 搭建轻量本地缓存系统,核心是结构清晰(统一对象数组,含 key/value/expires/timestamp)、操作安全(封装 get/set/has/remove,自动处理异常与过期)、边界可控(容量监控、后台清理、跨标签同步)。

直接用 localStorage 就能搭出一个轻量、可靠、免后端的本地缓存系统,关键不是堆功能,而是结构清晰、操作安全、边界可控。
用标准对象数组存数据,别拼字符串
缓存内容建议统一为 JavaScript 对象数组,每个条目带唯一 key 和有效载荷(如 value、expires、timestamp):
- 避免存原始 HTML 片段或拼接字符串——难维护、易出错、无法校验
- 不推荐直接塞函数、undefined、Date 实例等 JSON 不兼容类型
- 示例结构:
[{ key: "theme", value: "dark", expires: 1748229600000 }, { key: "search:vue", value: ["v3", "composition"], timestamp: 1748229540000 }]
封装读写操作,拒绝裸调 API
每次手动 JSON.parse(localStorage.getItem(...)) 容易漏空值、忽略异常。应封装基础方法:
-
get(key):先取字符串,再 try/catch 解析,失败则返回
null并自动清理脏数据 - set(key, value, ttl?):自动添加时间戳和过期时间(毫秒),序列化后写入
- has(key):检查是否存在且未过期
- remove(key):删键 + 清对应元数据(如有)
加一层过期与空间管理,避免“越用越慢”
localStorage 不会自动清理,长期运行可能堆积无效数据:
- 写入时记录
timestamp和预估字节长度(encodeURIComponent(JSON.stringify(val)).length) - 读取时自动跳过已过期项,并在后台触发一次轻量清理
- 总量逼近 4.5MB 时,按时间排序删除最旧的 5 条,防止突爆容量
- 可选:用独立键
cache:index维护 key 列表,支持 LRU 模拟(如最近访问置顶)
监听跨标签变更,保持多页状态同步
用户在另一个标签页改了偏好,当前页需响应——但 storage 事件只在其他同源页触发:
- 写入后主动
dispatchEvent(new Event('cachechange')),让当前页组件订阅该事件 - 对关键缓存(如主题、语言)做 diff 判断,避免无意义重渲染
- 不依赖
storage事件做核心逻辑,仅作辅助通知

















