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

擴充功能服務工作站會回應標準 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()