Non combattere lo scanner di precaricamento del browser

Scopri cos'è lo scanner di precaricamento del browser, come migliora le prestazioni e come puoi evitare di essere ostacolato.

Un aspetto trascurato dell'ottimizzazione della velocità delle pagine riguarda le informazioni interne del browser. I browser effettuano determinate ottimizzazioni per migliorare le prestazioni in modi che noi sviluppatori non possiamo, ma solo a condizione che tali ottimizzazioni non vengano involontariamente ostacolate.

Un'ottimizzazione del browser interna da comprendere è lo scanner di precaricamento del browser. In questo post parleremo di come funziona lo scanner di precaricamento e, soprattutto, di come evitare che sia d'intralcio.

Che cos'è uno scanner di precaricamento?

Ogni browser dispone di un parser HTML primario che tokenizza il markup non elaborato e lo elabora in un modello a oggetti. Tutto questo funziona perfettamente fino a quando il parser non si mette in pausa quando trova una risorsa di blocco, come un foglio di stile caricato con un elemento <link> o uno script caricato con un elemento <script> senza un attributo async o defer.

Diagramma del parser HTML.
Fig. 1: un diagramma di come è possibile bloccare l'analizzatore sintattico HTML principale del browser. In questo caso, il parser trova un elemento <link> per un file CSS esterno, che impedisce al browser di analizzare il resto del documento (o persino il rendering dei dati) finché il codice CSS non viene scaricato e analizzato.

Nel caso dei file CSS, sia l'analisi sia il rendering sono bloccati per evitare un lampo di contenuti senza stile (FOUC), ovvero quando una versione di una pagina senza stile può essere visualizzata brevemente prima dell'applicazione degli stili.

La home page web.dev in uno stato senza stile (a sinistra) e con lo stato con stile (a destra).
Fig. 2: un esempio simulato di FOUC. A sinistra è visualizzata la pagina iniziale di web.dev senza stili. A destra è visualizzata la stessa pagina con gli stili applicati. Lo stato senza stile può verificarsi in un lampo se il browser non blocca il rendering durante il download ed l'elaborazione di un foglio di stile.

Il browser blocca anche l'analisi e il rendering della pagina quando rileva elementi <script> senza un attributo defer o async.

Il motivo è che il browser non è in grado di sapere con certezza se uno specifico script modificherà il DOM mentre l'analizzatore sintattico HTML principale continua a svolgere il proprio lavoro. È per questo che è prassi comune caricare codice JavaScript alla fine del documento, in modo che gli effetti del blocco dell'analisi e del rendering diventino marginali.

Esistono motivi validi per cui il browser dovrebbe bloccare sia l'analisi sia il rendering. Tuttavia, bloccare uno di questi passaggi importanti è indesiderabile, poiché possono bloccare il programma ritardando il rilevamento di altre risorse importanti. Fortunatamente, i browser fanno del loro meglio per mitigare questi problemi utilizzando un parser HTML secondario chiamato scanner di precaricamento.

Diagramma del parser HTML principale (a sinistra) e dello scanner di precaricamento (a destra), che è l&#39;analizzatore sintattico HTML secondario.
Fig. 3: un diagramma che mostra il funzionamento dello scanner di precaricamento in parallelo con l'analizzatore sintattico HTML principale per caricare gli asset in modo speculativo. In questo caso, il parser HTML principale è bloccato durante il caricamento e l'elaborazione del codice CSS prima di poter iniziare a elaborare il markup dell'immagine nell'elemento <body>, ma lo scanner di precaricamento può andare avanti nel markup non elaborato per trovare la risorsa immagine e iniziare a caricarla prima che il parser HTML principale venga sbloccato.

Il ruolo di uno scanner di precaricamento è speculativo, ovvero esamina il markup non elaborato per trovare risorse da recuperare in modo opportunistico prima che l'analizzatore sintattico HTML principale le rilevi.

