ServiceWorkerContainer

Baseline 广泛可用 *

此功能已成熟,可跨多种设备和浏览器版本工作。它自 ⁨2018 年 4 月⁩ 起已在所有浏览器中可用。

* 此特性的某些部分可能存在不同级别的支持。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

ServiceWorkerContainer 接口是 Service Worker API 的一部分,它提供了一个对象,代表着网络生态系统中作为整体的服务工作线程。它包含了注册、注销、更新服务工作线程以及访问服务工作线程及其注册状态的功能。

最重要的是,它暴露了用于注册服务工作线程的 ServiceWorkerContainer.register() 方法,以及用于确定当前页面是否被主动控制的 ServiceWorkerContainer.controller 属性。

ServiceWorkerContainer 对象通过 Navigator.serviceWorker 在 Window 作用域中暴露,并在 Worker 中通过 WorkerNavigator.serviceWorker 暴露(如果支持——请检查 浏览器兼容性)。

EventTarget ServiceWorkerContainer

实例属性

ServiceWorkerContainer.controller 只读

一个 ServiceWorker 对象,代表控制当前页面的活动服务工作线程,如果页面没有活动或正在激活的服务工作线程,则为 null

ServiceWorkerContainer.ready 只读

返回一个 Promise,该 Promise 在有活动服务工作线程时,会解析为与当前页面关联的 ServiceWorkerRegistration。这提供了一种机制,可以在服务工作线程激活之前推迟代码执行。

实例方法

ServiceWorkerContainer.getRegistration()

获取作用域与提供的文档 URL 匹配的 ServiceWorkerRegistration 对象。该方法返回一个 Promise,该 Promise 会解析为 ServiceWorkerRegistrationundefined

ServiceWorkerContainer.getRegistrations()

返回与 ServiceWorkerContainer 关联的所有 ServiceWorkerRegistration 对象组成的数组。该方法返回一个 Promise,该 Promise 会解析为一个 ServiceWorkerRegistration 对象数组。

ServiceWorkerContainer.register()

为给定的 scriptURL 创建或更新一个 ServiceWorkerRegistration

ServiceWorkerContainer.startMessages()

显式地启动从服务工作线程分发到其控制的页面的消息流(例如,通过 Client.postMessage() 发送)。这可用于更早地响应发送的消息,甚至在页面内容加载完成之前。

事件

controllerchange

当文档关联的 ServiceWorkerRegistration 获得新的 active 工作线程时触发。

message

ServiceWorkerContainer 对象收到传入消息时触发(例如,通过 MessagePort.postMessage() 调用)。

messageerror

ServiceWorkerContainer 对象无法反序列化传入消息时触发(例如,通过 MessagePort.postMessage() 调用)。

示例

下面的示例首先检查浏览器是否支持服务工作线程。如果支持,代码将注册服务工作线程,并确定页面是否已被服务工作线程主动控制。如果不是,它会提示用户重新加载页面以便服务工作线程接管。代码还会报告任何注册失败的情况。

js
if ("serviceWorker" in navigator) {
  // Register a service worker hosted at the root of the
  // site using the default scope.
  navigator.serviceWorker
    .register("/sw.js")
    .then((registration) => {
      console.log("Service worker registration succeeded:", registration);

      // At this point, you can optionally do something
      // with registration. See https://mdn.org.cn/en-US/docs/Web/API/ServiceWorkerRegistration
    })
    .catch((error) => {
      console.error(`Service worker registration failed: ${error}`);
    });

  // Independent of the registration, let's also display
  // information about whether the current page is controlled
  // by an existing service worker, and when that
  // controller changes.

  // First, do a one-off check if there's currently a
  // service worker in control.
  if (navigator.serviceWorker.controller) {
    console.log(
      "This page is currently controlled by:",
      navigator.serviceWorker.controller,
    );
  }

  // Then, register a handler to detect when a new or
  // updated service worker takes control.
  navigator.serviceWorker.oncontrollerchange = () => {
    console.log(
      "This page is now controlled by",
      navigator.serviceWorker.controller,
    );
  };
} else {
  console.log("Service workers are not supported.");
}

规范

规范
Service Workers
# serviceworkercontainer-interface

浏览器兼容性

另见