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.club.tw/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

瀏覽器相容性

另見