Cykl życia skryptu service worker rozszerzenia

Procesy robocze rozszerzeń reagują zarówno na standardowe zdarzenia procesów roboczych, jak i na zdarzenia w przestrzeniach nazw rozszerzeń. Są one prezentowane razem, ponieważ często jeden typ następuje po drugim podczas korzystania z rozszerzenia.

Instalacja

Instalacja następuje, gdy użytkownik zainstaluje lub zaktualizuje service worker ze sklepu Chrome Web Store albo gdy wczyta lub zaktualizuje rozpakowane rozszerzenie na stronie chrome://extensions. Następują 3 zdarzenia w tej kolejności:

  1. install
  2. onInstall
  3. activate

ServiceWorkerRegistration.install

Pierwszym zdarzeniem wywoływanym podczas instalacji jest zdarzenie install w przypadku service workera.

chrome.runtime.onInstalled

Następne jest zdarzenie onInstalled rozszerzenia, które jest wywoływane, gdy rozszerzenie (nie proces roboczy usługi) jest instalowane po raz pierwszy, gdy rozszerzenie jest aktualizowane do nowej wersji i gdy Chrome jest aktualizowany do nowej wersji. Użyj tego zdarzenia, aby ustawić stan lub przeprowadzić jednorazową inicjację, np. menu kontekstowego.

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

Na koniec wywoływane jest zdarzenie activate w service workerze. Pamiętaj, że w przeciwieństwie do skryptów service worker w internecie to zdarzenie jest wywoływane natychmiast po zainstalowaniu rozszerzenia, ponieważ w rozszerzeniu nie ma odpowiednika ponownego załadowania strony.

Uruchamianie rozszerzenia

Gdy profil użytkownika się uruchamia, wywoływane jest zdarzenie chrome.runtime.onStartup, ale nie są wywoływane żadne zdarzenia service workera.

Bezczynność i wyłączanie

Zwykle Chrome kończy działanie service workera, gdy spełniony jest jeden z tych warunków:

  • Po 30 sekundach braku aktywności. Otrzymanie zdarzenia lub wywołanie interfejsu API rozszerzenia resetuje ten licznik czasu.
  • Gdy przetworzenie pojedynczego żądania, np. zdarzenia lub wywołania interfejsu API, trwa dłużej niż 5 minut.
  • Gdy odpowiedź fetch() dociera po ponad 30 sekundach.

Zdarzenia i wywołania interfejsów API rozszerzeń resetują te liczniki czasu, a jeśli proces roboczy usługi przejdzie w stan uśpienia, przychodzące zdarzenie go wybudzi. Niemniej jednak skrypt service worker powinien być odporny na nieoczekiwane zakończenie działania.

Aby zoptymalizować zużycie zasobów przez rozszerzenie, unikaj nieograniczonego działania skryptu service worker, jeśli to możliwe. Przetestuj rozszerzenia, aby upewnić się, że nie robisz tego nieumyślnie.

Zapisywanie danych zamiast używania zmiennych globalnych

Wszystkie ustawione zmienne globalne zostaną utracone, jeśli usługa Service Worker zostanie zamknięta. Zamiast używać zmiennych globalnych, zapisuj wartości w pamięci. Wyświetlą się dostępne opcje.

Interfejs chrome.storage API
Interfejs API rozszerzenia, który oferuje kilka typów pamięci: lokalną, sesyjną, zarządzaną (domena) i synchronizowaną. Ten interfejs API przechowuje obiekty JSON identyfikowane i pobierane za pomocą kluczy zdefiniowanych przez programistę. Ten typ pamięci nie jest usuwany, gdy użytkownik czyści pamięć podręczną przeglądarki.
IndexedDB API
Interfejs API niskiego poziomu do przechowywania po stronie klienta danych strukturalnych, w tym plików i obiektów binarnych. Ten interfejs API udostępnia elementy do tworzenia transakcyjnego przechowywania i pobierania danych. Chociaż ten interfejs API jest często zbyt skomplikowany w niektórych przypadkach użycia, opiera się na nim wiele rozwiązań do przechowywania danych firm zewnętrznych.
CacheStorage API
Mechanizm trwałego przechowywania par obiektów żądań i odpowiedzi. Ten interfejs API został zaprojektowany specjalnie dla skryptów service worker i służy do pobierania danych z punktu końcowego. Istnieje wiele sposobów korzystania z tego interfejsu API, w zależności od tego, czy i w jakim stopniu użytkownicy muszą widzieć aktualne dane. Więcej informacji znajdziesz w książce kucharskiej dotyczącej trybu offline. Jeśli nie przekierowujesz żądań sieciowych za pomocą modułu obsługi pobierania, używaj chrome.storage.

Wybieranie minimalnej wersji Chrome

Od czasu wprowadzenia Manifestu V3 wprowadziliśmy kilka ulepszeń dotyczących czasu życia service workerów. Oznacza to, że jeśli rozszerzenie Manifest V3 obsługuje starsze wersje Chrome, musisz pamiętać o pewnych warunkach. Jeśli te warunki nie mają wpływu na Twoje rozszerzenie, możesz pominąć tę sekcję. Jeśli tak jest, rozważ podanie w pliku manifestu minimalnej wersji Chrome.

Chrome 120

Alarmy można teraz ustawiać na minimalny okres 30 sekund, aby dopasować je do cyklu życia procesu usługi. Więcej informacji znajdziesz w sekcji chrome.alarms.

Chrome 118

Aktywne sesje debugera utworzone za pomocą interfejsu chrome.debugger API utrzymują teraz działanie service workera. Zapobiega to wygaśnięciu limitu czasu w przypadku procesów roboczych usługi podczas wywoływania tego interfejsu API.

Chrome 116

W Chrome 116 wprowadziliśmy te ulepszenia dotyczące czasu życia service workerów:

  • Aktywne połączenia WebSocket wydłużają teraz czas działania komponentu service worker rozszerzenia. Wysyłanie i odbieranie wiadomości w WebSocket w procesie roboczym usługi rozszerzenia resetuje licznik czasu bezczynności tego procesu.

  • Dodatkowe interfejsy API rozszerzeń mogą przekraczać 5-minutowy limit czasu dla procesów roboczych usługi rozszerzenia. Te interfejsy API wyświetlają prośbę do użytkownika, więc rozwiązanie problemu może zająć więcej niż 5 minut. Są to m.in. desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() i permissions.request().

Chrome 114

Wysłanie wiadomości za pomocą długotrwałego przesyłania komunikatów utrzymuje aktywność service workera. Otwieranie portu nie powoduje już resetowania liczników czasu.

Chrome 110

Wywołania interfejsu API rozszerzenia resetują minutniki. Wcześniej tylko uruchomione procedury obsługi zdarzeń utrzymywały skrypt service worker przy życiu. Wszystkie zdarzenia, które zostały umieszczone w kolejce, ale dla których nie wywołano modułu obsługi, nie powodowałyby resetowania.

Chrome 109

Wiadomości wysyłane z dokumentu poza ekranem resetują liczniki czasu.

Chrome 105

Połączenie z natywnym hostem przesyłania wiadomości za pomocą chrome.runtime.connectNative() utrzyma działanie service workera. Jeśli proces hosta ulegnie awarii lub zostanie zamknięty, port zostanie zamknięty, a usługa Service Worker zakończy działanie po upływie czasu odliczania. Aby temu zapobiec, wywołaj funkcję chrome.runtime.connectNative() w module obsługi zdarzeń onDisconnect portu.