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

擴充功能服務工作站會回應標準 Service Worker 事件,以及擴充功能命名空間中的事件。使用擴充功能時,通常其中一種類型會隨類型依序呈現。

安裝

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

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

最後,會觸發 Service Worker 的 activate 事件。請注意,有別於網路服務處理程式,此事件會在擴充功能安裝之後立即觸發,因為擴充功能中的頁面重新載入頁面沒有太大作用。

擴充功能啟動

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

閒置和關機

一般而言,如果符合下列任一條件,Chrome 就會終止 Service Worker:

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

事件和擴充功能 API 的呼叫會重設這些計時器,如果服務 Worker 已停止運作,傳入事件都會恢復這些計時器。儘管如此,您應該設計出能彈性因應非預期終止的服務。

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

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

關閉 Service Worker 後,您設定的所有全域變數都會遺失。不要使用全域變數,而是將值儲存至儲存空間。可用選項如下所示。請注意,Web Storage API 不適用於擴充功能服務 Worker。

chrome.storage API
這項擴充功能 API 提供多種儲存空間,包括本機、工作階段、受管理 (網域) 和同步處理功能。這個 API 會儲存以開發人員定義的金鑰識別和擷取的 JSON 物件。使用者清除網頁快取時,並不會移除這種儲存空間。
IndexedDB API
適用於用戶端儲存結構化資料的低階 API,包括檔案和 blob。這個 API 提供了建立交易資料儲存與擷取的基本功能。雖然這個 API 對簡易用途來說通常過於複雜,但目前已發展出許多第三方儲存空間解決方案。
CacheStorage API
要求和回應物件組合的永���儲存機制。這個 API 是專為網路服務 Worker 所設計,可用於從端點擷取資料。這個 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 導入了下列 Service Worker 生命週期的改善項目:

Chrome 114

使用長效訊息傳送訊息,可讓 Service Worker 保持運作。以往開啟通訊埠時,系統會重設計時器,但傳送訊息則不會。開啟通訊埠後,系統不會重設計時器。

Chrome 110

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

Chrome 指南

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

Chrome 指南

使用 chrome.runtime.connectNative() 連線至原生訊息傳遞主機時,Service Worker 將保持運作。如果主機程序當機或關機,通訊埠會關閉,Service Worker 也會在計時器結束時終止。如要防範這種情況,請����訊埠的 on Hold 事件處理常式中呼叫 chrome.runtime.connectNative()