Cykl życia skryptu service worker rozszerzenia

Skrypty service worker rozszerzenia reagują zarówno na standardowe zdarzenia skryptów service worker, 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. Występują 3 zdarzenia w tej kolejności:

  1. install (zdarzenie skryptu service worker)
  2. browser.runtime.onInstalled (zdarzenie rozszerzenia)
  3. activate (zdarzenie skryptu service worker)

ServiceWorkerRegistration.install

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

browser.runtime.onInstalled

Następne jest zdarzenie onInstalled rozszerzenia, które jest wywoływane, gdy rozszerzenie (nie skrypt service worker) 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.

browser.runtime.onInstalled.addListener((details) => {
  if(details.reason !== "install" && details.reason !== "update") return;
  browser.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 wczytania strony.

Uruchamianie rozszerzenia

Po uruchomieniu profilu użytkownika wywoływane jest zdarzenie browser.runtime.onStartup, ale nie są wywoływane żadne zdarzenia skryptu service worker.

Bezczynność i wyłączanie

Zwykle Chrome kończy działanie skryptu service worker, gdy zostanie spełniony 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 skrypt service worker 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, w miarę możliwości unikaj utrzymywania działania skryptu service worker w nieskończoność. Przetestuj rozszerzenia, aby upewnić się, że nie robisz tego nieumyślnie.

Zapisywanie danych zamiast używania zmiennych globalnych

Jeśli skrypt service worker zostanie wyłączony, wszystkie ustawione zmienne globalne zostaną utracone. Zamiast używać zmiennych globalnych, zapisuj wartości w pamięci. Wyświetlą się dostępne opcje.

browser.storage API
Interfejs API rozszerzenia, który oferuje kilka typów pamięci: lokalną, sesji, 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 uporządkowanych danych, w tym plików i obiektów binarnych. Ten interfejs API udostępnia elementy podstawowe 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 pamięci trwałej dla par obiektów żądań i odpowiedzi. Ten interfejs API został zaprojektowany specjalnie dla procesów roboczych usług internetowych 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 browser.storage.

Wybieranie minimalnej wersji Chrome

Od czasu wprowadzenia platformy Manifest V3 wprowadziliśmy kilka ulepszeń dotyczących czasu życia skryptów service worker. 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 skryptu service worker. Więcej informacji znajdziesz w sekcji browser.alarms.

Chrome 118

Aktywne sesje debugera utworzone za pomocą interfejsu browser.debugger API utrzymują teraz działanie skryptu service worker. Zapobiega to wygaśnięciu limitu czasu procesów service worker podczas wywołań tego interfejsu API.

Chrome 116

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

  • Aktywne połączenia WebSocket wydłużają teraz czas działania skryptu service worker rozszerzenia. Wysyłanie lub odbieranie wiadomości w WebSocket w skrypcie service worker rozszerzenia resetuje licznik czasu bezczynności tego skryptu.

  • Dodatkowe interfejsy API rozszerzeń mogą przekraczać 5-minutowy limit czasu dla procesów roboczych rozszerzeń. 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

Wysyłanie wiadomości za pomocą długotrwałego przesyłania wiadomości utrzymuje aktywność skryptu service worker. Otwieranie portu nie resetuje już liczników czasu.

Chrome 110

Wywołania interfejsu API rozszerzenia resetują minutniki. Wcześniej tylko uruchomione moduły obsługi zdarzeń utrzymywały skrypt service worker w stanie aktywnym. 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 hostem natywnego przesyłania komunikatów za pomocą browser.runtime.connectNative() utrzyma działanie skryptu service worker. Jeśli proces hosta ulegnie awarii lub zostanie wyłączony, port zostanie zamknięty, a skrypt service worker zakończy działanie po upływie czasu odliczania. Aby temu zapobiec, wywołaj funkcję browser.runtime.connectNative() w module obsługi zdarzeń onDisconnect portu.