Zdarzenia w instancjach service worker

Workery rozszerzeń obsługują zarówno zdarzenia standardowego workera usługi, jak i wiele zdarzeń w interfejsach API rozszerzeń. W tej sekcji opisano dostępne funkcje i wskazówki, jak z nich korzystać.

Deklarowanie zdarzeń rozszerzenia

Obsługi zdarzeń w usługach workera muszą być zadeklarowane w zakresie globalnym, co oznacza, że powinny znajdować się na najwyższym poziomie skryptu i nie mogą być zagnieżdżone wewnątrz funkcji. Dzięki temu są one rejestrowane synchronicznie podczas początkowego wykonywania skryptu, co umożliwia Chrome wysyłanie zdarzeń do workera usługi zaraz po jego uruchomieniu. Na przykład:

Niezalecane
chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
  chrome.action.setBadgeText({ text: badgeText });
  chrome.action.onClicked.addListener(handleActionClick);
});
Lepsze
chrome.action.onClicked.addListener(handleActionClick);

chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
  chrome.action.setBadgeText({ text: badgeText });
});

Typowe zdarzenia

Skrypty service worker obsługują zdarzenia w określonych interfejsach API. Poniżej opisujemy kilka najczęstszych. Pamiętaj, że niektóre z tych interfejsów API wymagają uprawnień, a inne mogą zawierać zdarzenia, metody lub właściwości, które nie są dostępne we wszystkich wersjach Chrome. Szczegółowe informacje znajdziesz w połączonej dokumentacji interfejsu API, zwłaszcza w części dotyczącej zdarzeń, metod i właściwości, których chcesz używać.

chrome.action
Wywoływany w odpowiedzi na interakcję użytkownika z ikoną na pasku narzędzi rozszerzenia, niezależnie od tego, czy działanie dotyczy konkretnej strony (karty) czy całego rozszerzenia.
chrome.management
Zdarzenia związane z instalacją, odinstalowaniem, włączeniem i wyłączeniem rozszerzeń.
chrome.notifications
Udostępnia generowane przez rozszerzenie zdarzenia związane z interakcją użytkownika z powiadomieniami systemowymi.
chrome.permissions
Wskazuje, kiedy użytkownik przyznaje lub odwołuje uprawnienia rozszerzenia.
chrome.runtime
Dostarcza zdarzenia związane z cyklem życia rozszerzenia, wiadomościami wysłanymi z innych części rozszerzenia oraz powiadomienie o dostępnym rozszerzeniu lub aktualizacji Chrome.
chrome.storage.onChanged
Uruchamiane za każdym razem, gdy dowolny obiekt StorageArea zostanie wyczyszczony albo gdy wartość klucza zostanie zmieniona lub ustawiona. Pamiętaj, że każde wystąpienie StorageArea ma własne zdarzenie onChanged.
chrome.webNavigation
Pokazuje stan żądań nawigacji w locie.

Filtry

Aby ograniczyć zdarzenia do konkretnego przypadku użycia lub wyeliminować niepotrzebne wywołania zdarzeń, użyj interfejsów API, które obsługują filtry zdarzeń. Rozważ na przykład rozszerzenie, które nasłuchuje zdarzenia tabs.onUpdated, aby wykrywać, kiedy użytkownik przechodzi do określonej witryny. To zdarzenie będzie wywoływane przy każdej nawigacji na każdej karcie. Zamiast tego użyj funkcji webNavigation.onCompleted z filtrem. Na przykład:

const filter = {
  url: [
    {
      urlMatches: 'https://www.google.com/',
    },
  ],
};

chrome.webNavigation.onCompleted.addListener(() => {
  console.info("The user has loaded my favorite website!");
}, filter);

Zdarzenia skryptu service worker

Instancje robocze usługi rozszerzeń obsługują więcej zdarzeń niż zdarzenia cyklu życia opisane w innym miejscu.

ServiceWorkerGlobal.fetch

Wywoływane, gdy coś jest pobierane z pakietu rozszerzenia lub gdy funkcje fetch()XMLHttpRequest() są wywoływane z poziomu skryptu rozszerzenia lub skryptu wyskakującego okienka. (Wywołania ze skryptów treści nie są przechwytywane przez moduł obsługi fetch mechanizmu Service Worker). W tych ostatnich przypadkach musisz dodać adresy URL stron, które chcesz pobrać, do klucza "host_permissions" w manifest.json.

ServiceWorkerGlobal.message

Przekazywanie komunikatów skryptu service worker jest dostępne jako uzupełnienie przekazywania komunikatów przez rozszerzenie, ale oba systemy nie współpracują ze sobą. Oznacza to, że wiadomości wysyłane za pomocą sendMessage() (dostępnego w kilku interfejsach API rozszerzeń) nie są przechwytywane przez obsługujące je menedżery wiadomości w usługach działających w tle. Podobnie wiadomości wysyłane za pomocą postMessage() nie są przechwytywane przez moduły obsługi wiadomości rozszerzenia. Oba typy elementów obsługujących wiadomości (czyli ServiceWorkerGlobal.messagechrome.runtime.onMessage) są obsługiwane w elementach usługi rozszerzenia.

Zalecamy korzystanie z wiadomości rozszerzenia, chyba że masz konkretny powód, aby używać takich wiadomości.