Novità: NoState Prefetch

Katie Hempenius
Katie Hempenius

Introduzione

NoState Prefetch è un nuovo meccanismo di Chrome che rappresenta un'alternativa al processo di prerendering ritirato, utilizzato per supportare funzionalità come <link rel="prerender">. Come il prerendering, recupera le risorse in anticipo; a differenza del prerendering, non esegue JavaScript né mostra in anticipo alcuna parte della pagina. L'obiettivo di NoState Prefetch è utilizzare meno memoria rispetto al prerendering, riducendo al contempo i tempi di caricamento delle pagine.

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, vengono implementati utilizzando NoState Prefetch. Se usi Chrome 63 o versioni successive, il browser utilizza già NoState Prefetch per funzionalità come <link rel="prerender">.

Questo articolo spiega come funziona NoStatePrefetch, le motivazioni per introdurlo e le istruzioni per utilizzare gli istogrammi di Chrome per visualizzare le statistiche sul suo utilizzo.

Motivazione

Esistono due motivi principali per l'introduzione del precaricamento NoState:

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 NoState Prefetch e questo costo rimane relativamente costante nei diversi casi d'uso. L'aumento delle dimensioni o del volume dei recuperi non ha un effetto significativo sulla quantità di memoria utilizzata da NoState Prefetch.

Al contrario, il prerendering consuma in genere 100 MiB di memoria, mentre il consumo di memoria è limitato a 150 MiB. Questo consumo elevato di memoria lo rende non adatto per dispositivi di fascia bassa (ovvero <= 512 MB di RAM). Di conseguenza, Chrome non esegue il prerendering su dispositivi di fascia bassa e si precollega.

Facilitare il supporto delle nuove funzionalità della piattaforma web

Con il prerendering, non devono verificarsi azioni stateful (ad es. sessioni mutanti o spazio di archiviazione locale) rivolte agli utenti (ad es. la riproduzione di musica o video). Tuttavia, può essere difficile e complesso impedire queste azioni durante il rendering di una pagina. NoState Prefetch recupera solo le risorse in anticipo: non esegue il codice né visualizza la pagina. In questo modo è più facile impedire le azioni rivolte agli utenti e alle azioni stateful.

Implementazione

