Ereignisse in Service Workern

Erweiterungs-Dienstworker unterstützen sowohl Standard-Dienstworker-Ereignisse als auch viele Ereignisse in den Erweiterungs-APIs. In diesem Abschnitt werden die verfügbaren Optionen beschrieben und es werden Tipps zur Verwendung gegeben.

Erweiterungsereignisse deklarieren

Ereignishandler in Service Workern müssen im globalen Gültigkeitsbereich deklariert werden. Das bedeutet, dass sie sich auf der obersten Ebene des Scripts befinden und nicht in Funktionen verschachtelt sein dürfen. So werden sie bei der ersten Scriptausführung synchron registriert, sodass Chrome Ereignisse direkt nach dem Start an den Service Worker senden kann. Beispiel:

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

Bessere
chrome.action.onClicked.addListener(handleActionClick);

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

Häufige Ereignisse

Erweiterungs-Service-Worker unterstützen Ereignisse in bestimmten APIs. Im Folgenden werden einige gängige Beispiele beschrieben. Für einige dieser APIs sind Berechtigungen erforderlich. Andere APIs haben möglicherweise Ereignisse, Methoden oder Properties, die nicht in allen Chrome-Versionen verfügbar sind. Weitere Informationen finden Sie in der verlinkten API-Dokumentation, insbesondere zu den Ereignissen, Methoden oder Eigenschaften, die Sie verwenden möchten.

chrome.action
Wird ausgelöst, wenn ein Nutzer mit dem Symbol in der Symbolleiste Ihrer Erweiterung interagiert, unabhängig davon, ob die Aktion für eine bestimmte Seite (einen bestimmten Tab) oder für die gesamte Erweiterung gilt.
chrome.management
Ereignisse im Zusammenhang mit der Installation, Deinstallation, Aktivierung und Deaktivierung von Erweiterungen.
chrome.notifications
Ereignisse im Zusammenhang mit der Interaktion des Nutzers mit Systembenachrichtigungen, die von der Erweiterung generiert wurden.
chrome.permissions
Gibt an, wann Erweiterungsberechtigungen vom Nutzer gewährt oder widerrufen wurden.
chrome.runtime
Bietet Ereignisse im Zusammenhang mit dem Lebenszyklus der Erweiterung, Nachrichten, die von anderen Teilen der Erweiterung gesendet werden, und Benachrichtigungen zu verfügbaren Erweiterungen oder Chrome-Updates.
chrome.storage.onChanged
Wird ausgelöst, wenn ein StorageArea-Objekt gelöscht oder der Wert eines Schlüssels geändert oder festgelegt wird. Beachten Sie, dass jede StorageArea-Instanz ein eigenes onChanged-Ereignis hat.
chrome.webNavigation
Stellt Informationen zum Status von Navigationsanfragen während der Fahrt bereit.

Filter

Wenn Sie Ereignisse auf einen bestimmten Anwendungsfall beschränken oder unnötige Ereignisaufrufe vermeiden möchten, verwenden Sie APIs, die Ereignisfilter unterstützen. Angenommen, eine Erweiterung überwacht das Ereignis tabs.onUpdated, um zu erkennen, wenn ein Nutzer eine bestimmte Website aufruft. Dieses Ereignis wird bei jeder Navigation auf jedem Tab aufgerufen. Verwenden Sie stattdessen webNavigation.onCompleted mit einem Filter. Beispiel:

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

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

Web-Dienst-Worker-Ereignisse

Erweiterungs-Dienstworker unterstützen mehr als die anderswo beschriebenen Lebenszyklusereignisse.

ServiceWorkerGlobal.fetch

Wird ausgelöst, wenn etwas aus dem Erweiterungspaket abgerufen wird oder fetch() und XMLHttpRequest() aus einem Erweiterungs- oder Pop-up-Script aufgerufen werden. (Anrufe von Inhaltsscripts werden vom fetch-Handler des Dienst-Workers nicht abgefangen.) In diesen Fällen müssen Sie die URLs der Seiten, die Sie abrufen möchten, dem Schlüssel "host_permissions" in manifest.json hinzufügen.

ServiceWorkerGlobal.message

Die Service Worker-Nachrichtenweitergabe ist zusätzlich zur Nachrichtenweitergabe der Erweiterung verfügbar. Die beiden Systeme sind jedoch nicht kompatibel. Das bedeutet, dass Nachrichten, die mit sendMessage() gesendet werden (das über mehrere Erweiterungs-APIs verfügbar ist), nicht von Service Worker-Nachrichten-Handlern abgefangen werden. Ebenso werden Nachrichten, die mit postMessage() gesendet werden, nicht von Erweiterungsnachrichten-Handlern abgefangen. Beide Arten von Nachrichten-Handlern, also sowohl ServiceWorkerGlobal.message als auch chrome.runtime.onMessage, werden in Erweiterungs-Dienst-Workern unterstützt.

Sie sollten Erweiterungsnachrichten bevorzugen, es sei denn, Sie haben einen bestimmten Grund, Dienstmitarbeiternachrichten zu verwenden.