Web Worker
这个 API 的唯一目的就是解放主线程,Web Worker 是脱离在主线程之外的,将一些复杂的耗时的活交给它干,完成后通过 postMessage 方法告诉主线程,而主线程通过 onMessage 方法得到 Web Worker 的结果反馈。但 Web Worker 是临时的,每次做的事情的结果还不能被持久存下来,如果下次有同样的复杂操作,还得费时间的重新来一遍。
Service Worker
在 Web Worker 的基础上加上了持久离线缓存能力。
Service Worker 功能和特性
- 一个独立的 worker 线程,独立于当前网页进程,有自己独立的 worker context
- 一旦被 install,就永远存在,除非被手动 unregister
- 用到的时候可以直接唤醒,不用的时候自动睡眠
- 可编程拦截代理请求和返回,缓存文件,缓存的文件可以被网页进程取到(包括网络离线状态)
- 离线内容开发者可控
- 能向客户端推送消息
- 不能直接操作 DOM
- 必须在 HTTPS 环境下才能工作
- 异步实现,内部大都是通过 Promise 实现
Service Worker 生命周期
在页面脚本中注册 Service Worker 文件所在的 URL。Worker 就可以开始激活了,激活后的 Service Worker 可以监听当前域下的功能性事件,比如资源请求(fetch
)、推送通知(push
)、后台同步(sync
)。在这一系列的流程中,从 Service Worker 的注册到消失,经历了生命周期中不同的状态。
- 首先我们需要在页面的 JavaScript 主线程中使用
serviceWorkerContainer.register()
来注册 Service Worker ,在注册的过程中,浏览器会在后台启动尝试 Service Worker 的安装步骤。 - 如果注册成功,Service Worker 在
ServiceWorkerGlobalScope
环境中运行; 这是一个特殊的 worker context,与主脚本的运行线程相独立,同时也没有访问 DOM 的能力。 - 后台开始安装步骤, 通常在安装的过程中需要缓存一些静态资源。如果所有的资源成功缓存则安装成功,如果有任何静态资源缓存失败则安装失败,在这里失败的不要紧,会自动继续安装直到安装成功,如果安装不成功无法进行下一步 — 激活 Service Worker。
- 开始激活 Service Worker,必须要在 Service Worker 安装成功之后,才能开始激活步骤,当 Service Worker 安装完成后,会接收到一个激活事件(activate event)。激活事件的处理函数中,主要操作是清理旧版本的 Service Worker 脚本中使用资源。
生命周期分为这么几个状态安装中
安装后
激活中
激活后
废弃
Service Worker 所有支持的事件
-
查看是否注册成功
chrome://inspect/#service-workers
chrome://serviceworker-internals
网友评论