Ciclo di vita del service worker dell'estensione

I service worker di estensione rispondono sia agli eventi standard dei service worker sia agli eventi negli spazi dei nomi delle estensioni. Vengono presentate insieme perché spesso un tipo ne segue un altro durante l'utilizzo di un'estensione.

Installazione

L'installazione si verifica quando l'utente installa o aggiorna un service worker dal Chrome Web Store oppure quando carica o aggiorna un'estensione non pacchettizzata utilizzando la pagina chrome://extensions. Si verificano tre eventi nell'ordine indicato di seguito.

ServiceWorkerRegistration.install

Il primo evento attivato durante l'installazione è l'evento install del worker di servizio web.

chrome.runtime.onInstalled

Poi c'è l'evento onInstalled dell'estensione, che viene attivato alla prima installazione dell'estensione (non del service worker), quando l'estensione viene aggiornata a una nuova versione e Chrome viene aggiornato a una nuova versione. Utilizza questo evento per impostare uno stato o per l'inizializzazione una tantum, ad esempio un menu di contesto.

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

Infine, viene attivato l'evento activate del service worker. Tieni presente che, a differenza dei service worker web, questo evento viene attivato subito dopo l'installazione di un'estensione perché in un'estensione non esiste nulla del genere di ricaricamento di una pagina.

Avvio estensione

Quando viene avviato un profilo utente, viene attivato l'evento chrome.runtime.onStartup, ma non vengono richiamati eventi del service worker.

Inattività e arresto

Solitamente, Chrome termina un service worker quando è soddisfatta una delle seguenti condizioni:

  • Dopo 30 secondi di inattività. La ricezione di un evento o la chiamata di un'API di estensione reimposta questo timer.
  • Quando una singola richiesta, ad esempio un evento o una chiamata API, richiede più di 5 minuti per l'elaborazione.
  • Quando una risposta fetch() impiega più di 30 secondi per arrivare.

Gli eventi e le chiamate alle API delle estensioni reimpostano questi timer e, se il service worker è diventato inattivo, un evento in entrata li ripristinerà. Tuttavia, devi progettare il tuo service worker in modo che sia resiliente contro la risoluzione imprevista.

Per ottimizzare il consumo di risorse della tua estensione, se possibile evita di mantenere attivo il service worker a tempo indeterminato. Testa le tue estensioni per assicurarti di non farlo involontariamente.

Mantieni i dati anziché utilizzare variabili globali

Eventuali variabili globali impostate andranno perse all'arresto del service worker. Anziché utilizzare le variabili globali, salva i valori nello spazio di archiviazione. Le opzioni disponibili sono elencate di seguito. Tieni presente che l'API Web Storage non è disponibile per i service worker delle estensioni.

API chrome.storage
Un'API di estensione che offre diversi tipi di archiviazione: locale, di sessione, gestito (dominio) e sincronizzazione. Questa API archivia gli oggetti JSON identificati e recuperati con chiavi definite dallo sviluppatore. Questo tipo di spazio di archiviazione non verrà rimosso quando un utente svuota la cache web.
API IndexedDB
Un'API di basso livello per l'archiviazione lato client di dati strutturati, inclusi file e blob. Questa API fornisce primitive per la creazione di archiviazione e recupero di dati transazionali. Sebbene questa API sia spesso troppo complicata per i casi d'uso semplici, si basano su diverse soluzioni di archiviazione di terze parti.
API CacheStorage
Un meccanismo di archiviazione permanente per le coppie di oggetti Richiesta e Risposta. Questa API è stata progettata appositamente per i worker di servizi web e viene utilizzata per recuperare i dati da un endpoint. Esistono diversi modi per utilizzare questa API, a seconda che gli utenti vedano dati aggiornati se e quanto è fondamentale. Per ulteriori informazioni, consulta il libro di ricette offline. A meno che tu non stia eseguendo specificamente il proxy delle richieste di rete tramite il gestore del recupero, devi usare chrome.storage.

Scegli una versione minima di Chrome

Dopo il rilascio di Manifest V3, abbiamo apportato diversi miglioramenti alle durate dei service worker. Ciò significa che se l'estensione Manifest V3 supporta le versioni precedenti di Chrome, esistono delle condizioni di cui devi essere a conoscenza. Se queste condizioni non influiscono sulla tua estensione, puoi andare avanti da questa sezione. Se sì, valuta la possibilità di specificare una versione minima di Chrome nel file manifest.

Chrome 120

Ora è possibile impostare gli allarmi su un periodo minimo di 30 secondi in modo che corrisponda al ciclo di vita del service worker. Per maggiori dettagli, visita la pagina chrome.alarms.

Chrome 118

Le sessioni attive del debugger create utilizzando l'API chrome.debugger ora mantengono attivo il service worker. In questo modo si impedisce il timeout dei Service worker durante le chiamate per questa API.

Chrome 116

Chrome 116 ha introdotto i seguenti miglioramenti relativi al lifetime dell'utente dei servizi:

  • Le connessioni WebSocket attive ora estendono la durata dei service worker dell'estensione. L'invio o la ricezione di messaggi su un WebSocket in un service worker di un'estensione reimposta il timer di inattività del service worker.

  • Le API di estensione aggiuntive possono superare il periodo di timeout di cinque minuti per i Service worker delle estensioni. Queste API mostrano una richiesta dell'utente e la risoluzione potrebbe richiedere ragionevolmente più di cinque minuti. Questi includono desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() e permissions.request().

Chrome versione 114

L'invio di un messaggio utilizzando messaggi di lunga durata mantiene attivo il service worker. In precedenza, l'apertura di una porta reimpostava i timer, ma non l'invio di un messaggio. L'apertura di una porta non reimposta più i timer.

Chrome 110

Le chiamate API dell'estensione reimpostano i timer. In precedenza, solo l'esecuzione di gestori di eventi avrebbe mantenuto attivo un service worker. Tutti gli eventi che sono stati messi in coda, ma per i quali non è stato chiamato un gestore, non causeranno un ripristino.

Guida introduttiva di Chrome

I messaggi inviati da un documento fuori schermo reimpostano i timer.

Guida introduttiva di Chrome

La connessione a un host di messaggistica nativo tramite chrome.runtime.connectNative() mantiene attivo un service worker. Se il processo host si arresta in modo anomalo o viene arrestato, la porta viene chiusa e il service worker verrà arrestato al termine dei timer. Proteggerti da questo problema chiamando chrome.runtime.connectNative() nel gestore di eventi onDisconnetti della porta.