擴充功能服務工作站生命週期

擴充功能 Service Worker 會回應標準 Service Worker 事件,以及擴充功能命名空間中的事件。這兩種型別會一起顯示,因為擴充功能使用期間,通常會先出現一種型別,接著出現另一種型別。

安裝

使用者從 Chrome 線上應用程式商店安裝或更新 Service Worker,或是使用 chrome://extensions 頁面載入或更新未封裝的擴充功能時,就會發生安裝作業。依序發生下列三個事件:

  1. install (Service Worker 事件)
  2. chrome.runtime.onInstalled (擴充功能事件)
  3. activate (Service Worker 事件)

ServiceWorkerRegistration.install

安裝期間觸發的第一個事件是網頁服務工作人員的 install 事件。

chrome.runtime.onInstalled

接下來是擴充功能的 onInstalled 事件,這個事件會在首次安裝擴充功能 (而非 Service Worker) 時、擴充功能更新至新版本時,以及 Chrome 更新至新版本時觸發。您可以使用這個事件設定狀態,或進行一次性初始化作業,例如內容選單

chrome.runtime.onInstalled.addListener((details) => {
  if(details.reason !== "install" && details.reason !== "update") return;
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

ServiceWorkerRegistration.active

最後,系統會觸發服務工作人員的 activate 事件。請注意,與 Service Worker 不同,擴充功能安裝完成後會立即觸發這個事件,因為擴充功能中沒有類似於頁面重新載入的動作。

擴充功能啟動

使用者設定檔啟動時,系統會觸發 chrome.runtime.onStartup 事件,但不會叫用任何 Service Worker 事件。

閒置和關機

通常在符合下列任一條件時,Chrome 會終止 Service Worker:

  • 閒置 30 秒後。收到事件或呼叫擴充功能 API 時,系統會重設這個計時器。
  • 單一要求 (例如事件或 API 呼叫) 的處理時間超過 5 分鐘。
  • fetch() 回應時間超過 30 秒。

事件和對擴充功能 API 的呼叫會重設這些計時器,如果 Service Worker 處於休眠狀態,傳入的事件會喚醒他們。不過,您還是應該設計 Service Worker,以防範非預期終止。

為盡量減少擴充功能耗用的資源,請避免讓 Service Worker 無限期保持運作。測試擴充功能,確保您並非無意間這麼做。

保留資料,而非使用全域變數

如果 Service Worker 關閉,您設定的任何全域變數都會遺失。請將值儲存至儲存空間,而非使用全域變數。系統會列出可用的選項。

chrome.storage API
擴充功能 API,提供多種儲存空間類型:本機、工作階段、受管理 (網域) 和同步。這個 API 會儲存以開發人員定義的鍵識別及擷取的 JSON 物件。使用者清除網路快取時,這類儲存空間不會移除。
IndexedDB API
用於用戶端儲存結構化資料 (包括檔案和 Blob) 的低階 API。這個 API 提供用於建立交易資料儲存和擷取的基元。雖然這個 API 對某些用途來說過於複雜,但許多第三方儲存空間解決方案都是以這個 API 為基礎建構而成。
CacheStorage API
要求和回應物件配對的永久儲存空間機制。這項 API 專為網頁服務工作人員設計,用於從端點擷取資料。視使用者查看最新資料的必要程度和方式而定,您可以使用各種方式運用這項 API。詳情請參閱離線食譜。除非您是使用擷取處理常式來代理網路要求,否則應使用 chrome.storage

選擇最低 Chrome 版本

自 Manifest V3 發布以來,我們對 Service Worker 的生命週期進行了多項改善。也就是說,如果 Manifest V3 擴充功能支援舊版 Chrome,您必須留意相關條件。如果這些情況不會影響擴充功能,您可以略過本節。如果會,請考慮在資訊清單中指定最低 Chrome 版本

Chrome 120

現在可以將鬧鐘設為最短 30 秒,配合 Service Worker 生命週期。詳情請參閱 chrome.alarms

Chrome 118

使用 chrome.debugger API 建立的有效偵錯工具工作階段,現在會讓 Service Worker 維持運作。這樣可避免服務工作人員在呼叫此 API 時逾時。

Chrome 116

Chrome 116 推出下列 Service Worker 生命週期改善措施:

Chrome 114

使用long-lived messaging傳送訊息可讓 Service Worker 保持運作。開啟通訊埠不會再重設計時器。

Chrome 110

擴充功能 API 呼叫會重設計時器。在此之前,只有正在執行的事件處理常式會讓 Service Worker 保持運作。如果事件已加入佇列,但尚未呼叫處理常式,就不會導致重設。

Chrome 109

從螢幕外文件傳送的訊息會重設計時器。

Chrome 105

使用 chrome.runtime.connectNative() 連線至內建訊息傳遞主機,可讓 Service Worker 保持運作。如果主機程序異常終止或關閉,系統會關閉通訊埠,Service Worker 會在計時器完成後終止。如要防範這種情況,請在通訊埠的 onDisconnect 事件處理常式中呼叫 chrome.runtime.connectNative()