前言前端需在体验与新鲜度间权衡。本文提供 Cache Storage 与 HTTP 条件请求协同的可实施方案。能力检测const supportsCaches = 'caches' in self || 'caches' in window;
条件请求与 ETag 协同async function revalidate(url, cached) {
const etag = cached.headers.get('ETag') || '';
const res = await fetch(url, { headers: etag ? { 'If-None-Match': etag } : {} });
return res;
}
async function cacheFirstRevalidate(event) {
const cache = await caches.open('cf-rv');
const cached = await cache.match(event.request);
if (cached) {
event.waitUntil(
revalidate(event.request.url, cached).then(res => { if (res && res.ok) cache.put(event.request, res.clone()); })
);
return cached;
}
const res = await fetch(event.request);
if (res && res.ok) cache.put(event.request, res.clone());
return res;
}
路由集成示例self.addEventListener('fetch', event => {
const url = new URL(event.request.url);
if (url.pathname.startsWith('/api/')) {
event.respondWith(cacheFirstRevalidate(event));
}
});

发表评论 取消回复