uni-app 无一键清空所有缓存的通用api,需分头处理:storage用uni.clearstoragesync()、h5 localstorage用clear()、下载文件需getsavedfilelist+removesavedfile、app端图片缓存用clearimagecache()、webview缓存用plus.cache.clear()、日志文件需plus.io.readdir+remove(),且须控制并发、避免卡顿。

uni-app 里没有“一键清空所有缓存”的通用 API,所谓“清完还剩一堆”是正常现象,不是你漏写了代码——而是不同缓存归属不同机制,必须分头处理。
uni.clearStorageSync() 只清 storage,别指望它干别的
它只删除通过 uni.setStorage 或 uni.setStorageSync 写入的数据(如 token、userInfo),其他一概不管:
- 不碰
localStorage.setItem('ab_test', 'v2')—— H5 里得自己调localStorage.clear() - 不删
uni.downloadFile下载的文件 —— 得先uni.getSavedFileList(),再逐个uni.removeSavedFile({filePath: ...}) - 不清 WebView 加载的 JS/CSS/图片 —— App 端需
plus.cache.clear() - 不清理日志文件 —— 即使你用
uni.getFileSystemManager().writeFile写在uni.env.USER_DATA_PATH下,也得手动遍历 +fs.unlink
App 端必须补全的三类原生清理操作
仅在 #ifdef APP-PLUS 下执行,H5 和小程序里调用会静默失败:
- 图片缓存:
uni.clearImageCache()—— 它清的是 uni-app 图片加载器缓存,非系统级磁盘缓存,部分 Android 厂商 ROM 可能清理不彻底,属正常 - WebView 缓存:
const cache = uni.requireNativePlugin('plus.cache'); cache.clear(() => { console.log('WebView 缓存已清') })—— 清的是内核资源(HTML/JS/CSS/图片),但 OkHttp(Android)和 CFNetwork(iOS)的 HTTP 磁盘缓存不受影响,得靠服务端响应头Cache-Control: no-store - 日志文件:
plus.io.readdir({ path: plus.io.getCacheDir() })列出所有文件,过滤.log或含log_的文件名,再用plus.io.remove()删除 —— 注意:不能用uni.getFileSystemManager()访问getCacheDir(),权限不够
并发删文件容易崩溃,iOS 尤其敏感
无论是删下载文件还是日志,uni.removeSavedFile 和 plus.io.remove 都不支持批量参数,必须单个调用。但一次性发起 20+ 请求,在 iOS 上大概率触发 EMFILE: too many open files,App 卡死或闪退:
- 控制并发数:每次最多 3–5 个,用
Promise.all(fileList.slice(i, i + 5).map(...)) - 别在
onLaunch或页面onLoad里无脑启动清理 —— 用户刚打开就卡住,体验极差 - 删日志前加时间判断:
stat.birthTimeMs ,避免误删正在写入的活跃日志 - 上线前务必检查
manifest.json→ “模块权限配置” 是否勾选了 “文件系统(plus.io)” ,否则plus.io.*全部静默失效
H5 和小程序端容易被忽略的残留点
很多人以为清了 uni.clearStorage() 就干净了,结果 AB 测试分组、埋点 ID、表单草稿还在:
- H5 端:必须额外执行
localStorage.clear()和sessionStorage.clear()—— 因为uni.setStorage在 H5 底层只是封装了localStorage,但反向不兼容 - 小程序端:如果混用了
wx.setStorageSync(比如某些 SDK 直接调微信原生 API),得单独调wx.clearStorageSync() - 所有平台:若接入 PWA 或自定义 Service Worker,
caches.delete('api-cache')是另一套体系,uni 完全无感,必须单独处理
真正难的不是写几行清理代码,而是理清每一类缓存的归属路径、生命周期和权限边界——尤其日志路径在不同 Android 厂商 ROM 下可能被重定向,plus.io.getCacheDir() 比 uni.env.USER_DATA_PATH 更稳定;而 iOS 上删文件不加节制,连验证缓存大小的 plus.cache.calculate() 都可能因句柄耗尽而失败。











