ServiceWorkerContainer - 提供了管理服务工作线程的工具

ServiceWorkerContainerServiceWorker 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 的定义
工作草案 初始定义。

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持40

17

16

441 不支持2711.1
controller40

17

16

441 不支持2711.1
getRegistration40

17

16

441 不支持2711.1
getRegistrations45

17

16

441 不支持2711.1
message 事件40

17

16

441 不支持2711.1
oncontrollerchange40

17

16

441 不支持2711.1
onerror40

17

16

441 不支持2711.1
onmessage40

17

16

441 不支持2711.1
onmessageerror 不支持17 支持 不支持 未知 支持
ready40

17

16

441 不支持2711.1
register40

17

16

441 不支持2711.1
startMessages74 未知64 不支持62 支持

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持4040 未知44 未知2711.3
controller4040 未知44 未知2711.3
getRegistration4040 未知44 未知2711.3
getRegistrations4045 未知44 未知2711.3
message 事件4040 未知44 未知2711.3
oncontrollerchange4040 未知44 未知2711.3
onerror4040 未知44 未知2711.3
onmessage4040 未知44 未知2711.3
onmessageerror 不支持 不支持 未知 支持 未知 未知 支持
ready4040 未知44 未知2711.3
register4040 未知44 未知2711.3
startMessages7474 未知64 未知50 支持

1. 在 Firefox 45 和 52 扩展支持版本(ESR)中,服务 worker(和 Push)已被禁用。

相关链接