Cache API 没有 matchAll() 方法,需用 cache.keys() + cache.match() + cache.delete() 组合实现旧资源清理;关键在 URL 标准化、精准识别和安全删除。
并不是 Cache API 的标准方法——
Cache 接口本身没有
。你可能混淆了
(获取所有缓存键)或
(获取所有缓存名称),或是误记为 IndexedDB 或其他 API 的方法。
真正用于
匹配并批量处理旧版本静态资源
的,是结合
+
+
的组合逻辑。重点不在“一次匹配全部”,而在于
精准识别、安全比对、可控删除
。
下面分三步说明实际可行的操作路径:
如何识别旧版本的静态资源
静态资源版本通常体现在 URL 中,比如:
(内容哈希)
但
默认严格比对完整 URL(含 query)。若想把带时间戳或随机参数的请求归为同一资源,需先标准化:
用
解析,移除
参数
构造新 Request 对象:
再调用
尝试宽松匹配
也可以在缓存阶段就统一用 clean URL 存储,避免后期匹配困难。
如何批量删除某类旧资源(例如所有 v1 版本 CSS/JS)
假设你已用
缓存了旧版资源,新版用
,那么清理逻辑应放在
阶段:
⚠️ 注意:这删的是整个缓存空间(如
),不是单个文件。若只想删其中部分资源(比如只删旧版 JS,保留同名图片),则需打开旧缓存,逐个比对 key:
删除前建议加一层安全校验
直接
不会报错,但也不反馈是否真删掉了(比如请求未命中缓存时返回
)。可配合
做简单确认。
另外,
Request 对象不可复用
:如果某个请求你既想
又想
,记得先
,否则第二次操作会失败。
不复杂但容易忽略——Cache API 的删除动作是精确且静默的,它不会自动推断语义,全靠你定义“什么是旧”、“该不该删”、“删哪个缓存空间”。
matchAllmatchAll()cache.keys()caches.keys()cache.keys()cache.match()cache.delete()/styles.css?v=1.2/app.a5b3f.js/images/logo.png?ts=1712890000cache.match()new URL(request.url)searchnew Request(cleanUrl, { method: request.method })cache.match(normalizedRequest)static-v1static-v2activateself.addEventListener('activate', event => {
const currentCaches = ['static-v2', 'images-v2'];
event.waitUntil(
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames
.filter(name => !currentCaches.includes(name))
.map(name => caches.delete(name))
);
})
);
});static-v1caches.open('static-v1').then(cache => {
cache.keys().then(requests => {
requests.forEach(req => {
const url = new URL(req.url);
if (url.pathname.endsWith('.js') && /v1\./.test(url.pathname)) {
cache.delete(req);
}
});
});
});cache.delete(req)false.then(success => { if (!success) console.warn('Failed to delete:', req.url); })match()delete()req.clone()