React开发PWA时离线刷新页面缓存为空的问题咨询
PWA离线刷新缓存为空问题修复
问题根源
你的Service Worker的fetch事件逻辑存在错误:当前代码仅在网络请求失败时返回offline.html,完全忽略了已缓存的资源,导致离线刷新时无法读取缓存的index.html,表现为缓存“为空”(实际缓存存在但未被正确调用)。
修改后的Service Worker代码
const CACHE_NAME = "version-1"; const urlsToCache = [ 'index.html', 'offline.html', 'assets/icons/archive.svg', 'assets/icons/arrow-left.svg', 'assets/icons/arrow-top.svg', ]; const self = this; self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME) .then((cache) => { console.log('Opened cache'); return cache.addAll(urlsToCache); }) ) }); self.addEventListener('fetch', (event) => { event.respondWith( caches.match(event.request) .then((cachedResponse) => { // 优先返回缓存资源 if (cachedResponse) { return cachedResponse; } // 无缓存则发起网络请求,成功后更新缓存 return fetch(event.request) .then((networkResponse) => { const responseClone = networkResponse.clone(); caches.open(CACHE_NAME) .then((cache) => { cache.put(event.request, responseClone); }); return networkResponse; }) .catch(() => caches.match('offline.html')); }) ) }); self.addEventListener('activate', (event) => { const cacheWhitelist = [CACHE_NAME]; event.waitUntil( caches.keys().then((cacheNames) => Promise.all( cacheNames.map((cacheName) => { if(!cacheWhitelist.includes(cacheName)) { return caches.delete(cacheName); } }) )) ) });
核心修改说明
- 缓存优先策略:检查到缓存资源时直接返回,确保离线状态下能读取已缓存的页面和静态资源。
- 动态缓存更新:网络请求成功后,将新响应存入缓存,保证后续请求能获取最新资源。
- 修复响应流冲突:克隆网络响应(响应流仅能读取一次),避免缓存和返回响应时出现异常。
在线模式下缓存状态截图:
内容的提问来源于stack exchange,提问作者Patrickj
相关产品推荐
相关产品推荐

