PWA 的 service worker 在 DevTools 里一直显示未注册,怎么回事?
我本地开发一个 PWA 应用,已经写了 service worker 注册逻辑,也在控制台看到没有报错,但打开 Chrome DevTools 的 Application 面板,Service Workers 区域总是空的,状态也没显示“activated”或“waiting”。我试过清除缓存、硬刷新,甚至重启浏览器都不行。
注册代码是这样写的:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('SW registered:', reg))
.catch(err => console.error('SW registration failed:', err));
}
而且 /sw.js 文件确实能通过浏览器直接访问到,内容也简单,就监听了 install 和 fetch。难道是我漏了什么配置?
问题很可能出在 scope 上。默认情况下,service worker 的作用域是注册脚本所在目录。如果你的应用结构复杂或者服务端有重定向,可能会导致 scope 不匹配。
建议在 register 方法里显式指定 scope 参数:
另外检查下 sw.js 文件头部有没有立即报错的地方。哪怕一个语法错误都会导致整个 service worker 失效,而且这种错误不会直接显示在控制台里。
性能上来说,scope 设置过大也没必要,尽量精确匹配实际需求就好。要是还不行,试试打开 DevTools 控制台,在 Application 面板手动触发 Update on reload,有时候能帮我们发现问题。