Rozszerzenia service workera reagują zarówno na standardowe zdarzenia service workera, jak i na zdarzenia w przestrzeniach nazw rozszerzeń. Są one prezentowane razem, ponieważ podczas korzystania z rozszerzenia jeden typ często następuje po drugim.
Instalacja
Instalacja następuje, gdy użytkownik zainstaluje lub zaktualizuje usługę w ramach workera w Chrome Web Store albo wczyta lub zaktualizuje rozpakowane rozszerzenie na stronie chrome://extensions
. Występują 3 zdarzenia w podanej kolejności.
ServiceWorkerRegistration.install
Pierwszym zdarzeniem wywołanym podczas instalacji jest zdarzenie install workera usługi internetowej.
chrome.runtime.onInstalled
Następnie jest zdarzenie onInstalled
rozszerzenia, które jest wywoływane, gdy rozszerzenie (a nie usługa w tle) jest po raz pierwszy instalowane, gdy jest aktualizowane do nowej wersji i gdy Chrome jest aktualizowane do nowej wersji. Użyj tego
wydarzenia, aby ustawić stan lub przeprowadzić jednorazową inicjalizację, 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 uruchamiane jest zdarzenie activate dla usługi workera. Pamiętaj, że w odróżnieniu od usług internetowych to zdarzenie jest wywoływane natychmiast po zainstalowaniu rozszerzenia, ponieważ w rozszerzeniu nie ma nic porównywalnego z odświeżaniem strony.
Uruchamianie rozszerzenia
Gdy uruchamia się profil użytkownika, wywoływane jest zdarzenie chrome.runtime.onStartup
, ale nie wywołuje to żadnych zdarzeń service workera.
Tryb bezczynności i wyłączanie
Zwykle Chrome kończy działanie usługi roboczej, gdy spełniony jest jeden z tych warunków:
- po 30 sekundach braku aktywności. Odbieranie zdarzenia lub wywoływanie interfejsu API rozszerzenia powoduje zresetowanie tego minutnika.
- Gdy przetworzenie pojedynczego żądania, np. zdarzenia lub wywołania interfejsu API, zajmuje więcej niż 5 minut.
- Gdy odpowiedź
fetch()
zajmuje więcej niż 30 sekund.
Zdarzenia i wywołania interfejsów API rozszerzeń resetują te liczniki, a jeśli pracownik usługi przejdzie w stan uśpienia, przywróci je zdarzenie przychodzące. Mimo to skrypt service worker powinien być odporny na nieoczekiwane zakończenie działania.
Aby zoptymalizować zużycie zasobów przez rozszerzenie, staraj się nie utrzymywać nieskończonego procesu service workera. Sprawdź swoje rozszerzenia, aby upewnić się, że nie robisz tego przez przypadek.
przechowywanie danych zamiast używania zmiennych globalnych.
Wszystkie zapisane przez Ciebie zmienne globalne zostaną utracone, jeśli usługa zostanie zamknięta. Zamiast używać zmiennych globalnych, zapisz wartości w magazynie. Opcje znajdziesz poniżej. Pamiętaj, że interfejs Web Storage API jest niedostępny dla pracowników usługi rozszerzenia.
- Interfejs API chrome.storage
- Interfejs API rozszerzeń, który oferuje różne typy pamięci: lokalną, sesji, zarządzanej (domeny) i synchronizowanej. Ten interfejs API przechowuje obiekty JSON identyfikowane i pobierane za pomocą kluczy zdefiniowanych przez dewelopera. Ten typ pamięci nie zostanie usunięty, gdy użytkownik wyczyści pamięć podręczną przeglądarki.
- IndexedDB API
- Niski poziom interfejsu API do przechowywania uporządkowanych danych po stronie klienta, w tym plików i blobów. Ten interfejs API udostępnia elementy do tworzenia i odzyskiwania danych transakcyjnych. Chociaż ten interfejs API jest często zbyt skomplikowany do prostych zastosowań, na jego podstawie powstało wiele rozwiązań do przechowywania danych firm zewnętrznych.
- CacheStorage API
- Mechanizm trwałego przechowywania par obiektów żądania i odpowiedzi. Ten interfejs API został zaprojektowany specjalnie dla usług internetowych i służy do pobierania danych z punktu końcowego. Interfejs API można wykorzystywać na różne sposoby w zależności od tego, czy i jakie znaczenie ma dla użytkowników wyświetlanie aktualnych danych. Więcej informacji znajdziesz w książce kucharskiej Offline Cookbook. Jeśli nie używasz pośrednictwa serwera proxy do obsługi żądań sieciowych za pomocą funkcji obsługi pobierania, użyj
chrome.storage
.
Wybierz minimalną wersję Chrome
Od czasu wydania pliku manifestu w wersji 3 wprowadziliśmy kilka ulepszeń dotyczących czasu działania usług. Oznacza to, że jeśli Twoje rozszerzenie zgodne z platformą Manifest V3 obsługuje starsze wersje Chrome, musisz wziąć pod uwagę pewne warunki. Jeśli te warunki nie mają wpływu na Twoje rozszerzenie, możesz pominąć tę sekcję. Jeśli tak, rozważ określenie minimalnej wersji Chrome w pliku manifestu.
Chrome 120
Alarmy mogą teraz mieć ustawiony minimalny okres 30 sekund, aby pasowały do cyklu życia usługi. Więcej informacji znajdziesz w sekcji chrome.alarms
.
Chrome 118
Aktywne sesje debugera utworzone za pomocą interfejsu API chrome.debugger
utrzymują teraz pracownika usługi w stanie aktywnym. Zapobiega to wygaśnięciu skryptów service workera podczas wywołań interfejsu API.
Chrome 116
W Chrome 116 wprowadzono następujące ulepszenia dotyczące czasu trwania usługi:
Aktywne połączenia
WebSocket
wydłużają czas działania elementów usługi rozszerzenia. Wysyłanie lub odbieranie wiadomości w ramachWebSocket
w workerze usługi rozszerzenia powoduje zresetowanie licznika czasu bezczynności workera usługi.Dodatkowe interfejsy API rozszerzeń mogą przekroczyć 5-minutowy limit czasu dla pracowników usługi rozszerzenia. Te interfejsy API wyświetlają prompt dla użytkownika, więc ich rozwiązanie może zająć więcej niż 5 minut. Należą do nich
desktopCapture.chooseDesktopMedia()
,identity.launchWebAuthFlow()
,management.uninstall()
ipermissions.request()
.
Chrome 114
Wysyłanie wiadomości za pomocą długotrwałego przesyłania wiadomości pozwala utrzymać w stanie aktywnym service workera. Wcześniej otwieranie portu powoduje zresetowanie liczników, ale wysyłanie wiadomości nie powoduje tego. Otwarcie portu nie powoduje już resetowania minutników.
Chrome 110
Wywołania interfejsu API rozszerzenia resetują minutniki. Wcześniej tylko działające przetwarzacze zdarzeń mogły utrzymywać skrypt service workera. Żadne zdarzenia, które zostały umieszczone w kole, ale nie zostały jeszcze przetworzone, nie spowodują resetowania.
Chrome 109
Wiadomości wysyłane z poza ekranu powodują zresetowanie liczników.
Chrome 105
Połączenie z natywnym hostem wiadomości za pomocą chrome.runtime.connectNative()
pozwoli zachować pracownika usługi. Jeśli proces hosta ulegnie awarii lub zostanie zamknięty, port zostanie zamknięty, a po zakończeniu działania timerów usługa zostanie zakończona. Aby temu zapobiec, wywołaj funkcję chrome.runtime.connectNative()
w module obsługi zdarzenia onDisconnect.