飞行模式打开已安装的应用,页面纯白,地址栏停在首页,控制台报 Failed to fetch,等十几秒也没有任何提示。日志里能对上时间点,这种反而好排。

预缓存清单里只列了 JS 和 CSS,offline.html 没写进去,导航请求失败后没有可回落的文档。catch 分支又把异常直接抛出去,浏览器就渲染成空白页。这一点先确认清楚,后面就不用反复试。

workbox.precaching.precacheAndRoute([
  {url: '/offline.html', revision: '3'}
]);
// catch 中 return caches.match('/offline.html')

「离线兜底页」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:把 offline.html 加进 precache 清单,路径大小写和实际文件保持一致;导航请求的 catch 分支返回 caches.match('/offline.html'),别把异常继续往外抛;offline.html 里不要引用未缓存的样式和图片,依赖全部内联。

结果对不对很好判断,断网后打开任意已缓存路由,能看到离线提示页而不是白屏,恢复网络刷新即回到正常页面。

作者 9823189