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:
install(zdarzenie skryptu service worker)chrome.runtime.onInstalled(zdarzenie rozszerzenia)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
WebSocketpołączenia wydłużają teraz czas życia skryptu service worker rozszerzenia. Wysyłanie lub odbieranie wiadomości za pomocąWebSocketw 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()ipermissions.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.