PWA 的 service worker 在 DevTools 里一直显示未注册,怎么回事?

爱学习的玉军 阅读 24

我本地开发一个 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。难道是我漏了什么配置?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
司徒新霞
service worker 没注册成功,首先确认你的页面是通过 HTTPS 访问的,localhost 除外。不过既然你能在控制台看到注册逻辑输出,这个应该没问题。

问题很可能出在 scope 上。默认情况下,service worker 的作用域是注册脚本所在目录。如果你的应用结构复杂或者服务端有重定向,可能会导致 scope 不匹配。

建议在 register 方法里显式指定 scope 参数:

navigator.serviceWorker.register('/sw.js', { scope: '/' })
.then(reg => console.log('SW registered:', reg))
.catch(err => console.error('SW registration failed:', err));


另外检查下 sw.js 文件头部有没有立即报错的地方。哪怕一个语法错误都会导致整个 service worker 失效,而且这种错误不会直接显示在控制台里。

性能上来说,scope 设置过大也没必要,尽量精确匹配实际需求就好。要是还不行,试试打开 DevTools 控制台,在 Application 面板手动触发 Update on reload,有时候能帮我们发现问题。
点赞
2026-03-31 12:02