Come capire quando lo scanner di precaricamento funziona

Lo scanner di precaricamento esiste a causa del blocco del rendering e dell'analisi. Se questi due problemi di prestazioni non sono mai esistiti, lo scanner di precaricamento non sarebbe molto utile. La chiave per capire se una pagina web trae vantaggio dallo scanner di precaricamento dipende da questi fenomeni di blocco. A questo scopo, puoi introdurre un ritardo artificiale per le richieste per scoprire dove funziona lo scanner di precaricamento.

Prendiamo come esempio questa pagina di testo e immagini di base con un foglio di stile. Poiché i file CSS bloccano sia il rendering sia l'analisi, introduci un ritardo artificiale di due secondi per il foglio di stile tramite un servizio proxy. Questo ritardo semplifica la visualizzazione nella struttura a cascata della rete in cui funziona lo scanner di precaricamento.

Il grafico a cascata della rete WebPageTest mostra un ritardo artificiale di 2 secondi imposto al foglio di stile.
Fig. 4: un grafico a cascata di rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile con una connessione 3G simulata. Anche se il foglio di stile viene ritardato artificialmente tramite un proxy di due secondi prima di iniziare a caricarsi, l'immagine posizionata più tardi nel payload del markup viene rilevata dallo scanner di precaricamento.

Come puoi vedere nella struttura a cascata, lo scanner di precaricamento rileva l'elemento <img> anche quando il rendering e l'analisi dei documenti sono bloccati. Senza questa ottimizzazione, il browser non può recuperare gli elementi in modo opportunistico durante il periodo di blocco e più richieste di risorse saranno consecutive anziché simultanee.

Con l'esempio di un giocattolo, diamo un'occhiata ad alcuni schemi reali in cui è possibile annullare lo scanner di precaricamento e che cosa si può fare per correggerli.

async script inseriti

Supponiamo che tu abbia codice HTML nel tuo <head> che include qualche codice JavaScript incorporato come questo:

<script>
  const scriptEl = document.createElement('script');
  scriptEl.src = '/yall.min.js';

  document.head.appendChild(scriptEl);
</script>

Per impostazione predefinita, gli script inseriti sono async, quindi, quando vengono inseriti, si comportano come se vi fosse stato applicato l'attributo async. Ciò significa che verrà eseguita il prima possibile e non bloccherà il rendering. Sembra ottimale, vero? Tuttavia, se presupponi che questo elemento <script> incorporato segua un elemento <link> che carica un file CSS esterno, otterrai un risultato non ottimale:

Questo grafico WebPageTest mostra la scansione di precaricamento quando viene inserito uno script.
Fig. 5: un grafico a cascata della rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile su una connessione 3G simulata. La pagina contiene un singolo foglio di stile e uno script async inserito. Lo scanner di precaricamento non riesce a rilevare lo script durante la fase di blocco della visualizzazione perché viene inserito nel client.

Vediamo nel dettaglio cosa è successo qui:

  1. A 0 secondi, viene richiesto il documento principale.
  2. Dopo 1,4 secondi, arriva il primo byte della richiesta di navigazione.
  3. A 2,0 secondi, vengono richiesti il CSS e l'immagine.
  4. Poiché il parser è bloccato durante il caricamento del foglio di stile e il codice JavaScript incorporato che inserisce lo script async avviene dopo quel foglio di stile dopo 2,6 secondi, la funzionalità fornita dallo script non sarà più disponibile.

Questo non è ottimale perché la richiesta dello script si verifica solo al termine del download del foglio di stile. In questo modo, l'esecuzione dello script viene ritardata nel più breve tempo possibile. Al contrario, poiché l'elemento <img> è rilevabile nel markup fornito dal server, viene rilevato dallo scanner di precaricamento.

Quindi, cosa succede se utilizzi un tag <script> normale con l'attributo async anziché inserire lo script nel DOM?

