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
W końcu uruchamia się zdarzenie activate dla usługi. 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.
Bezczynność 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; Odebranie zdarzenia lub wywołanie interfejsu API rozszerzenia zresetuje ten licznik czasu.
- Gdy przetworzenie pojedynczego żądania, np. zdarzenia lub wywołania interfejsu API, zajmuje więcej niż 5 minut.
- Gdy odpowiedź
fetch()
nadejdzie po ponad 30 sekundach,
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. Należy jednak zaprojektować skrypt service worker tak, aby był odporny na nieoczekiwane zakończenie.
Aby zoptymalizować zużycie zasobów przez rozszerzenie, staraj się nie utrzymywać bezterminowo usługi w tle. Sprawdź swoje rozszerzenia, aby upewnić się, że nie robisz tego przez przypadek.
przechowywanie danych zamiast używania zmiennych globalnych.
Wszystkie ustawione zmienne globalne zostaną utracone w przypadku wyłączenia skryptu service worker. Zamiast używać zmiennych globalnych, zapisz wartości w magazynie. Opcje znajdziesz poniżej. Pamiętaj, że interfejs Web Storage API nie jest dostępny dla pracowników usługi rozszerzenia.
- Interfejs API chrome.storage
- Interfejs API rozszerzeń oferujący różne typy miejsca na dane: lokalne, sesyjne, zarządzane (domena) i synchronizację. Ten interfejs API przechowuje obiekty JSON zidentyfikowane i pobrane przy użyciu kluczy zdefiniowanych przez programistę. 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 po stronie klienta uporządkowanych danych, w tym plików i blobów. Ten interfejs API udostępnia elementy do tworzenia transakcji, przechowywania i pobierania danych. Chociaż ten interfejs API często jest zbyt skomplikowany w przypadku prostych zastosowań, bazuje na nim wiele rozwiązań do przechowywania danych innych firm.
- 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. Z tego interfejsu API można korzystać 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 Poradniku kucharskim offline. Jeśli nie korzystasz z serwera proxy dla żądań sieciowych za pomocą modułu obsługi pobierania, używaj
chrome.storage
.
Wybierz minimalną wersję Chrome
Od momentu opublikowania platformy Manifest V3 wprowadziliśmy kilka ulepszeń w czasie trwania mechanizmów Service Worker. 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 artykule 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 rozszerzenia powoduje zresetowanie licznika czasu bezczynności workera.Dodatkowe interfejsy API rozszerzeń mogą przekraczać 5-minutowy okres oczekiwania dla instancji roboczych 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ż zresetowania liczników czasu.
Chrome 110
Wywołania interfejsu API rozszerzenia zresetują minutniki. Wcześniej tylko działające przetwarzacze zdarzeń mogły utrzymywać skrypt service workera. Zdarzenia, które zostały umieszczone w kolejce, ale dla których moduł obsługi nie został wywołany, nie spowodowały zresetowania.
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 utrzymać usługę w stanie aktywnym. Jeśli proces hosta ulegnie awarii lub zostanie wyłączony, port zostanie zamknięty, a skrypt service worker zakończy się po zakończeniu odliczania. Aby temu zapobiec, wywołaj funkcję chrome.runtime.connectNative()
w module obsługi zdarzenia onDisconnect.