一、数据存储类型与限制
-
微信本地临时文件
- 存在时间:运行期间最多存储 4GB,退出后若总大小超过 2GB,按最近使用时间清理至 2GB 以下。
- 清理机制:退出后可能随时被系统回收,不建议依赖长期存储。
-
微信本地缓存文件 & 本地用户文件
- 存储上限:两者合计最多 200MB(含小游戏)。
- 存在时间:
- 未超过 200MB 时长期保留,平台不会自动清理。
- 若存储超过 200MB,后续写入失败,需手动清理或等待代码包被清理时连带清除。
-
wx.setStorage
存储- 存在时间:数据持久保存,无固定时效,但以下情况会失效:
- 用户主动删除小程序。
- 开发者主动调用删除接口。
- 隔离性:同一设备不同用户、不同小程序之间数据互相隔离。
- 存在时间:数据持久保存,无固定时效,但以下情况会失效:
二、相关注意事项
- 版本更新:小程序版本升级不会清理本地文件或
Storage
数据1 - 用户操作影响:用户手动删除小程序后,所有关联数据(包括
Storage
和本地文件)均被清除
微信小程序的 wx.setStorage
原生不支持在存储时直接指定过期时间57。但可通过以下方案实现时效性缓存:
一、间接实现过期时间的方案
-
存储时添加时间戳
写入缓存时,将数据与过期时间戳合并存储。例如:
const data = { value: "缓存内容", expire: Date.now() + 300000 }; // 5分钟后过期
wx.setStorageSync('key', data);
2. 读取时校验时间戳
读取数据后,对比当前时间与存储的过期时间戳:
const storedData = wx.getStorageSync('key');
if (storedData && storedData.expire > Date.now()) {
// 数据有效,可使用
} else {
// 数据已过期,清除缓存
wx.removeStorageSync('key');
}
3. 封装为通用工具函数
将上述逻辑封装为独立函数,例如:
function setExpiredStorage(key, value, expireTime) {
const data = { value, expire: Date.now() + expireTime };
wx.setStorageSync(key, data);
}
二、方案特点与限制
- 前端自主控制:无需依赖服务端接口,纯前端逻辑实现。
- 灵活性:支持自定义过期时间(秒、分钟、小时等)。
- 性能影响:需每次读取时校验时间戳,可能略微增加计算开销。
- 持久性依赖:若用户未删除小程序或主动清理缓存,过期数据仍占用存储空间。
三、最佳实践建议
- 结合服务端时间:从服务端获取统一的过期时间配置,避免客户端时间篡改导致校验失效。
- 高频数据优化:对频繁访问的缓存数据,可降低时间戳校验频率(如每隔 5 分钟校验一次)。
- 主动清理机制:在小程序启动时遍历所有缓存,自动清理过期数据。
总结
wx.setStorage
原生无过期时间参数,但通过存储时间戳+读取校验的方案可实现时效性缓存。该方案兼容 Vue2/Vue3 项目,且代码可复用性高