Skip to content

Service Worker

Service Worker 是 PWA 中重要的一部分,它是一个网站安插在用户浏览器中的大脑。

Workbox 3是PWA 相关的工具集合,其实围绕它的还有一些列工具,如 workbox-cli、gulp-workbox、webpack-workbox-plagin 等等

使用 Service Worker的话,传输协议必须为 HTTPS。因为 Service Worker 中涉及到请求拦截,所以必须使用 HTTPS 协议来保障安全。Service Worker 的缓存与浏览器其他内建的缓存机制不同,它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。

1. workbox3 的缓存策略

  • Stale-While-Revalidate 使用缓存时校验缓存是否过期
  • Cache First 缓存优先
  • Network First 网络优先
  • Network Only 只使用网络
  • Cache Only 只使用缓存

2. 其他

HTML,如果你想让页面离线可以访问,使用 NetworkFirst,如果不需要离线访问,使用 NetworkOnly,其他策略均不建议对 HTML 使用。

CSS 和 JS,情况比较复杂,因为一般站点的 CSS,JS 都在 CDN 上,SW 并没有办法判断从 CDN 上请求下来的资源是否正确(HTTP 200),如果缓存了失败的结果,问题就大了。这种我建议使用 Stale-While-Revalidate 策略,既保证了页面速度,即便失败,用户刷新一下就更新了。

如果你的 CSS,JS 与站点在同一个域下,并且文件名中带了 Hash 版本号,那可以直接使用 Cache First 策略。

图片建议使用 Cache First,并设置一定的失效事件,请求一次就不会再变动了。

对于不在同一域下的任何资源,绝对不能使用 Cache only 和 Cache first。

3. 移除service worker

说道移除 SW,第一反应可能是删掉 SW.js。注意,直接这么做会导致你的网站永远无法更新,即便服务器上文件有更新。原因是因为 SW 已经缓存了所有的资源,而浏览器更新资源依靠 SW.js 里面的缓存策略。直接删除 SW.js 文件相当于删除了管理缓存的中间人,那么浏览器只会一直从已有的缓存中拿取资源。

相关资料

Taobao FED | 淘系前端团队

ServiceWorker 离线及缓存策略-木子朗

ServiceWorker 离线及缓存策略 - 掘金

移除已经开始上线使用的 Service Worker - 掘金

Service Worker API - Web API 接口参考 | MDN

图解 HTTP 缓存 - 掘金

Released under the MIT License.