安全清理缓存应避免无条件调用uni.clearStorageSync(),登出时仅删除token、userInfo等关键项;跨端必须统一使用uni.Storage系列API;H5需额外调用localStorage.clear();删文件缓存需先getSavedFileList再分批removeSavedFile;注意平台差异与插件影响。

直接清空所有本地缓存,用 uni.clearStorageSync() 最快,但它不区分数据重要性——token、用户信息、配置项全没,登出时可用,但千万别在 onLaunch 里无条件调用。
怎么安全删指定 key 而不是全盘清空
多数场景不需要“一键核爆”,比如登出只要删 token、userInfo、refreshToken 这几个关键项,其余如语言偏好、页面展开状态可以保留。
-
uni.removeStorageSync('token')同步删,适合小数据、逻辑简单时用 -
uni.removeStorage({key: 'userInfo', success: () => { uni.reLaunch({url: '/pages/login/login'}) }})异步删,适合删完要跳转或依赖结果再执行后续操作 - 别手写
localStorage.removeItem('xxx')混用——H5 会生效,但小程序和 App 完全无视,跨端项目必须统一走uni.*Storage*系列 - 删之前先确认 key 存在:
uni.getStorageSync('token') !== undefined,避免误删报错(尤其 Android 低版本对不存在的 key 报错)
为什么 uni.clearStorage() 在 H5 里不清理 localStorage
uni.clearStorage() 是封装了各端原生存储机制:小程序用 wx.clearStorage,App 用 plus.cache,H5 实际调的是 uni.setStorage 底层的 localStorage,但它的清除逻辑**只作用于自己写入的 key**。如果你手动用 localStorage.setItem('ab_test_group', 'B') 存过东西,uni.clearStorage() 完全看不到它。
- H5 端真要彻底清,得额外加:
localStorage.clear()和sessionStorage.clear() - 如果用了 PWA 或 Service Worker,
caches.delete('xxx-cache')是另一套缓存,uniAPI 无感,必须单独处理 - 上线前建议 grep 项目里所有
localStorage.和sessionStorage.调用点,补上对应清理逻辑
删文件缓存为什么不能只调 uni.removeSavedFile
uni.removeSavedFile() 必须传 filePath,它不支持通配符或批量删。直接调 uni.removeSavedFile({filePath: 'xxx.jpg'}) 只能删一个,漏掉就留缓存。
- 正确做法是先列再删:
uni.getSavedFileList()拿到fileList,再逐个调uni.removeSavedFile - 并发控制很重要:iOS 上同时发太多
removeSavedFile请求会触发too many open files错误,推荐用Promise.all(fileList.slice(0, 5).map(...))分批处理 - 删完别以为完事了——App 端残留临时文件可能藏在
plus.io.getCacheDir()下,需调plus.cache.calculate()验证实际大小 - 小程序端删完图片,
uni.getImageInfo({src: 'xxx.jpg'})仍可能命中缓存,加?t=${Date.now()}或 timestamp 参数强制刷新
图片缓存清理的平台陷阱
uni.clearImageCache() 名字像通用 API,其实只在 App 端有效;H5 和小程序调用它既不报错也不起作用,属于静默失败。
- App 端必须用条件编译包裹:
#ifdef APP-PLUS,否则上线后白忙活 - 小程序网络图片缓存由平台自己管,微信有
wx.clearStorage()(含图片),但支付宝/百度小程序不提供等效接口,只能靠换 URL 加时间戳绕过 - Android 厂商 ROM(如华为 EMUI、小米 MIUI)对图片缓存路径有定制,实测部分机型清不干净,这不是 bug,是系统级限制
- 真正要控图缓存,优先策略是:网络图存本地文件(
uni.downloadFile→uni.saveFile),再用文件路径渲染,这样缓存生命周期你可控
最易被忽略的一点:vuex-persistedstate 插件默认也走 uni.setStorageSync,和你自己写的存储共享同一片空间——uni.clearStorageSync() 会把它连带干掉,状态丢失。如果项目用了这个插件,清缓存前得先评估是否影响全局状态恢复逻辑。











