最可靠方式是封装自定义类,统一存储结构为{value, expiresAt},set(key,value,ttlMs)写入、get(key)自动校验过期并清理,支持异常处理与命名空间前缀。

localStorage 本身不支持过期机制,所有数据默认永久存在。要模拟“原生逻辑”般的过期行为,最可靠的方式是封装一个自定义类,把时间判断、序列化、清理等细节全部收拢在内部,对外暴露类似原生 setItem/getItem 的简洁接口,同时确保每次读写都自动完成过期校验。
用类封装统一存储结构
核心是固定数据格式:每个键对应一个对象,含 value(原始值)、expiresAt(到期时间戳,毫秒)。不拼接字符串、不依赖外部状态,所有逻辑闭环在类实例内。
- 写入时计算
expiresAt = Date.now() + ttlMs,再整体 JSON 序列化存入 - 读取时必须先解析,再比对
Date.now() > item.expiresAt,过期则立即removeItem并返回null - 字段名统一用
expiresAt,避免和ttl或maxAge混淆,语义明确
提供标准方法签名,贴近原生体验
类方法命名和参数顺序尽量与原生 Storage 一致,降低迁移成本:
-
set(key, value, ttlMs):第三个参数为毫秒数,例如storage.set('token', 'abc', 3600000)表示 1 小时后过期 -
get(key):自动校验,不过期才返回value,否则清空并返回null -
remove(key)和clear():直接代理到底层 localStorage,不额外加时间逻辑
必须处理异常与边界情况
真实环境中 localStorage 可能被手动篡改、磁盘满、跨设备同步不一致,类需主动防御:
- 每次
JSON.parse都包裹try/catch,解析失败即视为无效项,直接清理并返回null - 读取到
null或非对象值时,不报错,安静返回null - 写入时捕获
QuotaExceededError等异常,仅 warn,不中断流程 - 不假设
expiresAt一定存在或为数字,校验前先做类型判断
可选但推荐:添加命名空间前缀隔离
避免污染全局 key 空间,尤其在多模块共用 localStorage 时:
- 构造时传入
prefix = 'exp_',所有操作实际作用于exp_token而非token - 不影响已有逻辑,又能防止和其他库或手写代码冲突
- 前缀也适用于调试:一眼识别哪些是带过期的键

















