Instancje robocze usługi rozszerzeń mogą teraz pozostawać przy życiu, dopóki otrzymują zdarzenia. Zwiększa to niezawodność procesów roboczych usług rozszerzeń, ale występuje pułapka, której należy unikać.
Od wersji Chrome 110 (dostępnej w wersji beta od 7 lutego 2023 r.) mechanizmy Service Worker rozszerzeń pozostają aktywne, dopóki otrzymują zdarzenia. To rozwiązuje problem z czasem we wcześniejszej implementacji mechanizmów Service Worker rozszerzenia. Czasy oczekiwania mogły wystąpić, gdy nowe zdarzenia znajdowały się w kolejce zdarzeń, i skrócić czasy asynchroniczne. To ulepszenie cofa maksymalny, 5-minutowy czas pracy instancji roboczych usługi rozszerzenia.
Z tego artykułu dowiesz się, jak zmieniły się te działania.
Wprowadzenie
Skrypty service worker rozszerzenia zwykle zachowują się jak instancje robocze usługi sieciowej, ale oprócz zdarzeń skryptu service worker mogą też nasłuchiwać zdarzeń rozszerzenia. Normalne zdarzenia skryptu service worker przedłużają czas życia skryptu service worker, ale przed wydaniem wersji 110 tylko kilka zdarzeń platformy rozszerzenia utrzymywało aktywność skryptu service worker.
Zwykle Chromium zamyka skrypt service worker po spełnieniu jednego z tych warunków:
- Skrypt service worker nie odebrał zdarzenia przez ponad 30 sekund i nie ma żadnych oczekujących długotrwałych zadań. Jeśli skrypt service worker odebrał w tym czasie zdarzenie, licznik czasu bezczynności został usunięty.
- Wykonanie długo trwającego zadania zajęło ponad 5 minut i w ciągu ostatnich 30 sekund nie odebrano żadnych zdarzeń.
Nowe zdarzenia Service Worker odebrane przed wygaśnięciem licznika czasu bezczynności lub długo trwającego zadania zresetują liczniki czasu i przedłużąłyby czas życia skryptu service worker.
To zachowanie nie dotyczyło zdarzeń rozszerzeń. Zdarzenia dotyczące rozszerzeń mogą wybudzić skrypt service worker i utrzymywać aktywność do momentu zakończenia zdarzenia, ale nie mogły wydłużyć 30-sekundowego licznika bezczynności. Oznaczało to, że mechanizmy Service Worker rozszerzenia mogą być zamykane w dowolnym momencie po zakończeniu ostatniego zdarzenia rozszerzenia, nawet jeśli przeglądarka właśnie wysłała do rozszerzenia nowe zdarzenie.
Co się zmieniło?
Od wersji Chrome 110 wszystkie zdarzenia resetują licznik bezczynności, a limit czasu bezczynności nie jest stosowany w przypadku zdarzeń oczekujących. Inaczej mówiąc, zakładając, że nie ma nieoczekiwanych przerw, instancje robocze usługi rozszerzenia zazwyczaj pozostają przy życiu, dopóki aktywnie przetwarzają zdarzenia. Dodatkowo wywołania interfejsów API Chrome właściwych dla rozszerzeń, na przykład chrome.storage.local.get()
, zresetują limit czasu bezczynności. Oto najważniejsze kwestie:
- Skrypt service worker kończy się po 30 sekundach braku aktywności. Odebranie zdarzenia lub wywołanie interfejsu API rozszerzenia powoduje zresetowanie tego licznika.
- Skrypt service worker kończy się, jeśli przetworzenie pojedynczego żądania, takiego jak zdarzenie lub wywołanie interfejsu API, trwa dłużej niż 5 minut.
Niektóre interfejsy API, na przykład natywne komunikaty, zapewniają silną ochronę, która anuluje oba te liczniki.
Nadal pracujemy nad tym, aby mechanizmy Service Worker zostały zakończone w miarę możliwości bez wyłączania długotrwałych zadań. Instancje robocze rozszerzenia uwzględniające zasoby powinny zawsze generować zyski, gdy jest to możliwe. Poza tym rozszerzenia powinny być stale przygotowane do nieoczekiwanego zakończenia. Zapewnia to ochronę przed nieprzewidywalnymi zdarzeniami, takimi jak wymuszanie zamknięcia przeglądarki przez użytkownika.
Zdjęcie: Paula Guerreiro, Unsplash