Precarica le immagini adattabili

Puoi precaricare le immagini adattabili, che possono caricarle in modo molto più rapido aiutando il browser a identificare l'immagine corretta da un elemento srcset prima che esegua il rendering del tag img.

Panoramica delle immagini adattabili

Supporto dei browser

  • 73
  • 79
  • 78
  • 17,2

Supponiamo che tu stia navigando sul web su uno schermo largo 300 pixel e che la pagina richieda un'immagine di 1500 pixel. Quella pagina ha sprecato molti dati mobili perché lo schermo non può fare nulla con questa risoluzione extra. Idealmente, il browser recupererebbe una versione dell'immagine poco più larga delle dimensioni dello schermo, ad esempio 325 pixel. Ciò garantisce un'immagine ad alta risoluzione senza sprechi dati e un caricamento più rapido.

Le immagini adattabili consentono ai browser di recuperare risorse immagine diverse per dispositivi diversi. Se non utilizzi una CDN di immagine, salva più dimensioni per ogni immagine e specificale nell'attributo srcset. Il valore w indica al browser la larghezza di ogni versione, in modo che possa scegliere la versione appropriata per qualsiasi dispositivo:

<img src="small.jpg" srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 1500w" alt="…">

Panoramica precarica

Supporto dei browser

  • 50
  • ≤79
  • 85
  • 11.1

Origine

Il precaricamento consente di indicare al browser le risorse critiche che vuoi caricare il prima possibile, prima che vengano rilevate nel codice HTML. Ciò è particolarmente utile per le risorse che non sono subito rilevabili, ad esempio i caratteri inclusi nei fogli di stile, le immagini di sfondo o le risorse caricate da uno script.

<link rel="preload" as="image" href="important.png">

imagesrcset e imagesizes

L'elemento <link> utilizza gli attributi imagesrcset e imagesizes per precaricare le immagini adattabili. Usale insieme a <link rel="preload">, con le sintassi srcset e sizes utilizzate nell'elemento <img>.

Ad esempio, se vuoi precaricare un'immagine adattabile specificata con:

 <img src="wolf.jpg" srcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w" sizes="50vw" alt="A rad wolf">

Puoi farlo aggiungendo quanto segue al codice HTML <head>:

<link rel="preload" as="image" href="wolf.jpg" imagesrcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w" imagesizes="50vw">

Questa operazione avvia una richiesta utilizzando la stessa logica di selezione delle risorse utilizzata da srcset e sizes.

casi d'uso

Di seguito sono riportati alcuni casi d'uso per il precaricamento delle immagini adattabili.

Precarica le immagini adattabili inserite dinamicamente

Immagina di caricare dinamicamente immagini hero all'interno di una presentazione e sai quale immagine viene visualizzata per prima. In questo caso, probabilmente vorrai mostrare l'immagine il prima possibile senza attendere che lo script della presentazione la carichi.

Puoi esaminare questo problema su un sito web con una galleria immagini caricata dinamicamente:

  1. Apri questa demo della presentazione in una nuova scheda.
  2. Premi Control+Shift+J (o Command+Option+J su Mac) per aprire DevTools.
  3. Fai clic sulla scheda Rete.
  4. Nell'elenco a discesa Riduzione, seleziona 3G veloce.
  5. Disattiva la casella di controllo Disabilita cache.
  6. Ricarica la pagina.
Screenshot del riquadro Network (Rete) di Chrome DevTools.
Senza precaricamento, il caricamento delle immagini inizia una volta che il browser ha completato l'esecuzione dello script. Per la prima immagine, questo ritardo non è necessario.

L'utilizzo di preload qui consente di iniziare il caricamento dell'immagine in anticipo, in modo che possa essere visualizzata quando il browser deve mostrarla.

Screenshot del riquadro Rete di Chrome DevTools.
Il precaricamento della prima immagine consente di iniziare il caricamento contemporaneamente dello script.

Per capire la differenza dovuta al precaricamento, ispeziona la stessa galleria immagini caricata dinamicamente, ma con la prima immagine precaricata, seguendo i passaggi del primo esempio.

Precarica le immagini di sfondo utilizzando il set di immagini

Se disponi di immagini di sfondo diverse per densità di schermo diverse, puoi specificarle nel CSS con la sintassi image-set. Il browser può quindi scegliere quale visualizzare in base al RPD dello schermo.

background-image: image-set( "cat.png" 1x, "cat-2x.png" 2x);

Il problema con le immagini di sfondo CSS è che il browser le rileva solo dopo aver scaricato ed elaborato tutti i CSS nell'elemento <head> della pagina.

