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:
install
onInstall
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 unWebSocket
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()
epermissions.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.