ServiceWorkerContainer - 提供了管理服务工作线程的工具
ServiceWorkerContainer
是 ServiceWorker API 的接口,提供提供了一个对象,该对象将服务工作线程表示为网络生态系统中的一个整体单元,包括注册,注销和更新服务工作线程的工具,以及访问服务工作线程及其注册状态的工具。
最重要的是,它公开了用于注册服务工作线程的 ServiceWorkerContainer.register()
方法,以及用于确定当前页面是否受到有效控制的 ServiceWorkerContainer.controller
属性。
属性
ServiceWorkerContainer.controller
只读
如果状态是 activated
,则返回一个 ServiceWorker
对象(由 ServiceWorkerRegistration.active
返回的同一对象)。在强制刷新请求(Shift + 刷新)期间或没有活动工作程序的情况下,此属性返回 null
。
ServiceWorkerContainer.ready
只读
提供一种直到服务工作线程处于活动状态,才执行代码的延迟执行方式。它返回一个永远不会拒绝的 Promise
,它会无限期等待,直到与当前页面关联的 ServiceWorkerRegistration
具有 ServiceWorkerRegistration.active
工作线程。满足该条件后,将使用 ServiceWorkerRegistration
进行解析。
事件
controllerchange
当文档的关联 ServiceWorkerRegistration
获得新的 active
工作线程时发生。也可以通过 ServiceWorkerContainer.oncontrollerchange
属性处理。
error
每当相关服务工作线程发生错误时触发。也可以通过 ServiceWorkerContainer.onerror
属性处理。
message
在 ServiceWorkerContainer
对象接收到传入消息时发生(例如,通过 MessagePort.postMessage()
调用。)也可以通过 ServiceWorkerContainer.onmessage
属性处理。
方法
ServiceWorkerContainer.register()
为给定的 scriptURL
创建或更新 ServiceWorkerRegistration
。
ServiceWorkerContainer.getRegistration()
获取一个 ServiceWorkerRegistration
对象,其范围与提供的文档 URL 相匹配。如果该方法无法返回 ServiceWorkerRegistration
,则返回一个 Promise
。
ServiceWorkerContainer.getRegistrations()
返回与数组中的 ServiceWorkerContainer
关联的所有 ServiceWorkerRegistration
对象。如果该方法无法返回 ServiceWorkerRegistration
对象,则会返回一个 Promise
。
ServiceWorkerContainer.startMessages()
显式地启动从服务工作线程分派到其控制下的页面的消息流(例如,通过 Client.postMessage()
发送)。这可以用来更早地对发送的消息做出反应,甚至在该页面的内容完成加载之前做出反应。
实例
下面的实例首先检查浏览器是否支持服务工作线程。如果支持,代码将注册服务工作线程,并确定该页面是否由服务工作线程主动控制。如果不是,它将提示用户重新加载页面,以便服务工作线程可以控制。该代码还报告任何注册失败。
if ('serviceWorker' in navigator) {
// 使用默认范围注册驻留在站点根目录下的服务工作线程。
navigator.serviceWorker.register('/sw.js').then(function(registration) {
console.log('Service worker registration succeeded:', registration);
// 此时,您可以选择进行注册。
}).catch(function(error) {
console.log('Service worker registration failed:', error);
});
// 除了注册之外,我们还显示有关当前页面是否由现有服务工作线程控制
// 以及该控制器何时更改的信息。
// 首先,一次性检查当前是否有服务工作线程在控制中。
if (navigator.serviceWorker.controller) {
console.log('该页面当前的控制器是:', navigator.serviceWorker.controller, '控制');
}
// 然后,注册一个处理程序以检测新的或更新的服务程序何时控制。
navigator.serviceWorker.oncontrollerchange = function() {
console.log('该页面现在的控制器是:', navigator.serviceWorker.controller);
};
} else {
console.log('不支持服务工作线程。');
}
规范
规范 | 状态 | 备注 |
---|---|---|
Service Workers ServiceWorkerContainer 的定义 |
工作草案 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 40 | 17 16 | 441 | 不支持 | 27 | 11.1 |
controller | 40 | 17 16 | 441 | 不支持 | 27 | 11.1 |
getRegistration | 40 | 17 16 | 441 | 不支持 | 27 | 11.1 |
getRegistrations | 45 | 17 16 | 441 | 不支持 | 27 | 11.1 |
message 事件 | 40 | 17 16 | 441 | 不支持 | 27 | 11.1 |
oncontrollerchange | 40 | 17 16 | 441 | 不支持 | 27 | 11.1 |
onerror | 40 | 17 16 | 441 | 不支持 | 27 | 11.1 |
onmessage | 40 | 17 16 | 441 | 不支持 | 27 | 11.1 |
onmessageerror | 不支持 | 17 | 支持 | 不支持 | 未知 | 支持 |
ready | 40 | 17 16 | 441 | 不支持 | 27 | 11.1 |
register | 40 | 17 16 | 441 | 不支持 | 27 | 11.1 |
startMessages | 74 | 未知 | 64 | 不支持 | 62 | 支持 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 40 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
controller | 40 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
getRegistration | 40 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
getRegistrations | 40 | 45 | 未知 | 44 | 未知 | 27 | 11.3 |
message 事件 | 40 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
oncontrollerchange | 40 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
onerror | 40 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
onmessage | 40 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
onmessageerror | 不支持 | 不支持 | 未知 | 支持 | 未知 | 未知 | 支持 |
ready | 40 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
register | 40 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
startMessages | 74 | 74 | 未知 | 64 | 未知 | 50 | 支持 |
1. 在 Firefox 45 和 52 扩展支持版本(ESR)中,服务 worker(和 Push)已被禁用。