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

擴充功能服務 worker 會回應標準服務 worker 事件和擴充功能命名空間中的事件。這兩種類型的事件經常在擴充功能使用期間一一發生,因此會一併顯示。

安裝

使用者從 Chrome 線上應用程式商店安裝或更新服務工作者,或是使用 chrome://extensions 頁面載入或更新未解壓縮的擴充功能時,就會進行安裝作業。以下有三個事件發生。

ServiceWorkerRegistration.install

安裝期間觸發的第一個事件是網路服務 worker 的 install 事件。

chrome.runtime.onInstalled

接著是擴充功能的 onInstalled 事件,會在首次安裝擴充功能 (而非服務工作者)、擴充功能更新至新版本,以及 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」事件會觸發。請注意,與網路服務 worker 不同,這個事件會在安裝擴充功能後立即觸發,因為擴充功能中沒有任何可與頁面重新載入相提並論的事件。

擴充功能啟動

當使用者設定檔啟動時,chrome.runtime.onStartup 事件會觸發,但不會叫用任何服務工作者事件。

閒置和關機

一般來說,Chrome 會在符合下列任一條件時終止服務工作者:

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

事件和對擴充功能 API 的呼叫會重設這些計時器,如果服務工作者處於休眠狀態,則會因收到的事件而復甦。不過,您應設計可在服務 worker 意外終止時恢復的服務 worker。

如要最佳化擴充功能的資源用量,請盡可能避免讓服務工作處理程序無限期持續運作。請測試擴充功能,確認你並未不小心執行這項操作。

儲存資料,而非使用全域變數

如果服務工作者關閉,您設定的所有全域變數都會遺失。請改為將值儲存至儲存空間,而非使用全域變數。請參閱下方選項。請注意,Web Storage API 不適用於擴充功能的服務工作站。

chrome.storage API
擴充功能 API 提供多種儲存空間類型,包括本機、工作階段、受管理 (網域) 和同步。這個 API 會儲存透過開發人員定義的鍵來識別及擷取的 JSON 物件。使用者清除網頁快取時,這類儲存空間不會遭到移除。
IndexedDB API
在用戶端儲存結構化資料 (包括檔案和 blob) 的低階 API。這個 API 提供原始碼,可用於建立交易資料儲存和擷取作業。雖然這個 API 通常不適合用於簡單的用途,但許多第三方儲存空間解決方案都是以此為基礎。
CacheStorage API
要求與回應物件組合的永久儲存機制。這個 API 專為網路服務 worker 設計,用於從端點擷取資料。您可以透過多種方式使用這個 API,具體取決於使用者是否需要查看最新資料,以及這項需求的優先程度。詳情請參閱離線食譜。除非您要透過擷取處理常式特別設定網路要求的 Proxy,否則應使用 chrome.storage

選擇最低的 Chrome 版本

自 Manifest V3 發布以來,我們對服務工作者生命週期進行了多項改善。也就是說,如果 Manifest V3 擴充功能支援較舊的 Chrome 版本,您必須留意相關條件。如果這些條件並未影響您的擴充功能,您可以繼續進行這個部分。如果是這樣,建議您在資訊清單中指定最低 Chrome 版本

Chrome 120

鬧鐘現在可設定為最短 30 秒,以符合服務工作程生命週期。詳情請參閱 chrome.alarms

Chrome 118

使用 chrome.debugger API 建立的活躍偵錯工具工作階段現在會讓服務工作者保持運作。這樣可以防止 Service Worker 在呼叫這個 API 時逾時。

Chrome 116

Chrome 116 推出了下列 Service Worker 生命週期改善項目:

Chrome 114

使用長效訊息傳送訊息時,服務工作程式會持續運作。過去,開啟通訊埠會重設計時器,但傳送訊息不會。開啟通訊埠後,計時器不會重設。

Chrome 110

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

Chrome 109

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

Chrome 105

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