只要擴充功能服務 worker 收到事件,現在就能持續運作。這麼做可提高擴充功能服務工作站的可靠性,但有一個應避免的陷阱。
自 Chrome 110 版 (2023 年 2 月 7 日推出 Beta 版) 起,只要擴充功能服務 worker 收到事件,就會保持運作。這項修正可解決先前實作擴充功能服務 worker 時發生的時間問題。當新事件出現在事件佇列中,且超時會截斷非同步工作時,就有可能發生超時。這項改善項目會移除擴充功能服務 worker 的五分鐘最長存留期。
本文將說明這些行為的變化情形。
背景
擴充功能服務工作站的行為大多與網路服務工作站類似,但除了服務工作站事件之外,擴充功能服務工作站還可以監聽擴充功能事件。雖然一般服務工作者事件會延長服務工作者的生命週期,但在 110 版發布前,只有少數延伸平台事件會讓延伸服務工作者保持運作。
一般來說,Chromium 會在符合下列任一條件後終止服務工作者:
- 服務工作管理員超過 30 秒未收到事件,且沒有任何未完成的長時間執行工作。如果服務工作者在該期間收到事件,系統就會移除閒置計時器。
- 長時間執行的工作需要超過五分鐘才能完成,且過去三十秒內未收到任何事件。
在閒置計時器或長時間執行工作計時器到期前收到的新服務工作站事件會重設計時器,並延長服務工作站的生命週期。
很抱歉,這項行為不適用於擴充功能事件。擴充功能事件可以喚醒擴充功能服務 worker,並在事件完成前保持運作,但無法延長 30 秒的閒置計時器。這意味著,在最後一個擴充功能事件完成後,擴充功能服務 worker 隨時可能會終止,即使瀏覽器剛將新事件派送至擴充功能也是如此。
異動情形
自 Chrome 110 起,所有事件都會重設閒置計時器,且如果有待處理事件,就不會發生閒置逾時。換句話說,假設沒有任何意外中斷,只要擴充功能服務工作站持續處理事件,就會保持運作。此外,呼叫擴充功能專屬 Chrome API (例如 chrome.storage.local.get()
) 也會重設閒置逾時時間。詳細說明:
- 服務工作站會在閒置 30 秒後終止。(接收事件或呼叫擴充功能 API 會重設此計時器)。
- 如果單一要求 (例如事件或 API 呼叫) 的處理時間超過 5 分鐘,服務工作者就會終止。
原生訊息等部分 API 提供強大的保活功能,可取消這兩個計時器。
我們仍在努力確保擴充功能 Service Worker 能盡可能終止,而不會關閉長時間執行的工作。資源意識的擴充功能服務 worker 應盡可能產生。此外,擴充功能應透過保存狀態,為意外終止做好準備。這可防範使用者強制關閉瀏覽器等無法預測的事件。
相片來源:Paula Guerreiro 在 Unsplash 網站上提供