Cycle de vie des service workers des extensions

Les service workers d'extension répondent à la fois aux événements service worker standards et aux événements dans les espaces de noms des extensions. Ils sont présentés ensemble, car il arrive souvent que les types d'extensions en suivent un autre lors de leur utilisation.

Installation

L'installation a lieu lorsque l'utilisateur installe ou met à jour un service worker à partir du Chrome Web Store, ou lorsqu'il charge ou met à jour une extension non empaquetée via la page chrome://extensions. Trois événements se produisent dans l'ordre ci-dessous.

ServiceWorkerRegistration.install

Le premier événement déclenché lors de l'installation est l'événement install d'un service worker.

chrome.runtime.onInstalled

Vient ensuite l'événement onInstalled de l'extension, qui est déclenché lors de la première installation de l'extension (et non par le service worker) lors de la mise à jour de l'extension ou de Chrome vers une nouvelle version. Utilisez cet événement pour définir un état ou pour une initialisation unique, comme un menu contextuel.

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

Enfin, l'événement activate du service worker est déclenché. Notez que, contrairement aux workers des services Web, cet événement est déclenché immédiatement après l'installation d'une extension, car il n'y a rien de comparable à l'actualisation d'une page dans une extension.

Démarrage de l'extension

Lorsqu'un profil utilisateur démarre, l'événement chrome.runtime.onStartup se déclenche, mais aucun événement de service worker n'est appelé.

Inactif et arrêt

Normalement, Chrome met fin au service worker lorsque l'une des conditions suivantes est remplie:

  • Après 30 secondes d'inactivité Si vous recevez un événement ou appelez une API d'extension, ce minuteur est réinitialisé.
  • Le traitement d'une seule requête, comme un événement ou un appel d'API, prend plus de cinq minutes.
  • Lorsqu'une réponse fetch() prend plus de 30 secondes pour arriver.

Les événements et les appels aux API des extensions réinitialisent ces minuteurs. Si le service worker est devenu inactif, un événement entrant les réactivera. Vous devez toutefois concevoir votre service worker pour qu'il résiste aux arrêts inattendus.

Pour optimiser la consommation des ressources de votre extension, évitez autant que possible de maintenir votre service worker actif indéfiniment. Testez vos extensions pour vous assurer que vous n'effectuez pas cette action involontairement.

Conserver les données plutôt que d'utiliser des variables globales

Toutes les variables globales que vous définissez seront perdues si le service worker s'arrête. Au lieu d'utiliser des variables globales, enregistrez les valeurs dans l'espace de stockage. Vous trouverez ci-dessous les différentes options à votre disposition. Notez que l'API Web Storage n'est pas disponible pour les service workers d'extension.

API chrome.storage
API d'extension offrant plusieurs types de stockage : stockage local, stockage de session, stockage géré (domaine) et stockage synchronisé. Cette API stocke les objets JSON identifiés et récupérés à l'aide de clés définies par le développeur. Ce type de stockage n'est pas supprimé lorsqu'un utilisateur vide le cache Web.
API IndexedDB
API de bas niveau pour le stockage côté client de données structurées, y compris des fichiers et des blobs. Cette API fournit des primitives pour créer le stockage et la récupération des données transactionnelles. Bien que cette API soit souvent trop complexe pour des cas d'utilisation simples, de nombreuses solutions de stockage tierces s'appuient dessus.
API CacheStorage
Mécanisme de stockage persistant pour les paires d'objets de requête et de réponse. Cette API a été conçue spécifiquement pour les service workers (ou service workers) Web. Elle permet de récupérer des données à partir d'un point de terminaison. Vous pouvez utiliser cette API de différentes manières, selon qu'il est important que les utilisateurs accèdent à des données à jour et selon qu'il est essentiel pour eux de le faire. Pour en savoir plus, consultez l'article Les recettes hors connexion. Vous devez utiliser chrome.storage, sauf si vous transmettez spécifiquement des requêtes réseau via le gestionnaire de récupération.

Sélectionnez une version minimale de Chrome

Depuis la sortie de Manifest V3, nous avons apporté plusieurs améliorations à la durée de vie des service workers. Cela signifie que si votre extension Manifest V3 est compatible avec les versions antérieures de Chrome, vous devez connaître certaines conditions. Si ces conditions n'affectent pas votre extension, vous pouvez quitter cette section. Si c'est le cas, pensez à spécifier une version minimale de Chrome dans votre fichier manifeste.

Chrome 120

Les alarmes peuvent désormais être définies sur une période minimale de 30 secondes pour correspondre au cycle de vie du service worker. Pour en savoir plus, consultez chrome.alarms.

Chrome 118

Les sessions de débogage actives créées à l'aide de l'API chrome.debugger maintiennent désormais le service worker actif. Cela permet d'éviter que les service workers n'expirent pendant les appels de cette API.

Chrome 116

Chrome 116 a introduit les améliorations suivantes au niveau de la durée de vie du service worker:

  • Les connexions WebSocket actives prolongent désormais la durée de vie des service workers d'extension. L'envoi ou la réception de messages via un WebSocket dans un service worker d'extension réinitialise le délai d'inactivité du service worker.

  • Les API d'extension supplémentaires peuvent dépasser le délai avant expiration de cinq minutes pour les service workers d'extension. Ces API affichent une invite utilisateur et peuvent donc mettre plus de cinq minutes à se résoudre. C'est le cas pour desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() et permissions.request().

Chrome 114

L'envoi d'un message à l'aide d'une messagerie de longue durée maintient le service worker actif. Auparavant, l'ouverture d'un port réinitialisait les minuteurs, mais pas l'envoi d'un message. L'ouverture d'un port ne réinitialise plus les minuteurs.

Chrome 110

Les appels d'API de l'extension réinitialisent les minuteurs. Auparavant, seuls les gestionnaires d'événements en cours d'exécution maintenaient un service worker actif. Les événements mis en file d'attente, mais pour lesquels un gestionnaire n'a pas été appelé, n'entraînent pas de réinitialisation.

Chrome 109

Les messages envoyés à partir d'un document hors écran réinitialisent les minuteurs.

Chrome 105

La connexion à un hôte de messagerie natif à l'aide de chrome.runtime.connectNative() maintient un service worker actif. Si le processus hôte plante ou est arrêté, le port est fermé et le service worker s'arrête une fois le minuteur terminé. Pour éviter cela, appelez chrome.runtime.connectNative() dans le gestionnaire d'événements onDéconnecter du port.