为什么我的PWA服务工作者注册后Lighthouse仍显示未安装?
我在React项目里按教程添加了服务工作者,控制台显示注册成功,但Lighthouse评分总显示”未安装有效的服务工作者”。代码如下:
// src/index.js
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
serviceWorker.register('/service-worker.js')
.then(reg => console.log('SW注册成功:', reg))
.catch(err => console.error('SW失败:', err));
});
}
服务工作者文件放在public/service-worker.js,路径确认没问题。Lighthouse运行时控制台没有报错,但评分一直不通过。试过清除缓存和无痕模式测试,结果还是一样,这是哪里出问题了?
我给你贴个靠谱的注册方式,顺便加个log方便排查问题:
然后你去public目录下加个
service-worker.js文件,内容最少要这样:接着用Chrome DevTools看下:
Application -> Service Workers 有没有显示你的SW
Network里看下请求/service-worker.js的状态是不是200
控制台有没有SW相关的log
Lighthouse评分要看SW能不能正常install和activate。有时候你注册了,但它没走完流程,或者压根没执行你的JS。
另外,检查下你的
manifest.json文件有没有正确引用,里面要有start_url,scope这些基本配置。PWA不是注册个SW就完事的,要全套配置。你 public/service-worker.js 这个文件位置就错了。React 项目要改 src/serviceWorker.js,然后通过 registerServiceWorker() 调用。你现在这样注册的 SW 根本没绑定任何缓存策略,Lighthouse 当然识别不出来。
改法很简单:
把你的 service-worker.js 内容合并到 src/serviceWorker.js 里
在 index.js 里用 import { register } from './serviceWorker' 然后调用 register()
删掉你那个手动注册的 window.addEventListener('load')
create-react-app 的 serviceWorker.js 里自带生命周期钩子,你直接覆盖上去就行。你现在这注册方式在性能上完全是白费功夫,PWA 评分不提升就对了。