擴充功能服務工作站會回應標準 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 生命週期的改善項目:
有效的
WebSocket
連線現在會延長擴充功能 Service Worker 的生命週期。在擴充功能服務工作站中,透過WebSocket
傳送或接收訊息,會重設 Service Worker 的閒置計時器。允許額外的擴充功能 API 超過擴充功能服務工作站的五分鐘逾時期間。這些 API 會顯示使用者提示,因此可能需要超過五分鐘才能解決問題。包括
desktopCapture.chooseDesktopMedia()
、identity.launchWebAuthFlow()
、management.uninstall()
和permissions.request()
。
Chrome 114
使用長效訊息傳送訊息,可讓 Service Worker 保持運作。以往開啟通訊埠時,系統會重設計時器,但傳送訊息則不會。開啟通訊埠後,系統不會重設計時器。
Chrome 110
Extension API 呼叫會重設計時器。在此之前,只有執行中的事件處理常式會讓 Service Worker 保持運作。任何已排入佇列,但尚未呼叫處理常式的事件都不會導致重設。
Chrome 指南
從畫面外文件傳送的訊息會重設計時器。
Chrome 指南
使用 chrome.runtime.connectNative()
連線至原生訊息傳遞主機時,Service Worker 將保持運作。如果主機程序當機或關機,通訊埠會關閉,Service Worker 也會在計時器結束時終止。如要防範這種情況,請在通訊埠的 on Hold 事件處理常式中呼叫 chrome.runtime.connectNative()
。