<script src="/yall.min.js" async></script>

Questo è il risultato:

Una struttura a cascata della rete WebPageTest che mostra come uno script asincrono caricato mediante l&#39;elemento di script HTML è ancora rilevabile dallo scanner di precaricamento del browser, anche se l&#39;analizzatore sintattico HTML principale del browser è bloccato durante il download e l&#39;elaborazione di un foglio di stile.
Fig. 6: un grafico a cascata della rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile su una connessione 3G simulata. La pagina contiene un singolo foglio di stile e un singolo elemento <script> async. Lo scanner di precaricamento rileva lo script durante la fase di blocco della visualizzazione e lo carica in contemporanea con il CSS.

Potresti avere la tentazione di suggerire che questi problemi possano essere risolti utilizzando rel=preload. Questa soluzione funzionerebbe certamente, ma potrebbe comportare alcuni effetti collaterali. Dopotutto, perché utilizzare rel=preload per risolvere un problema che può essere evitato non iniettando un elemento <script> nel DOM?

Una struttura a cascata WebPageTest che mostra come il suggerimento delle risorse rel=preload viene utilizzato per promuovere il rilevamento di uno script inserito in modo asincrono, anche se potrebbe avere effetti collaterali indesiderati.
Fig. 7: un grafico a cascata della rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile su una connessione 3G simulata. La pagina contiene un singolo foglio di stile e uno script async inserito, ma lo script async viene precaricato per garantire che venga rilevato prima.

Il precaricamento "corregge" il problema in questo punto, ma introduce un nuovo problema: lo script async nelle prime due demo, nonostante sia caricato in <head>, viene caricato con priorità "Bassa", mentre il foglio di stile viene caricato con la priorità "Massima". Nell'ultima demo in cui lo script async è precaricato, il foglio di stile è ancora caricato con la priorità"Massima", ma la priorità dello script è stata promossa a "Alta".

Quando la priorità di una risorsa viene aumentata, il browser le assegna una maggiore larghezza di banda. Ciò significa che, anche se il foglio di stile ha la massima priorità, la priorità aumentata dello script potrebbe causare un conflitto di larghezza di banda. Questo potrebbe essere un fattore determinante per le connessioni lente o nei casi in cui le risorse sono molto grandi.

La risposta è semplice: se è necessario uno script durante l'avvio, non annullare lo scanner di precaricamento inserendolo nel DOM. Sperimenta in base alle tue esigenze con il posizionamento dell'elemento <script>, nonché con attributi come defer e async.

Caricamento lento con JavaScript

Il caricamento lento è un ottimo metodo per conservare i dati, spesso applicato alle immagini. Tuttavia, a volte il caricamento lento viene applicato erroneamente alle immagini "above the fold".

Ciò introduce potenziali problemi di rilevabilità delle risorse che riguardano lo scanner di precaricamento e può ritardare inutilmente il tempo necessario per trovare un riferimento a un'immagine, scaricarla, decodificarla e presentarla. Prendiamo come esempio questo markup dell'immagine:

<img data-src="/sand-wasp.jpg" alt="Sand Wasp" width="384" height="255">

L'utilizzo di un prefisso data- è un modello comune nei caricatori lazy basati su JavaScript. Quando l'immagine fa scorrere l'immagine all'interno dell'area visibile, il caricatore lento rimuove il prefisso data-, il che significa che nell'esempio precedente, data-src diventa src. Questo aggiornamento richiede al browser di recuperare la risorsa.

Questo pattern non crea problemi finché non viene applicato alle immagini che si trovano nell'area visibile durante l'avvio. Poiché lo scanner di precaricamento non legge l'attributo data-src nello stesso modo in cui farebbe un attributo src (o srcset), il riferimento dell'immagine non viene rilevato in precedenza. Peggio ancora, il caricamento dell'immagine viene ritardato fino dopo che il codice JavaScript del caricatore lento scarica, compila ed esegue.

