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 non scompattata 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 di un worker del servizio web.
chrome.runtime.onInstalled
Segue l'evento onInstalled
dell'estensione, che viene attivato al primo caricamento dell'estensione (non del service worker), 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.
Inattività e spegnimento
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 a un'API di estensione reimposta questo timer.
- Quando l'elaborazione di una singola richiesta, ad esempio un evento o una chiamata API, richiede più di 5 minuti.
- Quando una risposta
fetch()
richiede più di 30 secondi.
Gli eventi e le chiamate alle API di estensione reimpostano questi timer e, se il worker del servizio è inattivo, un evento in arrivo li riattiva. Tuttavia, devi progettare il tuo service worker in modo che sia resiliente all'interruzione imprevista.
Per ottimizzare il consumo di risorse dell'estensione, evita di mantenere attivo il tuo service worker a tempo indeterminato, se possibile. Prova le estensioni per assicurarti di non farlo involontariamente.
Mantieni i dati invariati anziché utilizzare variabili globali
Eventuali variabili globali impostate andranno perse se il servizio viene arrestato. Anziché utilizzare 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 worker di servizio delle estensioni.
- 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 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 specificamente per i worker del servizio 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
Dalla release di Manifest V3, abbiamo apportato diversi miglioramenti alla durata dei worker di servizio. 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 questo caso, ti consigliamo 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 service worker 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 dei worker di servizio delle estensioni. L'invio o la ricezione di messaggi tramite unWebSocket
in un worker di servizio dell'estensione reimposta il timer di inattività del worker di servizio.È 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 dell'host si arresta in modo anomalo o viene arrestato, la porta viene chiusa e il service worker viene terminato al termine dei timer. Per evitare questo problema, chiama chrome.runtime.connectNative()
nel gestore di eventi onDisconnect della porta.