Puoi esaminare questo problema su un sito web di esempio con un'immagine di sfondo adattabile.

Screenshot del riquadro Rete di Chrome DevTools.
In questo esempio, il download dell'immagine inizia solo dopo che il CSS è stato scaricato completamente, causando inutili ritardi nella visualizzazione dell'immagine.

Il precaricamento delle immagini adattabili ti consente di caricare più rapidamente le immagini.

<link rel="preload" as="image" imagesrcset="cat.png 1x, cat-2x.png 2x">

Se tralascia l'attributo href, puoi assicurarti che i browser che non supportano imagesrcset nell'elemento <link>, ma supportano image-set in CSS, scarichino l'origine corretta. Tuttavia, in questo caso non beneficeranno del precaricamento.

Puoi controllare il comportamento dell'esempio precedente con un'immagine di sfondo adattabile precaricata nella demo di precaricamento dello sfondo adattabile.

Screenshot del riquadro Rete di Chrome DevTools.
Qui il download dell'immagine e del CSS inizia contemporaneamente, consentendo un caricamento più rapido dell'immagine.

Effetti pratici del precaricamento delle immagini adattabili

In teoria il precaricamento delle tue immagini adattabili può velocizzare le operazioni, ma in pratica?

Per rispondere al fatto che ho creato due copie di un negozio PWA dimostrativo: una che non precarica immagini e una che ne precarica alcune. Poiché il sito carica le immagini tramite JavaScript, è probabile che trarrà vantaggio dal precaricamento di quelle che compaiono nell'area visibile iniziale.

Ciò ha prodotto i seguenti risultati per nessun precaricamento e per precaricamento immagine:

  • Lo strumento Start Render è rimasto invariato.
  • Indice di velocità è leggermente migliorato (273 ms, poiché le immagini arrivano più velocemente non occupano una porzione enorme dell'area pixel).
  • Last Painted Hero è migliorato in modo significativo (1, 2 secondi).
Screenshot del confronto tra le sequenze di WebPageTest che mostra le immagini precaricate che vengono visualizzate più velocemente di circa 1,5 secondi.
Le immagini arrivano molto più velocemente quando sono precaricate, migliorando notevolmente l'esperienza utente.

Precarica e <picture>

Il gruppo di lavoro sulle prestazioni web sta discutendo dell'aggiunta di un equivalente di precaricamento per srcset e sizes, ma non per l'elemento <picture>, che gestisce il caso d'uso "art director".

Esistono ancora diversi problemi tecnici da risolvere per il precaricamento di <picture>, ma nel frattempo esistono soluzioni alternative:

<picture>
    <source srcset="small_cat.jpg" media="(max-width: 400px)">
    <source srcset="medium_cat.jpg" media="(max-width: 800px)">
    <img src="large_cat.jpg">
</picture>

La logica di selezione dell'origine dell'immagine dell'elemento <picture> supera in ordine gli attributi media degli elementi <source>, trova il primo che corrisponde e utilizza la risorsa associata.

Poiché il precaricamento adattabile non ha alcuna nozione di "ordine" o "prima corrispondenza", dovrai tradurre i punti di interruzione in un testo simile al seguente:

<link rel="preload" href="small_cat.jpg" as="image" media="(max-width: 400px)">
<link rel="preload" href="medium_cat.jpg" as="image" media="(min-width: 400.1px) and (max-width: 800px)">
<link rel="preload" href="large_cat.jpg" as="image" media="(min-width: 800.1px)">

Precarica e type

L'elemento <picture> supporta anche la corrispondenza nel primo type, così puoi fornire diversi formati delle immagini in modo che il browser possa scegliere il primo formato di immagine supportato. Questo caso d'uso non è supportato con il precaricamento.

Per i siti che utilizzano la corrispondenza dei tipi, consigliamo di evitare il precaricamento e di lasciare invece che lo scanner di precaricamento acquisisca le immagini dagli elementi <picture> e <source>. Si tratta comunque di una best practice, soprattutto quando si utilizzano i suggerimenti sulla priorità per stabilire la priorità dell'immagine appropriata.

Effetti su Largest Contentful Paint (LCP)

Poiché le immagini possono essere candidate per la metrica Largest Contentful Paint (LCP), il loro precaricamento può migliorare la metrica LCP del tuo sito web.

A prescindere dal fatto che l'immagine precaricata sia reattiva, i precaricamenti funzionano meglio quando la risorsa immagine non è rilevabile nel payload di markup iniziale. Inoltre, otterrai un miglioramento dell'LCP maggiore sui siti che mostrano il markup sul lato client rispetto a quelli che inviano il markup completo dal server.