Procesy robocze rozszerzeń reagują zarówno na standardowe zdarzenia procesów roboczych, jak i na zdarzenia w przestrzeniach nazw rozszerzeń. Są one prezentowane razem, ponieważ często jeden typ następuje po drugim podczas korzystania z rozszerzenia.
Instalacja
Instalacja następuje, gdy użytkownik zainstaluje lub zaktualizuje service worker ze sklepu Chrome Web Store albo gdy wczyta lub zaktualizuje rozpakowane rozszerzenie na stronie chrome://extensions
. Następują 3 zdarzenia w tej kolejności:
install
onInstall
activate
ServiceWorkerRegistration.install
Pierwszym zdarzeniem wywoływanym podczas instalacji jest zdarzenie install w przypadku service workera.
chrome.runtime.onInstalled
Następne jest zdarzenie onInstalled
rozszerzenia, które jest wywoływane, gdy rozszerzenie (nie proces roboczy usługi) jest instalowane po raz pierwszy, gdy rozszerzenie jest aktualizowane do nowej wersji i 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 activate w service workerze. Pamiętaj, że w przeciwieństwie do skryptów service worker w internecie to zdarzenie jest wywoływane natychmiast po zainstalowaniu rozszerzenia, ponieważ w rozszerzeniu nie ma odpowiednika ponownego załadowania strony.
Uruchamianie rozszerzenia
Gdy profil użytkownika się uruchamia, wywoływane jest zdarzenie chrome.runtime.onStartup
, ale nie są wywoływane żadne zdarzenia service workera.
Bezczynność i wyłączanie
Zwykle Chrome kończy działanie service workera, gdy spełniony jest jeden z tych warunków:
- Po 30 sekundach braku aktywnoś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 proces roboczy usługi przejdzie w stan uśpienia, przychodzące zdarzenie go wybudzi. Niemniej jednak skrypt service worker powinien być odporny na nieoczekiwane zakończenie działania.
Aby zoptymalizować zużycie zasobów przez rozszerzenie, unikaj nieograniczonego działania skryptu service worker, jeśli to możliwe. Przetestuj rozszerzenia, aby upewnić się, że nie robisz tego nieumyślnie.
Zapisywanie danych zamiast używania zmiennych globalnych
Wszystkie ustawione zmienne globalne zostaną utracone, jeśli usługa Service Worker zostanie zamknięta. Zamiast używać zmiennych globalnych, zapisuj wartości w pamięci. Wyświetlą się dostępne opcje.
- Interfejs 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 programistę. Ten typ pamięci nie jest usuwany, gdy użytkownik czyści pamięć podręczną przeglądarki.
- IndexedDB API
- Interfejs API niskiego poziomu do przechowywania po stronie klienta danych strukturalnych, w tym plików i obiektów binarnych. Ten interfejs API udostępnia elementy 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 firm zewnętrznych.
- CacheStorage API
- Mechanizm trwałego przechowywania par obiektów żądań i odpowiedzi. Ten interfejs API został zaprojektowany specjalnie dla skryptów service worker 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 w jakim stopniu użytkownicy muszą widzieć aktualne dane. Więcej informacji znajdziesz w książce kucharskiej dotyczącej trybu offline. Jeśli nie przekierowujesz żądań sieciowych za pomocą modułu obsługi pobierania, używaj
chrome.storage
.
Wybieranie minimalnej wersji Chrome
Od czasu wprowadzenia Manifestu V3 wprowadziliśmy kilka ulepszeń dotyczących czasu życia service workerów. Oznacza to, że jeśli rozszerzenie Manifest V3 obsługuje starsze wersje Chrome, musisz pamiętać o pewnych warunkach. Jeśli te warunki nie mają wpływu na Twoje rozszerzenie, możesz pominąć tę sekcję. Jeśli tak jest, rozważ podanie w pliku manifestu minimalnej wersji Chrome.
Chrome 120
Alarmy można teraz ustawiać na minimalny okres 30 sekund, aby dopasować je do cyklu życia procesu usługi. Więcej informacji znajdziesz w sekcji chrome.alarms
.
Chrome 118
Aktywne sesje debugera utworzone za pomocą interfejsu chrome.debugger
API utrzymują teraz działanie service workera. Zapobiega to wygaśnięciu limitu czasu w przypadku procesów roboczych usługi podczas wywoływania tego interfejsu API.
Chrome 116
W Chrome 116 wprowadziliśmy te ulepszenia dotyczące czasu życia service workerów:
Aktywne połączenia
WebSocket
wydłużają teraz czas działania komponentu service worker rozszerzenia. Wysyłanie i odbieranie wiadomości wWebSocket
w procesie roboczym usługi rozszerzenia resetuje licznik czasu bezczynności tego procesu.Dodatkowe interfejsy API rozszerzeń mogą przekraczać 5-minutowy limit czasu dla procesów roboczych usługi rozszerzenia. Te interfejsy API wyświetlają prośbę do użytkownika, więc rozwiązanie problemu może zająć więcej niż 5 minut. Są to m.in.
desktopCapture.chooseDesktopMedia()
,identity.launchWebAuthFlow()
,management.uninstall()
ipermissions.request()
.
Chrome 114
Wysłanie wiadomości za pomocą długotrwałego przesyłania komunikatów utrzymuje aktywność service workera. Otwieranie portu nie powoduje już resetowania liczników czasu.
Chrome 110
Wywołania interfejsu API rozszerzenia resetują minutniki. Wcześniej tylko uruchomione procedury obsługi zdarzeń utrzymywały skrypt service worker przy życiu. Wszystkie zdarzenia, które zostały umieszczone w kolejce, ale dla których nie wywołano modułu obsługi, nie powodowałyby resetowania.
Chrome 109
Wiadomości wysyłane z dokumentu poza ekranem resetują liczniki czasu.
Chrome 105
Połączenie z natywnym hostem przesyłania wiadomości za pomocą chrome.runtime.connectNative()
utrzyma działanie service workera. Jeśli proces hosta ulegnie awarii lub zostanie zamknięty, port zostanie zamknięty, a usługa Service Worker zakończy działanie po upływie czasu odliczania. Aby temu zapobiec, wywołaj funkcję chrome.runtime.connectNative()
w module obsługi zdarzeń onDisconnect portu.