PWA 在 Chrome DevTools 里怎么调试 Service Worker 不生效?
我按照教程注册了 Service Worker,本地开发时在 Chrome 的 Application 面板里能看到注册信息,但一刷新就没了,状态一直是 “redundant”。我试过清除缓存、硬刷新,也检查了 navigator.serviceWorker.register() 没报错,就是不工作。
我的 sw.js 放在根目录,注册代码是这样写的:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('SW registered:', reg))
.catch(err => console.error('SW failed:', err));
}
是不是 DevTools 里要开什么特殊选项?还是我漏了什么配置?
首先确认运行环境,PWA 必须在 localhost 或者 HTTPS 环境下跑,直接双击 html 文件用 file:// 协议打开是绝对不行的,Service Worker 直接挂掉。
然后检查 sw.js 的内容,很多时候是因为文件里没写事件监听或者代码报错了。如果 sw.js 是空的或者有语法错误,注册完就会立刻失效。最简单的修复方法是在 sw.js 里加上 install 和 activate 事件的监听,并强制激活,这样开发阶段调试起来最省心,不用一直刷新等待。
另外,DevTools 里有个容易忽略的设置。打开 Chrome DevTools 的 Application 面板,找到 Service Workers 那一块,看看 "Update on reload" 这个选项是不是勾选了。如果勾选了,你每次刷新都会强制安装新的 Service Worker 并替换掉旧的,导致状态一直变成 redundant。开发调试时建议先关掉它,或者配合上面的 skipWaiting 使用。
还有就是注意路径,你的代码写的是 '/sw.js',这代表 sw.js 必须在网站根目录,不能放在子文件夹里,否则作用域不对也会导致无法控制页面。