Un grafico a cascata della rete WebPageTest che mostra come un&#39;immagine caricata lentamente che si trova nell&#39;area visibile durante l&#39;avvio venga necessariamente ritardata perché lo scanner di precaricamento del browser non riesce a trovare la risorsa immagine e viene caricata solo quando viene caricato il codice JavaScript necessario per il caricamento lento. L&#39;immagine viene scoperta molto più tardi del previsto.
Fig. 8: un grafico a cascata della rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile su una connessione 3G simulata. La risorsa immagine è inutilmente caricata tramite caricamento lento, anche se è visibile nell'area visibile durante l'avvio. Questa operazione annulla lo scanner di precaricamento e provoca un ritardo inutile.

A seconda delle dimensioni dell'immagine (che potrebbero dipendere da quelle dell'area visibile), l'immagine potrebbe essere un elemento candidato per la metrica Largest Contentful Paint (LCP). Quando lo scanner di precaricamento non è in grado di recuperare in modo speculativo la risorsa immagine, probabilmente nel momento in cui i fogli di stile della pagina bloccano il rendering, l'LCP ne risente.

La soluzione consiste nel cambiare il markup dell'immagine:

<img src="/sand-wasp.jpg" alt="Sand Wasp" width="384" height="255">

Questo è il pattern ottimale per le immagini che si trovano nell'area visibile durante l'avvio, in quanto lo scanner di precaricamento troverà e recupererà la risorsa immagine più rapidamente.

Un grafico a cascata della rete WebPageTest che mostra uno scenario di caricamento per un&#39;immagine nell&#39;area visibile durante l&#39;avvio. L&#39;immagine non viene caricata lentamente, il che significa che non dipende dallo script per essere caricata, il che significa che lo scanner di precaricamento può individuarla prima.
Fig. 9: un grafico a cascata della rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile su una connessione 3G simulata. Lo scanner di precaricamento rileva la risorsa immagine prima che inizi il caricamento di CSS e JavaScript, dando così al browser un vantaggio in termini di caricamento.

Il risultato in questo esempio semplificato è un miglioramento di 100 millisecondi dell'LCP in caso di connessione lenta. Potrebbe non sembrare un miglioramento significativo, ma se si considera che la soluzione è una correzione rapida del markup e che la maggior parte delle pagine web è più complessa di questo insieme di esempi. Ciò significa che i candidati LCP potrebbero dover competere per la larghezza di banda con molte altre risorse, quindi ottimizzazioni come questa diventano sempre più importanti.

Immagini di sfondo CSS

Ricorda che lo scanner di precaricamento del browser esegue la scansione del markup. Non analizza altri tipi di risorse, come CSS, che potrebbero includere recuperi delle immagini a cui fa riferimento la proprietà background-image.

Come il linguaggio HTML, i browser elaborano i CSS in un proprio modello a oggetti, chiamato CSSOM. Se durante la creazione del CSSOM vengono rilevate risorse esterne, queste vengono richieste al momento del rilevamento e non dallo scanner di precaricamento.

Supponiamo che il candidato LCP della tua pagina sia un elemento con una proprietà background-image CSS. Ecco cosa succede quando le risorse vengono caricate:

Un grafico a cascata della rete WebPageTest che mostra una pagina con un candidato LCP caricato da CSS utilizzando la proprietà background-image. Poiché l&#39;immagine candidata LCP è in un tipo di risorsa che lo scanner di precaricamento del browser non può esaminare, il caricamento della risorsa viene ritardato fino a quando il CSS non viene scaricato ed elaborato, con un conseguente ritardo nel tempo di colorazione del candidato LCP.
Fig. 10: un grafico a cascata della rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile su una connessione 3G simulata. Il candidato LCP della pagina è un elemento con una proprietà background-image CSS (riga 3). Il recupero dell'immagine richiesta non inizia finché l'analizzatore sintattico CSS non la trova.

