service worker 是什么
service worker 是什么
一句话概括
一个服务器与浏览器之间的中间人角色,如果网站中注册了 service worker 那么它可以拦截当前网站所有的请求,进行判断(需要编写相应的判断程序),如果需要向服务器发起请求的就转给服务器,如果可以直接使用缓存的就直接返回缓存不再转给服务器。从而大大提高浏览体验。
一些细碎的描述
- 基于 web worker(一个独立于 JavaScript 主线程的独立线程,在里面执行需要消耗大量资源的操作不会堵塞主线程)
- 在 web worker 的基础上增加了离线缓存的能力
- 本质上充当 Web 应用程序(服务器)与浏览器之间的代理服务器(可以拦截全站的请求,并作出相应的动作->由开发者指定的动作)
- 创建有效的离线体验(将一些不常更新的内容缓存在浏览器,提高访问体验)
- 由事件驱动的,具有生命周期
- 可以访问 cache 和 indexDB
- 支持推送
- 并且可以让开发者自己控制管理缓存的内容以及版本
如何使用
- 注册 Service worker 在你的 index.html 加入以下内容
1 | /* 判断当前浏览器是否支持serviceWorker */ |
- 安装 worker:在我们指定的处理程序serviceWorker.js中书写对应的安装及拦截逻辑
1 | /* 监听安装事件,install 事件一般是被用来设置你的浏览器的离线缓存逻辑 */ |
注意事项
Service worker 运行在 worker 上下文 –> 不能访问 DOM
它设计为完全异步,同步 API(如 XHR 和 localStorage)不能在 service worker 中使用
出于安全考量,Service workers 只能由 HTTPS 承载
在 Firefox 浏览器的用户隐私模式,Service Worker 不可用
其生命周期与页面无关(关联页面未关闭时,它也可以退出,没有关联页面时,它也可以启动)
有趣的事
在 MDN 的兼容情况中可以看到 Safari 对于 Service workers 的全线不支持,这是因为通过 Service workers 可以在浏览器上实现一种类似小程序的功能(PWA)。这将绕过苹果的 app store 导致苹果不能再和开发者 37 开分成,所以苹果不喜欢这项技术。ps:不过还是在 18 年开始支持了
评论
LivereValine