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

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

安裝

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

  1. install
  2. onInstall
  3. activate

ServiceWorkerRegistration.install

安裝期間觸發的第一個事件是網頁服務工作人員的 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 事件。請注意,與網頁服務工作人員不同,擴充功能安裝完成後會立即觸發這個事件,因為擴充功能中沒有類似於頁面重新載入的項目。

擴充功能啟動

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

閒置和關機

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

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

事件和對擴充功能 API 的呼叫會重設這些計時器,如果服務工作人員處於休眠狀態,傳入的事件會喚醒他們。不過,您還是應該設計 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 秒,以配合服務工作站生命週期。詳情請參閱 chrome.alarms

Chrome 118

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

Chrome 116

Chrome 116 推出下列服務工作站生命週期改善措施:

Chrome 114

使用長期訊息傳遞傳送訊息可讓 Service Worker 維持運作。開啟通訊埠時,計時器不會再重設。

Chrome 110

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

Chrome 109

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

Chrome 105

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