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