擴充功能服務 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。
為盡量減少擴充功能的資源耗用量,請盡可能避免讓服務工作單元無限期運作。請測試擴充功能,確認你並未不小心執行這項操作。
儲存資料,而非使用全域變數
如果服務工作者關閉,您設定的所有全域變數都會遺失。請改為將值儲存至儲存空間,而非使用全域變數。請參閱下方選項。請注意,擴充功能服務 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 建立的活躍偵錯工具工作階段現在會讓服務工作者保持運作。這麼做可避免服務工作者在呼叫此 API 時逾時。
Chrome 116
Chrome 116 推出了下列服務工作者生命週期改善措施:
有效的
WebSocket
連線現在可延長擴充功能服務 worker 的生命週期。在擴充功能服務 worker 中透過WebSocket
傳送或接收訊息,會重設服務 worker 的閒置計時器。其他擴充功能 API 可超過擴充功能服務 worker 的五分鐘逾時期限。這些 API 會顯示使用者提示,因此可能需要超過五分鐘的時間才能解決。包括
desktopCapture.chooseDesktopMedia()
、identity.launchWebAuthFlow()
、management.uninstall()
和permissions.request()
。
Chrome 114
使用長效訊息傳送訊息時,服務工作程式會持續運作。先前,開啟通訊埠會重設計時器,但傳送訊息不會。開啟通訊埠後,計時器不會再重設。
Chrome 110
擴充功能 API 呼叫會重設計時器。在此之前,只有執行中的事件處理常式會讓服務工作站保持運作。任何已排入佇列但未呼叫處理常式的事件,都不會導致重設。
Chrome 109
從離螢幕文件傳送的訊息會重設計時器。
Chrome 105
使用 chrome.runtime.connectNative()
連線至原生訊息主機,可讓服務工作者保持運作。如果主機程序異常終止或關閉,則會關閉連接埠,並在計時器完成後終止服務工作程式。在連接埠的 onDisconnect 事件處理常式中呼叫 chrome.runtime.connectNative()
,即可防範這種情況。