I passaggi seguenti spiegano come funziona NoState Prefetch.

  1. Viene attivato NoStatePrefetch.

    Un suggerimento relativo alle risorse di prerendering (ad esempio <link rel="prerender">) e alcune funzionalità di Chrome attiveranno il precaricamento NoState, a condizione che vengano soddisfatte le due condizioni seguenti: a) l'utente non utilizza un dispositivo di fascia bassa e b) l'utente non utilizza una rete mobile.

  2. Viene creato un nuovo renderer dedicato per il precaricamento NoState.

    In Chrome, un "renderer" è un processo responsabile dell'acquisizione di un documento HTML, dell'analisi, della creazione di un albero di rendering e della visualizzazione del risultato sullo schermo. Ogni scheda in Chrome, così come ogni processo NoState Prefetch, ha il proprio renderer per fornire l'isolamento. Ciò consente di ridurre al minimo gli effetti di un problema (ad esempio l'arresto anomalo di una scheda) e di impedire a codice dannoso di accedere ad altre schede o ad altre parti del sistema.

  3. La risorsa caricata con il precaricamento NoState viene recuperata. HTMLPreloadScanner esegue quindi la scansione di questa risorsa per individuare eventuali sottorisorse che devono essere recuperate. Se la risorsa principale o una delle relative sottorisorse ha un service worker registrato, queste richieste passeranno attraverso il service worker appropriato.

    NoState Prefetch supporta solo il metodo GET HTTP e non recupera risorse secondarie che richiedono l'utilizzo di altri metodi HTTP. Inoltre, non recupererà risorse che richiedono azioni dell'utente (ad es. popup di autenticazione, certificati client SSL o override manuali).

  4. Le sottorisorse recuperate verranno recuperate con priorità netta "INattiva".

    La priorità netta "INattiva" è la priorità netta più bassa possibile in Chrome.

  5. Tutte le risorse recuperate da NoState Prefetch vengono memorizzate nella cache in base alle relative intestazioni.

    NoState Prefetch memorizza nella cache tutte le risorse tranne quelle con l'intestazione Cache-Control no-store. Una risorsa viene riconvalida prima dell'uso se è presente un'intestazione della risposta Vary, no-cache Cache-Control o se la risorsa ha più di 5 minuti.

  6. Il renderer viene terminato dopo il caricamento di tutte le risorse secondarie.

    Se si verifica il timeout delle sottorisorse, il renderer verrà interrotto dopo 30 secondi.

  7. Il browser non apporta modifiche allo stato oltre ad aggiornare l'archivio dei cookie e la cache DNS locale. È importante richiamare questo elemento perché si tratta di "NoState" in "NoState Prefetch".

    A questo punto, nel processo "normale" di caricamento della pagina, il browser probabilmente eseguirà azioni che modificherebbero lo stato del browser, ad esempio eseguire JavaScript, modificare sessionStorage o localStorage, riprodurre musica o video, utilizzare l'API History o chiedere conferma all'utente. Le uniche modifiche di stato che si verificano nel precaricamento NoState sono l'aggiornamento della cache DNS all'arrivo delle risposte e l'aggiornamento dell'archivio di cookie se una risposta contiene l'intestazione Set-Cookie.

  8. Quando la risorsa è necessaria, viene caricata nella finestra del browser.

    Tuttavia, a differenza di una pagina sottoposta a prerendering, questa non sarà immediatamente visibile. Deve comunque essere sottoposta a rendering dal browser. Il browser non riutilizzerà il renderer utilizzato per il precaricamento NoState, bensì un nuovo renderer. Il mancato rendering della pagina in anticipo riduce il consumo di memoria di NoStatePrefetch, ma riduce anche il possibile impatto che può avere sui tempi di caricamento della pagina.

    Se la pagina ha un service worker, il caricamento della pagina riprenderà attraverso il service worker.

    Se NoState Prefetch non ha terminato il recupero delle sottorisorse quando la pagina è necessaria, il browser continuerà con il processo di caricamento della pagina dal punto in cui NoState Prefetch è stato interrotto. Il browser dovrà comunque recuperare le risorse, ma non quante ne sarebbero necessarie se non fosse stato avviato NoState Prefetch.

Impatto sull'analisi dei dati web

Le pagine caricate utilizzando NoState Prefetch vengono registrate dagli strumenti di analisi dei dati web in momenti leggermente diversi a seconda che lo strumento raccolga i dati sul 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 il precaricamento NoState 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ò trascorrere un intervallo di tempo significativo tra il momento in cui viene gestita una richiesta e il momento in cui la risposta viene effettivamente utilizzata dal client (se utilizzata). A partire da Chrome 69, NoState Prefetch aggiunge l'intestazione Purpose: Prefetch a tutte le richieste per renderle distinguibili dalla normale navigazione.

Dai un'occhiata

NoStatePrefetch è stato spedito a dicembre 2017 in Chrome 63. Al momento è utilizzata per:

  • Implementa il suggerimento per la risorsa prerender
  • Recupera il primo risultato nei risultati della Ricerca Google
  • Recuperare le pagine che secondo le previsioni della barra degli indirizzi di Chrome verranno visitate

Puoi utilizzare i file interni di Chrome per vedere come utilizzi NoStatePrefetch.

Per visualizzare l'elenco di siti caricati con il precaricamento NoState, vai a chrome://net-internals/#prerender.

Per visualizzare le statistiche sull'utilizzo di NoState Prefetch, visita la pagina chrome://histograms e cerca "NoStatePrefetch". Esistono tre diversi istogrammi di NoState Prefetch, uno per ogni caso d'uso di NoState Prefetch:

  • "NoStatePrefetch" (statistiche per l'utilizzo da parte di suggerimenti delle risorse di prerendering)
  • "gws_NoStatePrefetch" (statistiche per l'utilizzo da parte della pagina dei risultati di ricerca di Google)
  • "omnibox_NoStatePrefetch" (statistiche relative all'utilizzo dalla barra degli indirizzi di Chrome)