离线PWA已缓存全部相关文件 移动端运行异常仍提示需联网
问题排查及修复方案
1 核心错误:未定义缓存名称变量
你提供的Service Worker代码中直接使用了FP_CACHE作为缓存名称,但代码开头没有对该变量做任何定义,这会直接导致install事件执行时抛出引用错误,缓存写入流程完全中断,离线状态下自然没有可读取的缓存资源。
修复方案:在Service Worker代码开头添加缓存名称定义,建议带上版本号方便后续更新:
const FP_CACHE = 'fuzzy-plan-cache-v1'; // 新增这行 let CACHED_URLS = [ // 原有缓存列表保持不变 ]
2 缺少Service Worker激活事件处理
你没有监听activate事件,一方面没有做旧缓存清理逻辑,另一方面也没有让新安装的Service Worker立刻接管页面,导致首次安装后或者更新后缓存无法立即生效,离线重启时浏览器无法命中缓存。
修复方案:添加activate事件处理逻辑:
self.addEventListener('activate', event => { event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames.filter(name => name !== FP_CACHE) .map(name => caches.delete(name)) ); }).then(() => self.clients.claim()) ); });
3 fetch事件缺失离线兜底逻辑
你当前的fetch逻辑是「缓存命中返回缓存,否则发起网络请求」,但离线状态下网络请求会失败,你虽然catch了错误但没有返回任何兜底响应,浏览器就会显示无网络报错、白屏或黑屏。
修复方案:修改fetch事件,请求失败时返回缓存的首页作为兜底:
self.addEventListener('fetch', function(event) { console.log('Fetch request for: ', event.request.url); event.respondWith( caches.match(event.request, {ignoreVary: true}).then(function(response) { // 命中缓存直接返回,否则发起请求 return response || fetch(event.request).catch(() => { // 离线请求失败时返回缓存的index.html,适配直接访问或路由场景 return caches.match('/index.html'); }); }) ); })
4 其他适配优化
- 缓存列表建议使用绝对路径,避免因相对路径匹配规则不一致导致不同浏览器下缓存命中失败
- 可以在install事件中添加
self.skipWaiting(),让新版本Service Worker安装后立刻跳过等待直接激活 - 移动端后台黑屏问题可以配合添加页面
visibilitychange事件监听,页面从后台切回时主动做状态恢复,避免被浏览器冻结的页面进程恢复异常
内容的提问来源于stack exchange,提问作者HappyDustbunny
相关产品推荐
相关产品推荐

