Data di pubblicazione: 20 luglio 2018
Introduzione
Il precaricamento senza stato è un nuovo meccanismo di Chrome alternativo al processo di prerendering ritirato, utilizzato per alimentare funzionalità come <link rel="prerender">. Come il prerendering, recupera le risorse in anticipo, ma a differenza del prerendering
non esegue JavaScript né esegue il rendering di alcuna parte della pagina in anticipo. L'obiettivo del precaricamento
NoState è utilizzare meno memoria rispetto al prerendering, riducendo comunque i tempi di caricamento della pagina.
NoState Prefetch non è un'API, ma un meccanismo utilizzato da Chrome per implementare varie API
e funzionalità. L'API Resource Hints, nonché il
precaricamento delle pagine da parte della barra degli indirizzi di Chrome, sono entrambi
implementati utilizzando il precaricamento NoState. Se utilizzi Chrome 63 o versioni successive, il browser utilizza già
NoState Prefetch per funzionalità come <link rel="prerender">.
Questo articolo spiega come funziona NoStatePrefetch, i motivi della sua introduzione e le istruzioni per utilizzare gli istogrammi di Chrome per visualizzare le statistiche sul suo utilizzo.
Motivazione
L'introduzione del precaricamento senza stato è stata motivata da due ragioni principali:
Ridurre l'utilizzo della memoria
Il precaricamento NoState utilizza solo circa 45 MiB di memoria. La manutenzione dello scanner di precaricamento è la spesa di memoria principale per il precaricamento NoState e questo costo rimane relativamente costante nei diversi casi d'uso. L'aumento delle dimensioni o del volume dei recuperi non influisce in modo significativo sulla quantità di memoria utilizzata da NoState Prefetch.
Al contrario, il prerendering in genere consuma 100 MiB di memoria e il consumo di memoria è limitato a 150 MiB. Questo elevato consumo di memoria lo rende inadatto ai dispositivi di fascia bassa (ovvero con <= 512 MB di RAM). Di conseguenza, Chrome non esegue il prerendering sui dispositivi di fascia bassa e invece si connette in anticipo.
Facilitare il supporto delle nuove funzionalità della piattaforma web
Con il prerendering, non devono verificarsi azioni visibili all'utente (ad es. riproduzione di musica o video) o stateful (ad es. modifica della sessione o della memoria locale). Tuttavia, può essere difficile e complesso impedire che queste azioni si verifichino durante il rendering di una pagina. Il precaricamento NoState recupera solo le risorse in anticipo: non esegue il codice né esegue il rendering della pagina. In questo modo è più semplice impedire l'esecuzione di azioni stateful e rivolte agli utenti.
Implementazione
I passaggi seguenti spiegano come funziona il precaricamento senza stato.
Viene attivato NoStatePrefetch.
Un suggerimento per le risorse di prerendering (ad es.
<link rel="prerender">) e alcune funzionalità di Chrome attiveranno il precaricamento NoState a condizione che siano soddisfatte le seguenti due condizioni: a) l'utente non utilizza un dispositivo di fascia bassa e b) l'utente non utilizza una rete mobile.Viene creato un nuovo renderer dedicato per il precaricamento senza stato.
In Chrome, un "renderer" è un processo responsabile dell'acquisizione di un documento HTML, dell'analisi, della costruzione dell'albero di rendering e della visualizzazione del risultato sullo schermo. Ogni scheda di Chrome, così come ogni processo di precaricamento NoState, ha un proprio renderer per garantire l'isolamento. In questo modo si riducono al minimo gli effetti di eventuali problemi (ad es. l'arresto anomalo di una scheda) e si impedisce al codice dannoso di accedere ad altre schede o ad altre parti del sistema.
Viene recuperata la risorsa caricata con NoState Prefetch. HTMLPreloadScanner esegue la scansione di questa risorsa per scoprire eventuali risorse secondarie che devono essere recuperate. Se la risorsa principale o una delle relative risorse secondarie ha un service worker registrato, queste richieste passeranno attraverso il service worker appropriato.
Il recupero preliminare NoState supporta solo il metodo HTTP GET e non recupera le risorse secondarie che richiedono l'utilizzo di altri metodi HTTP. Inoltre, non recupererà risorse che richiedono azioni dell'utente (ad es. popup di autenticazione, certificato client SSL o override manuali).
Le risorse secondarie recuperate verranno recuperate con una priorità di rete "IDLE".
La priorità di rete "IDLE" è la più bassa possibile in Chrome.
Tutte le risorse recuperate dal precaricamento NoState vengono memorizzate nella cache in base alle intestazioni della cache.
Il precaricamento NoState memorizza nella cache tutte le risorse, ad eccezione di quelle con l'intestazione
no-storeCache-Control. Una risorsa verrà nuovamente convalidata prima dell'uso se è presente un'intestazione di rispostaVary, un'intestazione Cache-Control o se la risorsa ha più di 5 minuti.no-cacheIl renderer viene terminato dopo il caricamento di tutte le risorse secondarie.
Se le risorse secondarie scadono, il renderer verrà interrotto dopo 30 secondi.
Il browser non apporta modifiche allo stato, ad eccezione dell'aggiornamento dell'archivio cookie e della cache DNS locale. È importante sottolinearlo perché si tratta di "NoState" in "NoState Prefetch".
A questo punto della procedura di caricamento della pagina "normale", il browser probabilmente esegue operazioni che modificano lo stato del browser: ad esempio, esegue JavaScript, modifica
sessionStorageolocalStorage, riproduce musica o video, utilizza l'API History o chiede all'utente. Le uniche modifiche dello stato che si verificano nel precaricamento senza stato sono l'aggiornamento della cache DNS all'arrivo delle risposte e l'aggiornamento dell'archivio dei cookie se una risposta contiene l'intestazioneSet-Cookie.Quando la risorsa è necessaria, viene caricata nella finestra del browser.
Tuttavia, a differenza di una pagina pre-renderizzata, la pagina non sarà immediatamente visibile, ma dovrà comunque essere renderizzata dal browser. Il browser non riutilizzerà il renderer utilizzato per il recupero preliminare NoState e utilizzerà invece un nuovo renderer. Il mancato rendering della pagina in anticipo riduce il consumo di memoria di NoStatePrefetch, ma diminuisce anche il possibile impatto che può avere sui tempi di caricamento delle pagine.
Se la pagina ha un service worker, il caricamento della pagina verrà eseguito di nuovo tramite il service worker.
Se NoState Prefetch non ha terminato il recupero delle risorse secondarie quando la pagina è necessaria, il browser continuerà il processo di caricamento della pagina da dove si era interrotto NoState Prefetch. Il browser dovrà comunque recuperare le risorse, ma non tante quante sarebbero necessarie se NoState Prefetch non fosse stato avviato.
Impatto sull'analisi dei dati web
Le pagine caricate utilizzando NoState Prefetch vengono registrate dagli strumenti di analisi web in momenti leggermente diversi a seconda che lo strumento raccolga i dati lato client o lato server.
Gli script di analisi lato client registrano una visualizzazione di pagina quando la pagina viene mostrata all'utente. Questi script si basano sull'esecuzione di JavaScript e NoState Prefetch non esegue JavaScript.
Gli strumenti di analisi lato server registrano le metriche quando viene gestita una richiesta. Per le risorse caricate tramite
NoState Prefetch, può esserci un intervallo di tempo significativo tra il momento in cui una richiesta viene gestita e il momento in cui
la risposta viene effettivamente utilizzata dal client (se viene utilizzata). A partire da Chrome 69, NoState Prefetch
aggiunge l'intestazione Purpose: Prefetch a tutte le richieste per renderle distinguibili dalla
navigazione normale.
Dai un'occhiata
NoStatePrefetch è stato rilasciato a dicembre 2017 in Chrome 63. Attualmente viene utilizzato per:
- Implementa il suggerimento per la risorsa
prerender - Recuperare il primo risultato nei risultati della Ricerca Google
- Recupera le pagine che la barra degli indirizzi di Chrome prevede che verranno visitate successivamente
Puoi utilizzare Chrome Internals per vedere come hai utilizzato NoStatePrefetch.
Per visualizzare l'elenco dei siti caricati con NoState Prefetch, vai a chrome://net-internals/#prerender.
Per visualizzare le statistiche sull'utilizzo di NoState Prefetch, vai a chrome://histograms e cerca "NoStatePrefetch". Esistono tre diversi istogrammi di NoState Prefetch, uno per ogni caso d'uso di NoState Prefetch:
- "NoStatePrefetch" (statistiche sull'utilizzo dei suggerimenti relativi alle risorse di prerendering)
- "gws_NoStatePrefetch" (statistiche sull'utilizzo da parte della pagina dei risultati di ricerca di Google)
- "omnibox_NoStatePrefetch" (statistiche sull'utilizzo della barra degli indirizzi di Chrome)