In questo caso, lo scanner di precaricamento non è tanto sconfitto quanto non è coinvolto. Anche se un candidato LCP nella pagina appartiene a una proprietà CSS background-image, ti consigliamo di precaricare l'immagine:

<!-- Make sure this is in the <head> below any
     stylesheets, so as not to block them from loading -->
<link rel="preload" as="image" href="lcp-image.jpg">

Il suggerimento rel=preload è piccolo, ma consente al browser di trovare l'immagine prima di quanto fa altrimenti:

Un grafico a cascata della rete WebPageTest mostra un&#39;immagine di sfondo CSS (che è la candidata LCP) che viene caricata molto prima a causa dell&#39;utilizzo di un suggerimento rel=preload. Il tempo LCP migliora di circa 250 millisecondi.
Fig. 11: un grafico a cascata della rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile su una connessione 3G simulata. Il candidato LCP della pagina è un elemento con una proprietà background-image CSS (riga 3). Il suggerimento rel=preload consente al browser di trovare l'immagine circa 250 millisecondi prima rispetto a quanto accaduto senza il suggerimento.

Con il suggerimento rel=preload, il candidato LCP viene rilevato prima, riducendo il tempo LCP. Anche se il suggerimento aiuta a risolvere il problema, la soluzione migliore potrebbe essere quella di valutare se l'immagine del candidato LCP deve essere caricato da CSS. Con un tag <img>, avrai un maggiore controllo sul caricamento di un'immagine adatta all'area visibile, consentendo allo scanner di precaricamento di individuarla.

Troppe risorse incorporate

L'incorporamento è un'attività che inserisce una risorsa all'interno del codice HTML. Puoi incorporare fogli di stile negli elementi <style>, script in elementi <script> e praticamente qualsiasi altra risorsa utilizzando la codifica base64.

Le risorse incorporate possono essere più rapide rispetto al download perché per la risorsa non viene inviata una richiesta separata. È esattamente nel documento e si carica all'istante. Tuttavia, esistono svantaggi significativi:

  • Se non stai memorizzando nella cache il tuo codice HTML (e non riesci a farlo se la risposta HTML è dinamica), le risorse in linea non vengono mai memorizzate nella cache. Questo influisce sulle prestazioni perché le risorse in linea non sono riutilizzabili.
  • Anche se puoi memorizzare nella cache l'HTML, le risorse in linea non vengono condivise tra i documenti. Questo riduce l'efficienza della memorizzazione nella cache rispetto ai file esterni che possono essere memorizzati nella cache e riutilizzati in un'intera origine.
  • Se l'allineamento è eccessivo, lo scanner di precaricamento viene ritardato in modo da rilevare le risorse nel documento in una fase successiva, poiché il download di quei contenuti aggiuntivi incorporati richiede più tempo.

Prendiamo come esempio questa pagina. In determinate condizioni, il candidato LCP è l'immagine nella parte superiore della pagina e il CSS si trova in un file separato caricato da un elemento <link>. La pagina utilizza anche quattro caratteri web richiesti come file separati dalla risorsa CSS.

Un grafico a cascata della rete WebPageTest di una pagina con un file CSS esterno in cui si fa riferimento a quattro caratteri. L&#39;immagine candidata LCP viene rilevata dallo scanner di precaricamento a tempo debito.
Fig. 12: un grafico a cascata della rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile su una connessione 3G simulata. Il candidato LCP della pagina è un'immagine caricata da un elemento <img>, ma viene rilevata dallo scanner di precaricamento perché il CSS e i caratteri necessari per il caricamento della pagina si caricano in risorse separate, senza ritardare lo svolgimento del lavoro dello scanner di precaricamento.

Cosa succede se il CSS e tutti i caratteri sono incorporati come risorse base64?

