You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:25:17