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

离线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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:15:06