Zdarzenia w instancjach service worker

Workery rozszerzeń obsługują zarówno zdarzenia standardowego workera usługi, jak i wiele zdarzeń w interfejsach API rozszerzeń. Z tej sekcji dowiesz się, co jest dostępne, i uzyskasz wskazówki dotyczące korzystania z tych funkcji.

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:

Nie zalecane
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

Workery w ramach usługi rozszerzenia obsługują zdarzenia w konkretnych 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
Zdarzenia związane z interakcją użytkownika z powiadomieniami systemowymi generowanymi przez rozszerzenie.
chrome.permissions
Wskazuje, kiedy użytkownik przyznaje lub odwołuje uprawnienia rozszerzenia.
chrome.runtime
Zawiera zdarzenia związane z cyklem życia rozszerzenia, wiadomości wysyłane z innych części rozszerzenia oraz powiadomienia o dostępnym rozszerzeniu lub aktualizacji Chrome.
chrome.storage.onChanged
Wywoływany, gdy obiekt StorageArea zostanie wyczyszczony lub gdy zmieni się wartość klucza lub zostanie ona ustawiona. Pamiętaj, że każde wystąpienie StorageArea ma własne zdarzenie onChanged.
chrome.webNavigation
Zawiera informacje o stanie żą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

Pracownicy obsługi rozszerzeń obsługują więcej zdarzeń cyklu życia niż te opisane w innych miejscach.

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 skryptu Service Worker). W tych ostatnich przypadkach musisz dodać adresy URL stron, które chcesz pobrać, do klucza "host_permissions" w elementach manifest.json.

ServiceWorkerGlobal.message

Przekazywanie wiadomości przez usługę workera jest dostępne oprócz przekazywania wiadomości przez rozszerzenie, ale te dwa systemy nie są ze sobą kompatybilne. 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. Oba typy elementów obsługi wiadomości, czyli ServiceWorkerGlobal.messagechrome.runtime.onMessage, są obsługiwane przez elementy usługi rozszerzenia.

Należy preferować wiadomości w rozszerzeniu, chyba że masz konkretny powód, aby używać wiadomości w usługach workera.