Cykl życia skryptu service worker rozszerzenia

Skrypty service worker rozszerzeń reagują zarówno na standardowe zdarzenia skryptu service worker, jak i na zdarzenia w przestrzeniach nazw rozszerzeń. Są one prezentowane razem, ponieważ często podczas korzystania z rozszerzenia jeden z nich występuje po sobie.

Instalacja

Instalacja ma miejsce, gdy użytkownik zainstaluje lub zaktualizuje mechanizm service worker ze sklepu Chrome Web Store lub załaduje lub zaktualizuje rozszerzenie bez pakietu na stronie chrome://extensions. Występują 3 zdarzenia w podanej niżej kolejności.

ServiceWorkerRegistration.install

Pierwsze zdarzenie wywoływane podczas instalacji to zdarzenie instalacji skryptu internetowego.

chrome.runtime.onInstalled

Następne jest zdarzenie onInstalled rozszerzenia, które jest wywoływane po pierwszym zainstalowaniu rozszerzenia (nie skryptach service worker), po zaktualizowaniu rozszerzenia do nowej wersji i zaktualizowaniu Chrome do nowej wersji. Umożliwia ono ustawienie stanu lub jednorazowe inicjowanie, np. za pomocą 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 uruchamiane jest zdarzenie activate skryptu service worker. Pamiętaj, że w przeciwieństwie do skryptów service worker zdarzenie to jest wywoływane natychmiast po zainstalowaniu rozszerzenia, ponieważ nie ma nic wspólnego z ponownym załadowaniem strony w rozszerzeniu.

Uruchamianie rozszerzenia

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

Bezczynność i wyłączenie

Normalnie Chrome zamyka skrypt service worker, gdy zostanie spełniony jeden z tych warunków:

  • Po 30 sekundach braku aktywności. Odebranie zdarzenia lub wywołanie interfejsu API rozszerzenia resetuje ten licznik czasu.
  • Gdy przetworzenie pojedynczego żądania, takiego jak zdarzenie lub wywołanie interfejsu API, trwa dłużej niż 5 minut.
  • Gdy odpowiedź fetch() pojawia się po więcej niż 30 sekundach.

Zdarzenia i wywołania interfejsów API rozszerzeń resetują liczniki czasu, a jeśli skrypt service worker był uśpiony, przychodzące zdarzenie je przywróci. Warto jednak zaprojektować skrypt service worker tak, by był odporny na nieoczekiwane zakończenie działania.

Aby zoptymalizować wykorzystanie zasobów przez rozszerzenie, w miarę możliwości unikaj utrzymywania aktywności skryptu service worker przez cały czas. Przetestuj rozszerzenia, aby upewnić się, że nie robisz tego przypadkowo.

Zachowywanie danych zamiast używania zmiennych globalnych

Jeśli skrypt service worker się wyłączy, wszystkie ustawione zmienne globalne zostaną utracone. Zamiast używać zmiennych globalnych, zapisz wartości w pamięci. Dostępne opcje znajdziesz poniżej. Pamiętaj, że interfejs Web Storage API jest niedostępny w przypadku skryptu service worker rozszerzeń.

Interfejs API chrome.storage
Interfejs API rozszerzeń oferuje wiele typów miejsca na dane: lokalne, sesje, zarządzane (domena) i synchronizacji. Ten interfejs API przechowuje obiekty JSON zidentyfikowane i pobrane przy użyciu kluczy zdefiniowanych przez programistę. Ten rodzaj pamięci nie zostanie usunięty, gdy użytkownik wyczyści internetową pamięć podręczną.
Interfejs IndexedDB API
Interfejs API niskiego poziomu do przechowywania po stronie klienta uporządkowanych danych, w tym plików i obiektów blob. Ten interfejs API udostępnia podstawowe funkcje do tworzenia i pobierania danych transakcyjnych. Chociaż ten interfejs API jest często zbyt skomplikowany w prostych zastosowaniach, istnieje wiele zewnętrznych rozwiązań do przechowywania danych.
Interfejs API CacheStorage
Mechanizm stałej pamięci masowej dla par obiektów żądania i odpowiedzi. Ten interfejs API został zaprojektowany specjalnie dla mechanizmów obsługi usług sieciowych i służy do pobierania danych z punktu końcowego. Można korzystać z tego interfejsu API na różne sposoby w zależności od tego, czy i jak ważne jest, aby użytkownicy mieli dostęp do aktualnych danych. Więcej informacji znajdziesz w Książkach kucharskich offline. Jeśli nie przekazujesz żądań sieciowych do serwera proxy za pomocą modułu obsługi pobierania, używaj polecenia chrome.storage.

Wybierz minimalną wersję Chrome

Od momentu opublikowania platformy Manifest V3 wprowadziliśmy kilka ulepszeń w czasie eksploatacji skryptu service worker. Oznacza to, że jeśli rozszerzenie Manifest V3 obsługuje wcześniejsze wersje Chrome, musisz pamiętać o pewnych warunkach. Jeśli te warunki nie wpływają na rozszerzenie, możesz przejść do następnego kroku w tej sekcji. Jeśli tak jest, możesz określić minimalną wersję Chrome w pliku manifestu.

Chrome 120

Alarmy można teraz ustawić na minimalny okres 30 s, aby dostosować je do cyklu życia skryptu service worker. Więcej informacji: chrome.alarms.

Chrome 118

Aktywne sesje debugera utworzone przy użyciu interfejsu API chrome.debugger podtrzymują działanie skryptu service worker. Zapobiega to przekroczeniu limitu czasu wywołań tego interfejsu API przez mechanizmy Service Worker.

Chrome 116

W Chrome 116 wprowadzono te ulepszenia dotyczące czasu eksploatacji skryptu service worker:

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

  • Dodatkowe interfejsy API rozszerzeń mogą po upływie 5-minutowego limitu czasu oczekiwania w przypadku instancji operujących na rozszerzenie. Te interfejsy API wyświetlają prośbę użytkownika, dlatego rozwiązanie problemu może potrwać dłużej niż 5 minut. Obejmuje to desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() i permissions.request().

Chrome 114

Wysyłanie wiadomości przy użyciu wiadomości długoterminowych podtrzymuje działanie skryptu service worker. Wcześniej otwarcie portu resetowało liczniki czasu, ale wysłanie wiadomości nie. Otwarcie portu nie powoduje już resetowania minutników.

Chrome 110

Wywołania interfejsu Extension API resetują liczniki czasu. Wcześniej tylko mechanizmy obsługi zdarzeń pozostawały aktywne. Zdarzenia umieszczone w kolejce, w przypadku których nie został wywołany moduł obsługi, nie spowodowały zresetowania.

Chrome 109

Wiadomości wysłane z dokumentu poza ekranem resetują minutniki.

Chrome 105

Połączenie z hostem natywnego przesyłania komunikatów przy użyciu chrome.runtime.connectNative() podtrzymuje działanie skryptu service worker. Jeśli proces hosta ulegnie awarii lub zostanie wyłączony, port jest zamknięty, a skrypt service worker zakończy działanie po zakończeniu odliczania. Aby się przed tym bronić, wywołaj funkcję chrome.runtime.connectNative() w module obsługi zdarzeń onRozłącz na porcie.