Cykl życia skryptu service worker rozszerzenia

Skrypty service worker rozszerzeń 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 podczas korzystania z rozszerzenia jeden typ zdarzenia następuje po drugim.

Instalacja

Instalacja następuje, gdy użytkownik instaluje lub aktualizuje skrypt service worker z Chrome Web Store albo gdy wczytuje lub aktualizuje rozpakowane rozszerzenie za pomocą strony chrome://extensions. Występują 3 zdarzenia w tej kolejności:

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

ServiceWorkerRegistration.install

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

chrome.runtime.onInstalled

Następnie występuje zdarzenie onInstalled rozszerzenia, które jest wywoływane, gdy rozszerzenie (a nie skrypt service worker) jest instalowane po raz pierwszy, gdy rozszerzenie jest aktualizowane do nowej wersji oraz 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 aktywacji service workera. Pamiętaj, że w przeciwieństwie do skryptów service worker to zdarzenie jest wywoływane natychmiast po zainstalowaniu rozszerzenia, ponieważ w rozszerzeniu nie ma niczego, co można by porównać do ponownego wczytania strony.

Uruchamianie rozszerzenia

Gdy uruchamia się profil użytkownika, wywoływane jest zdarzenie chrome.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 bezczynnoś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 przeszedł w stan uśpienia, przychodzące zdarzenie go ożywi. Mimo to należy zaprojektować skrypt service worker tak, aby był odporny na nieoczekiwane zakończenie działania.

Aby zoptymalizować zużycie zasobów przez rozszerzenie, unikaj, jeśli to możliwe, utrzymywania skryptu service worker w stanie aktywnym przez czas nieokreślony. Przetestuj rozszerzenia, aby upewnić się, że nie robisz tego nieumyślnie.

Zamiast zmiennych globalnych używaj trwałych danych

Wszystkie ustawione zmienne globalne zostaną utracone, jeśli skrypt service worker zostanie wyłączony. Zamiast zmiennych globalnych zapisuj wartości w pamięci. Oto dostępne opcje.

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 dewelopera. Ten typ pamięci nie jest usuwany, gdy użytkownik wyczyści pamięć podręczną.
IndexedDB API
Interfejs API niskiego poziomu do przechowywania po stronie klienta danych strukturalnych, w tym plików i obiektów blob. Ten interfejs API udostępnia elementy pierwotne 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 innych firm.
CacheStorage API
Mechanizm pamięci trwałej dla par obiektów Request i Response. Ten interfejs API został zaprojektowany specjalnie dla service workerów 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 jak ważne jest, aby użytkownicy widzieli aktualne dane. Więcej informacji znajdziesz w artykule The Offline Cookbook. Jeśli nie używasz serwera proxy do obsługi żądań sieciowych za pomocą modułu obsługi pobierania, użyj chrome.storage.

Wybierz minimalną wersję Chrome

Od czasu wprowadzenia Manifestu 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 znać pewne warunki. Jeśli te warunki nie mają wpływu na rozszerzenie, możesz pominąć tę sekcję. Jeśli tak jest, rozważ określenie minimalnej wersji Chrome w pliku manifestu.

Chrome 120

Alarmy można teraz ustawić na minimalny okres 30 sekund, aby dopasować je do cyklu życia skryptu service worker. Więcej informacji znajdziesz w artykule chrome.alarms.

Chrome 118

Aktywne sesje debugowania utworzone za pomocą interfejsu chrome.debugger API utrzymują teraz skrypt service worker w stanie aktywnym. Zapobiega to przekroczeniu limitu czasu service workerów podczas wywołań tego interfejsu API.

Chrome 116

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

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

  • Dodatkowe interfejsy API rozszerzeń mogą przekraczać 5-minutowy limit czasu dla service workerów rozszerzeń. Te interfejsy API wyświetlają prośbę o zgodę użytkownika, dlatego ich rozwiązanie może potrwać dłużej niż 5 minut. Obejmują one 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 skrypt service worker w stanie aktywnym. Otwarcie portu nie resetuje już liczników czasu.

Chrome 110

Wywołania interfejsu API rozszerzenia resetują liczniki czasu. Wcześniej tylko uruchomione moduły obsługi zdarzeń utrzymywały skrypt service worker w stanie aktywnym. Wszelkie zdarzenia, które zostały umieszczone w kolejce, ale dla których nie wywołano modułu obsługi, nie spowodują resetu.

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ą chrome.runtime.connectNative() utrzymuje skrypt service worker w stanie aktywnym. 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. Aby się przed tym zabezpieczyć, wywołaj chrome.runtime.connectNative() w module obsługi zdarzeń onDisconnect portu.