先说一个很容易踩的坑:很多开发者以为调一下 uni.clearStorage() 就算给 App 做了"大扫除",结果用户反馈说存储空间根本没降下来。原因很简单——uni.clearStorage() 只管 JS 层那点 key-value 内存缓存,对文件系统里真正吃空间的东西完全没辙。App端自
uni-app实现App端自动清理缓存与优化存储空间管理策略
时间:2026-07-30
浏览:82
文章目录
先说一个很容易踩的坑:很多开发者以为调一下 uni.clearStorage() 就算给 App 做了"大扫除",结果用户反馈说存储空间根本没降下来。原因很简单——uni.clearStorage() 只管 JS 层那点 key-value 内存缓存,对文件系统里真正吃空间的东西完全没辙。
App端自动清理缓存为什么不能靠 uni.clearStorage()
uni.clearStorage() 清的是 localStorage,相当于只擦了桌面上的灰尘。而真正占地方的是 App 沙盒里那些下载下来的图片(通过 uni.downloadFile() 保存的)、离线包(uni.sa veFile() 写入的)、临时文件(uni.getFileSystemManager() 创建的),这些全躺在沙盒目录里,uni.clearStorage() 根本碰不到。
具体来说,空间大户集中在三个路径:uni.env.USER_DATA_PATH(用户数据目录)、uni.env.TEMP_PATH(临时目录)、uni.env.WXFILE_PATH(微信兼容路径,App 端实际映射到本地文件系统)。
- Android/iOS 上 App 的存储空间 =
USER_DATA_PATH+TEMP_PATH+ WebView 缓存 + 插件缓存(比如 map、video 组件产生的资源) uni.clearStorage()只清 JS 层的 key-value,对文件系统零影响- 用户手动点「清除缓存」那个系统弹窗,清的是整个 App 沙盒(含所有文件),但代码层面没法触发那个弹窗
怎么安全删掉无用文件:先识别再清理
千万不能上来就 fs.readdir 全删,那样很容易误伤正在用的离线资源或者登录凭证文件。得有策略:
- 统一用
uni.getFileSystemManager()操作,别混用plus.io(那个只在 H5/小程序不支持,而且 uni-app 2.x+ 已经不推荐了) - 按业务打标记:下载文件时带上时间戳和用途标识,例如文件名里加个
_cache_,或者写入一个.meta.json记录过期时间 - 清理前先
fs.stat判断是不是文件(不是目录)、是否超过 7 天(用Date.now() - stat.birthTimeMs > 7 * 24 * 60 * 60 * 1000) - 避开正在读写的文件:加个简单锁机制,比如全局
isCleaning = true,清理期间暂停新文件写入逻辑
示例片段:
const fs = uni.getFileSystemManager();
fs.readdir({
dirPath: uni.env.USER_DATA_PATH,
success: res => {
res.files.forEach(file => {
const fullPath = `${uni.env.USER_DATA_PATH}/${file}`;
fs.stat({
filePath: fullPath,
success: stat => {
if (stat.isFile && Date.now() - stat.birthTimeMs > 7 * 24 * 60 * 60 * 1000) {
fs.unlink({ filePath: fullPath }); // 注意:unlink 不返回 promise,需用回调链
}
}
});
});
}
});WebView 缓存和插件缓存怎么管
这部分完全不受 JS 控制,但可以间接影响:WebView 自身缓存(比如 web-view 加载的 H5 页面资源)由系统管理,uni-app 没有 API 能清;地图、音视频等原生插件缓存也独立存在。
- Android 上可以调用
plus.webview.getCurrentWebview().setUserAgent()强制刷新 UA,从而让 WebView 缓存失效(副作用:可能重载页面) - iOS 没法通过 JS 清 WebView 缓存,但在
manifest.json → App SDK 配置 → WebView 设置里可以关闭「启用缓存」(影响加载速度,慎开) - 地图插件(比如高德)缓存路径固定,得在原生层处理;uni-app 项目中如果用了
uni-app-plus插件,它的缓存通常位于uni.env.USER_DATA_PATH + '/amap_cache',可以按名匹配清理 - 音视频播放器(如
uni-video)缓存一般走TEMP_PATH,建议下载后立刻moveFile到USER_DATA_PATH并删掉原临时文件,避免堆积
什么时候清理最稳妥:别在启动时硬清
App 启动时搞大体积文件扫描+删除,很容易卡顿甚至导致 Android 上 ANR、iOS 上 watchdog kill。必须错峰。
- 推荐时机:用户退出登录、切换账号、主动点击「清理缓存」按钮之后
- 次选时机:进入后台超过 30 秒后(监听
plus.app.onPause),但得判断当前是否真的空闲(比如没有上传/下载任务) - 绝对避免:冷启动第一屏、
onLaunch、onShow里直接跑readdir + unlink循环 - 清理要分片:一次最多处理 20 个文件,用
setTimeout或nextTick分批,防止阻塞主线程
其实最核心的一点是:你永远不知道哪个文件正被另一个模块读取。所以「安全清理」的本质不是技术多强,而是业务层约定好生命周期——谁创建,谁负责标记和释放。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。