Un grafico a cascata della rete WebPageTest di una pagina con un file CSS esterno in cui si fa riferimento a quattro caratteri. Lo scanner di precaricamento subisce ritardi significativi nel rilevamento dell&#39;immagine LCP .
Fig. 13: un grafico a cascata della rete WebPageTest di una pagina web eseguito su Chrome su un dispositivo mobile su una connessione 3G simulata. Il candidato LCP della pagina è un'immagine caricata da un elemento <img>, ma l'incorporamento del CSS e delle sue quattro risorse carattere in "" ritarda lo scanner di precaricamento dal rilevamento dell'immagine fino al download completo delle risorse.

L'impatto dell'incorporamento ha conseguenze negative per l'LCP in questo esempio e per le prestazioni in generale. La versione della pagina che non include alcun elemento inserisce l'immagine LCP in circa 3,5 secondi. Nella pagina che incorpora tutto non viene visualizzata l'immagine LCP per poco più di 7 secondi.

Non c'è solo lo scanner di precaricamento. L'incorporamento di caratteri non è una strategia ottimale perché base64 è un formato inefficiente per le risorse binarie. Un altro fattore da considerare è che le risorse per i caratteri esterni non vengono scaricate a meno che non sia ritenuto necessario dal CSSOM. Quando questi caratteri sono incorporati in formato base64, vengono scaricati indipendentemente dal fatto che siano necessari o meno per la pagina corrente.

Un precaricamento potrebbe migliorare le cose? Certo. Potresti precaricare l'immagine LCP e ridurre il tempo LCP, ma l'aumento del codice HTML potenzialmente non memorizzabile nella cache con risorse incorporate ha altre conseguenze negative sulle prestazioni. Anche First Contentful Paint (FCP) è interessato da questo pattern. Nella versione della pagina in cui non è presente alcun elemento in linea, il valore FCP è di circa 2,7 secondi. Nella versione in cui tutto è allineato, il valore FCP è di circa 5,8 secondi.

Fai molta attenzione all'incorporamento di elementi in HTML, soprattutto risorse con codifica Base64. In generale questa operazione è sconsigliata, ad eccezione delle risorse molto piccole. In linea il meno possibile, perché troppo in linea è colpi di fuoco.

Rendering del markup con JavaScript lato client

Non c'è dubbio: JavaScript influisce decisamente sulla velocità della pagina. Non solo gli sviluppatori lo dipendono per fornire interattività, ma c'è anche la tendenza a farlo per fornire contenuti stessi. Questo porta a una migliore esperienza per gli sviluppatori in qualche modo, ma i vantaggi per gli sviluppatori non sempre si traducono in vantaggi per gli utenti.

Un pattern in grado di aggirare lo scanner di precaricamento è il rendering del markup con JavaScript lato client:

Una struttura a cascata della rete WebPageTest che mostra una pagina di base con immagini e testo visualizzati completamente sul client in JavaScript. Poiché il markup è contenuto in JavaScript, lo scanner di precaricamento non è in grado di rilevare nessuna risorsa. Tutte le risorse subiscono inoltre un ritardo aggiuntivo a causa del tempo di rete e di elaborazione aggiuntivo richiesto dai framework JavaScript.
Fig. 14: un grafico a cascata della rete WebPageTest di una pagina web visualizzata da client eseguito su Chrome su un dispositivo mobile tramite una connessione 3G simulata. Poiché i contenuti sono contenuti in JavaScript e si basano su un framework per il rendering, la risorsa immagine nel markup sottoposto a rendering dal client è nascosta allo scanner di precaricamento. L'esperienza equivalente sottoposta a rendering dal server è illustrata in Fig. 9.

Quando i payload di markup sono contenuti e visualizzati interamente da JavaScript nel browser, tutte le risorse nel markup sono di fatto invisibili allo scanner di precaricamento. Questo ritarda la scoperta di risorse importanti, il che influisce di sicuro sulla metrica LCP. In questi esempi, la richiesta dell'immagine LCP presenta un ritardo significativamente rispetto all'esperienza equivalente di rendering del server che non richiede la visualizzazione di JavaScript.

