是否可通过Javascript代码实现应用缓存的程序化清除?
纯JavaScript无法直接触发系统级的应用全局缓存清理操作,JS运行在沙箱权限模型下,没有访问系统设置接口、原生应用私有缓存目录的权限,能不能实现自动清缓存,完全取决于你的应用运行环境:
不同场景的实现方案
纯Web网页应用
你只能清理当前域名下前端可访问的Web侧缓存,无法触碰应用原生层产生的缓存(比如原生端缓存的图片、安装包、离线文件、存在原生沙箱的接口响应缓存等),可直接用JS清理的缓存和对应代码如下:
- 清理Service Worker缓存
if ('caches' in window) { caches.keys().then(keys => Promise.all(keys.map(key => caches.delete(key)))) }
- 清理LocalStorage/SessionStorage
localStorage.clear(); sessionStorage.clear();
- 清理前端可访问的非HttpOnly Cookie
document.cookie.split(';').forEach(cookieItem => { const name = cookieItem.split('=')[0].trim(); document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`; });
- 清理IndexedDB存储
if ('indexedDB' in window) { indexedDB.databases().then(dbList => { dbList.forEach(db => indexedDB.deleteDatabase(db.name)) }) }
原生App内嵌Webview的Hybrid应用
纯JS依旧无法直接清理原生层缓存,需要通过JSBridge和原生端通信,由原生端执行缓存清理逻辑,JS层只需要调用提前约定好的桥接方法即可:
// 需提前和原生端约定好桥接方法名、参数、回调逻辑 function triggerCacheClear() { if (window.WebViewJavascriptBridge) { window.WebViewJavascriptBridge.callHandler( 'clearAppCache', { auto: true }, res => console.log('缓存清理完成', res) ) } }
原生端实现清理逻辑不需要申请特殊权限:
- Android端遍历
context.getCacheDir()、context.getExternalCacheDir()路径下的文件删除即可 - iOS端遍历
NSCachesDirectory目录下的对应缓存文件删除即可
JS为基础的跨端框架应用(React Native、Cordova、UniApp等)
这类框架的本质还是JS和原生层通信,你可以直接用框架提供的文件系统API遍历应用缓存目录删除文件,也可以调用封装好的官方/社区插件实现一键清理:
- React Native可使用
react-native-fs获取缓存目录路径,遍历删除文件 - UniApp可调用
uni.clearStorage()同步清理Web侧存储,搭配原生插件清理文件类缓存 - Cordova可直接使用
cordova-plugin-cache类的现成插件完成清理
注意:所有场景下JS都不能绕过权限清理其他应用的缓存,也不能在没有原生配合的情况下清理自身原生层产生的缓存。
内容的提问来源于stack exchange,提问作者user17619876
相关产品推荐
相关产品推荐

