最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
uni-app怎么实现App端自动清理缓存 uni-app存储空间管理策略优化
时间:2026-07-18 11:09:54 编辑:袖梨 来源:一聚教程网
uni.clearStorage()仅清除localStorage内存缓存,无法清理App沙盒内文件(如USER_DATA_PATH、TEMP_PATH等),真正占空间的是文件系统中的下载文件、离线包及插件缓存。
App端自动清理缓存为什么不能靠 uni.clearStorage()
因为 uni.clearStorage() 只清内存缓存(即 localStorage),不碰 App 实际占用的存储空间——比如 uni.downloadFile() 保存的图片、uni.saveFile() 写入的离线包、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 启动时执行大体积文件扫描+删除,极易卡顿甚至 ANR(Android)或 watchdog kill(iOS)。必须错峰。
- 推荐时机:用户退出登录、切换账号、主动点击「清理缓存」按钮后
- 次选时机:进入后台超过 30 秒后(监听
plus.app.onPause),但需判断当前是否真空闲(如无上传/下载任务) - 绝对避免:冷启动第一屏、
onLaunch、onShow里直接跑readdir + unlink循环 - 清理要分片:一次最多处理 20 个文件,用
setTimeout或nextTick分批,防阻塞主线程
复杂点在于:你永远不知道哪个文件正被另一个模块读取。所以「安全清理」的本质不是技术多强,而是业务层约定好生命周期——谁创建,谁负责标记和释放。
相关文章
- Fliqlo如何设置为屏保 07-18
- 老福特免费礼物如何获取 07-18
- 全民K歌如何设置出好听音效 07-18
- 微信如何回复别人发的图片 07-18
- iPhone17系列内存配置是怎样的 07-18
- 蚂蚁森林神奇海洋2026年1月16日答案 07-18