Questo approccio varia leggermente rispetto a questo articolo, ma gli effetti del markup del rendering sul client vanno ben oltre lo scanner di precaricamento. Ad esempio, l'introduzione di JavaScript per supportare un'esperienza che non richiede tempi di elaborazione superflui che possono influire sull'interazione con la colorazione successiva (INP).

Inoltre, il rendering di quantità estremamente elevate di markup sul client ha maggiori probabilità di generare attività lunghe rispetto alla stessa quantità di markup inviata dal server. Il motivo di questo, a parte l'ulteriore elaborazione implicata da JavaScript, è che i browser trasmettono il markup dal server e dividono il rendering in modo tale da evitare attività lunghe. Il markup sottoposto a rendering dal client, d'altra parte, è gestito come una singola attività monolitica, che potrebbe influire sulle metriche di reattività delle pagine, come il Tempo di blocco totale (TBT) o il First Input Delay (FID) oltre all'INP.

La soluzione a questo scenario dipende dalla risposta alla domanda: esiste un motivo per cui il markup della pagina non può essere fornito dal server e non viene eseguito il rendering sul client? Se la risposta è "no", il rendering lato server (SSR) o il markup generato in modo statico dovrebbero essere presi in considerazione, ove possibile, poiché aiuteranno lo scanner di precaricamento a rilevare e recuperare in anticipo risorse importanti in modo opportuno.

Se la tua pagina richiede JavaScript per collegare la funzionalità ad alcune parti del markup della pagina, puoi comunque farlo con SSR, utilizzando JavaScript vanilla o idratazione per ottenere il meglio da entrambi i mondi.

Aiuta lo scanner di precaricamento

Lo scanner di precaricamento è un'ottimizzazione estremamente efficace del browser che consente di caricare più velocemente le pagine durante l'avvio. Evitando schemi che impediscono la possibilità di trovare risorse importanti in anticipo, non solo semplifichi lo sviluppo per conto tuo, ma crei esperienze utente migliori che daranno risultati migliori in molte metriche, tra cui alcune metriche web.

Ricapitolando, ecco alcune cose da evincere da questo post:

  • Lo scanner di precaricamento del browser è un parser HTML secondario che esegue la scansione prima di quello principale se è bloccato per rilevare in modo opportuno le risorse che può recuperare prima.
  • Le risorse che non sono presenti nel markup fornito dal server nella richiesta di navigazione iniziale non possono essere rilevate dallo scanner di precaricamento. I modi in cui lo scanner di precaricamento può essere annullato possono includere, a titolo esemplificativo:
    • Iniettare risorse nel DOM con JavaScript, che si tratti di script, immagini, fogli di stile o qualsiasi altra cosa che possa essere migliorata nel payload del markup iniziale dal server.
    • Caricamento lento di immagini o iframe above the fold mediante una soluzione JavaScript.
    • Eseguire il rendering del markup sul client che potrebbe contenere riferimenti alle sottorisorse del documento utilizzando JavaScript.
  • Lo scanner di precaricamento analizza solo l'HTML. Non esamina i contenuti di altre risorse, in particolare CSS, che potrebbero includere riferimenti a risorse importanti, tra cui candidati LCP.

Se, per qualsiasi motivo, non puoi evitare un pattern che influisce negativamente sulla capacità dello scanner di precaricamento di accelerare le prestazioni di caricamento, considera il suggerimento della risorsa rel=preload. Se utilizzi rel=preload, esegui un test con gli strumenti di laboratorio per assicurarti che l'effetto ottenuto sia quello desiderato. Infine, non precaricare troppe risorse perché, quando dai priorità a tutto, non succederà nulla.

Risorse

Immagine hero di Unsplash, di Mohammad Rahmani .