Lighthouse PWA 评分为什么一直卡在80多分?
我用 Lighthouse 测了一个 PWA 页面,其他项都过了,但“可安装性”和“离线支持”总是拿不到满分,卡在80多分。明明注册了 service worker,也加了 manifest.json,但 Lighthouse 还是报“未满足 PWA 安装条件”。
我试过检查 manifest 的 start_url 和 scope,也确认了 HTTPS 环境,但还是不行。下面是我注册 service worker 的代码:
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('SW registered:', reg))
.catch(err => console.error('SW registration failed:', err));
});
}
1. manifest里必须有icons数组,而且至少包含192x192和512x512两种尺寸
2. sw.js里要缓存页面主文档,比如这样:
3. 确保start_url能离线访问,别整什么重定向的幺蛾子
先说 manifest.json,它必须满足以下条件:
- 有
name或short_name(必须有一个)- 有
icons数组,且至少一个 icon 是 192×192 或更大的 PNG,建议再加个 512×512 的-
start_url要正确,不能带 query 参数,比如/或/index.html-
display建议设为standalone、fullscreen或minimal-ui-
orientation如果设置了,必须是有效值(比如portrait、landscape)重点来了:manifest 必须通过 HTTP 头
Content-Type: application/manifest+json或application/json返回,Lighthouse 会校验这个,很多人就栽在这一步。再看 service worker:
-
sw.js必须放在根目录或更浅的路径(比如/app/sw.js也可以,但 scope 会被限制在/app/下,start_url 必须在这个 scope 内)-
sw.js里必须实现install和fetch事件(哪怕只是空处理)-
fetch事件里必须有响应,比如缓存静态资源,否则 Lighthouse 会认为“离线不可用”常见坑:
1. sw.js 里只写了 install 事件但没处理 fetch,Lighthouse 会认为它没实际功能
2. manifest 的 icons 用了 SVG,但 Lighthouse 要求 PNG 或 WebP(SVG 有时能过,但不稳定)
3.
start_url设置成了.或/index.html?foo=bar,后者直接挂我建议你先用 Chrome DevTools → Application → Manifest 和 Service Workers 面板手动验证:
- Manifest 页看有没有红叉
- Service Workers 页确认 sw 已激活且状态是 active
附一个最简可过 Lighthouse 的 sw.js 示例:
manifest.json 最小示例:
最后提醒:Lighthouse 是跑在模拟环境里,如果你用的是本地
http://localhost,它其实也能过(因为 localhost 视为安全上下文),但必须确保不是127.0.0.1,有时会踩坑。真不行就用
ngrok或cloudflared搭个临时 HTTPS 测试,比在本地瞎调快多了。