Ciclo di vita del service worker dell'estensione

I worker di servizio delle estensioni rispondono sia agli eventi standard dei worker di servizio sia agli eventi negli spazi dei nomi delle estensioni. Sono 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 scompattata utilizzando la pagina chrome://extensions. Si verificano tre eventi nell'ordine seguente.

ServiceWorkerRegistration.install

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

chrome.runtime.onInstalled

Poi c'è l'evento onInstalled dell'estensione, che viene attivato quando l'estensione (non il service worker) viene installata per la prima volta, quando l'estensione viene aggiornata a una nuova versione e quando Chrome viene aggiornato a una nuova versione. Utilizza questo evento per impostare uno stato o per un'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 worker del servizio web, questo evento viene attivato immediatamente dopo l'installazione di un'estensione perché non esiste nulla di paragonabile a un ricaricamento di pagina in un'estensione.

Avvio dell'estensione

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

Inattivo e arrestato

In genere, Chrome termina un worker di servizio 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 elaborare.
  • Quando impiega più di 30 secondi per ricevere una risposta fetch().

Gli eventi e le chiamate alle API di estensione reimpostano questi timer e, se il service worker è inattivo, verrà ripristinato tramite un evento in arrivo. Tuttavia, dovresti progettare il tuo service worker in modo che sia resiliente contro terminazioni impreviste.

Per ottimizzare il consumo di risorse dell'estensione, evita di mantenere attivo il tuo service worker a tempo indeterminato, se possibile. Testa le estensioni per assicurarti di non farlo inavvertitamente.

Mantieni i dati invariati anziché utilizzare variabili globali

Eventuali variabili globali impostate andranno perse se il servizio viene arrestato. Anziché utilizzare le variabili globali, salva i valori nello spazio di archiviazione. Le opzioni a tua disposizione sono elencate di seguito. Tieni presente che l'API Web Storage non è disponibile per i service worker di estensione.

API chrome.storage
Un'API di estensione che offre più tipi di archiviazione: locale, di sessione, gestita (dominio) e sincronizzata. Questa API memorizza gli oggetti JSON identificati e recuperati con chiavi definite dallo sviluppatore. Questo tipo di spazio di archiviazione non viene rimosso quando un utente cancella 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 le primitive per la creazione di archiviazione e recupero dei dati transazionali. Sebbene questa API sia spesso troppo complicata per casi d'uso semplici, su di essa sono state create diverse soluzioni di archiviazione di terze parti.
API CacheStorage
Un meccanismo di archiviazione persistente per le coppie di oggetti Request e Response. Questa API è stata progettata appositamente per i lavoratori dei servizi web e viene utilizzata per recuperare i dati da un endpoint. Esistono diversi modi per utilizzare questa API a seconda che sia o meno fondamentale per gli utenti visualizzare dati aggiornati. Per ulteriori informazioni, consulta The Offline Cookbook. A meno che tu non utilizzi un proxy specifico per le richieste di rete tramite 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 riguardano la tua estensione, puoi passare alla sezione successiva. In caso affermativo, valuta la possibilità di specificare una versione minima di Chrome nel file manifest.

Chrome 120

Ora è possibile impostare le sveglie su un periodo minimo di 30 secondi in modo che corrispondano al ciclo di vita del servizio worker. Per ulteriori dettagli, consulta chrome.alarms.

Chrome 118

Le sessioni di debugger attive create utilizzando l'API chrome.debugger ora mantengono attivo il service worker. In questo modo, i worker dei servizi non scadono per timeout durante le chiamate per questa API.

Chrome 116

Chrome 116 ha introdotto i seguenti miglioramenti alla durata dei worker di servizio:

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

  • È consentito che altre API di estensioni superino il periodo di timeout di cinque minuti per i worker di servizio delle estensioni. Queste API mostrano una richiesta all'utente e, di conseguenza, la risoluzione potrebbe richiedere più di cinque minuti. Sono inclusi desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() e permissions.request().

Chrome 114

L'invio di un messaggio utilizzando la messaggistica a lungo termine mantiene attivo il service worker. In precedenza, l'apertura di una porta reimpostava i timer, ma l'invio di un messaggio no. L'apertura di una porta non reimposta più i timer.

Chrome 110

Le chiamate all'API di estensione reimpostano i timer. In precedenza, solo i gestori degli eventi in esecuzione mantenevano attivo un servizio worker. Eventuali eventi in coda per i quali non è stato chiamato un gestore non causeranno un ripristino.

Chrome 109

I messaggi inviati da un documento non sullo schermo reimpostano i timer.

Chrome 105

La connessione a un host di messaggistica nativa utilizzando chrome.runtime.connectNative() manterrà attivo un servizio 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. Per evitare questo problema, chiama chrome.runtime.connectNative() nel gestore di eventi onDisconnect della porta.