Ciclo di vita del service worker dell'estensione

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

Installazione

L'installazione avviene quando l'utente installa o aggiorna un service worker dal Chrome Web Store o quando carica o aggiorna un'estensione non compressa utilizzando la pagina chrome://extensions. Si verificano tre eventi, in questo ordine:

  1. install
  2. onInstall
  3. activate

ServiceWorkerRegistration.install

Il primo evento attivato durante l'installazione è l'evento install di un service worker web.

chrome.runtime.onInstalled

Successivamente, viene attivato l'evento onInstalled dell'estensione, che si verifica quando l'estensione (non il service worker) viene installata per la prima volta, quando viene aggiornata a una nuova versione e quando Chrome viene aggiornato a una nuova versione. Utilizza questo evento per impostare uno stato o per l'inizializzazione una tantum, ad esempio un menu contestuale.

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 immediatamente dopo l'installazione di un'estensione perché non esiste nulla di paragonabile a un ricaricamento della pagina in un'estensione.

Avvio dell'estensione

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

Inattività e spegnimento

Normalmente, Chrome termina un service worker quando si verifica 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 essere elaborata.
  • 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 è inattivo, un evento in entrata lo riattiva. Tuttavia, devi progettare il service worker in modo che sia resiliente all'interruzione imprevista.

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

Persistere i dati anziché utilizzare variabili globali

Tutte le variabili globali impostate andranno perse se il service worker si arresta. Anziché utilizzare variabili globali, salva i valori nello spazio di archiviazione. Le opzioni disponibili sono elencate.

API chrome.storage
Un'API di estensione che offre più tipi di spazio di archiviazione: locale, di sessione, gestito (dominio) e di sincronizzazione. Questa API archivia gli oggetti JSON identificati e recuperati con chiavi definite dallo sviluppatore. Questo tipo di spazio di archiviazione non viene 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 alcuni casi d'uso, diverse soluzioni di archiviazione di terze parti sono basate su di essa.
API CacheStorage
Un meccanismo di archiviazione persistente per le coppie di oggetti Request e Response. Questa API è stata progettata specificamente per i service worker web e viene utilizzata per recuperare dati da un endpoint. Esistono vari modi per utilizzare questa API, a seconda di quanto sia importante che gli utenti visualizzino dati aggiornati. Per ulteriori informazioni, consulta The Offline Cookbook. A meno che tu non stia eseguendo il proxy delle richieste di rete utilizzando il gestore di recupero, devi utilizzare chrome.storage.

Scegliere una versione minima di Chrome

Dal rilascio di Manifest V3, abbiamo apportato diversi miglioramenti alla durata dei service worker. Ciò significa che se la tua estensione Manifest V3 supporta versioni precedenti di Chrome, devi tenere conto di alcune condizioni. Se queste condizioni non influiscono sulla tua estensione, puoi passare alla sezione successiva. In questo caso, valuta la possibilità di specificare una versione minima di Chrome nel manifest.

Chrome 120

Ora gli allarmi possono essere impostati su un periodo minimo di 30 secondi per corrispondere al ciclo di vita del service worker. Per ulteriori dettagli, consulta chrome.alarms.

Chrome 118

Le sessioni di debug attive create utilizzando l'API chrome.debugger ora mantengono attivo il service worker. In questo modo, i service worker non vanno in timeout durante le chiamate a questa API.

Chrome 116

Chrome 116 ha introdotto i seguenti miglioramenti del ciclo di vita dei service worker:

  • Le connessioni WebSocket attive ora estendono la durata dei service worker delle estensioni. L'invio o la ricezione di messaggi in un WebSocket in un service worker dell'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 un prompt all'utente e pertanto potrebbero richiedere più di cinque minuti per essere risolte. Tra questi sono inclusi desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() e permissions.request().

Chrome 114

L'invio di un messaggio con messaggistica a lunga durata mantiene attivo il service worker. L'apertura di una porta non ripristina più i timer.

Chrome 110

Le chiamate API dell'estensione reimpostano i timer. Prima di questa modifica, solo i gestori di eventi in esecuzione mantenevano attivo un service worker. Gli eventi in coda, ma per i quali non era stato chiamato un gestore, non causavano un ripristino.

Chrome 109

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

Chrome 105

La connessione a un host di messaggistica nativa utilizzando chrome.runtime.connectNative() mantiene attivo un service worker. Se il processo host si arresta in modo anomalo o viene chiuso, la porta viene chiusa e il service worker termina dopo il completamento dei timer. Proteggiti da questo problema chiamando chrome.runtime.connectNative() nel gestore di eventi onDisconnect della porta.