优先选 uni.setStorage(异步),仅在必须立刻获知结果时用 uni.setStorageSync(同步);注意跨端差异、缓存大小限制、过期校验及分类清理策略。

uni.setStorage 和 uni.setStorageSync 怎么选?
看场景,不看习惯。异步是默认选择,同步只在“必须立刻知道结果”时用。
- 页面
onLoad里存用户配置?用uni.setStorage—— 阻塞主线程可能触发微信“脚本执行超时”,尤其在低端机上 - 登录成功后写
token,后续请求立刻要用?仍建议异步 +Promise封装,避免try/catch漏掉失败;真要同步,务必加catch,否则静默失败 - 小程序单 key 不能超
1MB,总缓存上限10MB;App 端虽宽松,但大对象(如 Base64 图片)直接塞进去,iOS 可能因内存抖动崩溃
缓存读取时为什么经常拿不到数据?
不是 API 失败,而是你没处理“键不存在”或“数据已过期”这两个最常见情况。
-
uni.getStorageSync拿不到会直接抛错,必须try/catch;uni.getStorage的fail回调里,err.errMsg是"getItem:fail data not found",不是网络错误 - 接口返回的 token 带了
expires_in?别只存值,连时间戳一起存:{ value: 'xxx', expires: Date.now() + 7200000 },读取时先校验再用 - H5 端降级到
localStorage时,注意它只支持字符串;uni.setStorageSync('user', {name: 'a'})实际存的是序列化后的字符串,但某些旧版 H5 插件可能对特殊字符处理异常
清理缓存时怎么避免误删登录态?
别迷信 uni.clearStorageSync() 一把梭——它清得干净,也清得彻底,包括你刚存的 userInfo。
- 手动清理前,先备份关键键:
const userInfo = uni.getStorageSync('userInfo'),清完再写回去 - 按业务分类清理更安全:表单草稿用
uni.removeStorageSync('form_draft'),临时 token 用uni.removeStorageSync('temp_token'),比全量清除可控得多 - 页面
onHide里删临时数据,onUnload里删页面专属缓存;但别在onShow里自动清,用户切后台再切回来,不该丢数据
怎么知道缓存快满了或者该清理了?
等用户报“卡”“闪退”再查就晚了。主动监控才是正解。
- 用
uni.getStorageInfoSync()拿currentSize,超过8MB就该提醒或自动触发轻量清理(比如删掉过期的cache_*键) - 不要只看总大小;
uni.getStorageInfoSync().keys返回所有键名,可遍历过滤出带时间戳的缓存项,批量清理 24 小时前的 - PWA 场景下,Service Worker 的预缓存(
CACHE_NAME)和运行时缓存是两套体系,uni.clearStorageSync不影响 SW 缓存,得单独调caches.delete()

















