if (!navigator.serviceWorker.controller) {
console.info('当前会话无 SW 控制,按在线模式运行');
}
无痕窗口打开站点,register 返回的 registration 是 active,但刷新后 controller 为 null,关掉标签再开缓存全空。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,无痕会话的存储是临时的,标签页关闭即销毁,Service Worker 也随之注销。部分浏览器版本在无痕下直接禁用注册,只是没有抛错。
「无痕模式 SW」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
处理上按这个顺序:代码里检测不到 controller 时按普通页面降级,不要卡在加载态;把无痕场景写进兼容说明,避免被当成线上故障排查;验证离线能力一律用普通窗口,别在无痕里下结论。
改完只确认一件事:无痕窗口打开页面功能正常,控制台出现降级提示,普通窗口离线访问仍然可用。
