Articolo originale: https://www.freecodecamp.org/news/how-to-lazy-load-images-in-react/

Ottimizzare le risorse che utilizzi sui tuoi siti web – come il caricamento lazy delle immagini – è uno dei modi più efficaci per migliorare le prestazioni web.

Facendo ciò ti assicuri che i tuoi siti siano veloci, che abbiano un'ottima SEO e aiuti a migliorare l'esperienza utente.

In quest'articolo, imparerai come caricare immagini tramite lazy loading in una applicazione React. Parleremo di quali sono i vantaggi e di come implementarlo nel tuo codice.

Ma prima di iniziare, cosa vuol dire lazy loading e come funziona?

Così il Lazy Loading?

Il lazy loading è una strategia che ritarda il caricamento di alcune risorse (ad esempio immagini) fino a che non sono necessarie all'utente in base alla sua attività e al pattern di navigazione. Tipicamente, queste risorse vengono caricate soltanto quando lo scorrimento le porta nella vista della pagina. (Fonte: MDN Docs)

Puoi vederne un eccellente esempio su Unsplash quando scorriamo lungo la lista delle immagini. Inizialmente, vediamo delle immagini segnaposto di bassa qualità (LQIP) sfocate e poi, quando scorrono nella vista della pagina, le intere immagini vengono caricate.

unsplash-lazy-load-image-illustration-

L'idea alla base di questo processo è di rimandare il caricamento delle immagini fuori dal viewport per ridurre l'utilizzo di banda, migliorare l'esperienza utente e velocizzare il caricamento della pagina.

Oggi usare il lazy loading per un'immagine o un iframe è facile quanto aggiungere l'attributo loading="lazy" all'interno dell'elemento img/iframe, in questo modo:

<img src="image.jpg" alt="Image Alt" loading="lazy" />
<iframe src="iframe" loading="lazy"></iframe>

E funziona senza ulteriori configurazioni.

Sfortunatamente, secondo caniuse.com, il caricamento lazy delle immagini in questo modo non è supportato da tutti i browser. Inoltre, per browser come Firefox, l'attributo loading= "lazy" non funziona per l'elemento iframe. In questi casi, dovrai usarlo/combinarlo con altre librerie o strumenti.

Come iniziare con Lazy Loading

In questo articolo, utilizzerò una libreria JavaScript React Lazy Load Image Component.
Questa popolare libreria fornisce le funzionalità per presentare immagini e degli effetti che puoi implementare in modo facile e veloce nelle tue applicazioni React.

Il codice di questa demo è disponibile su GitHub qui.

Step 1 – Installa React Lazy Load Image Component

La prima cosa di cui abbiamo bisogno è installare la libreria React lazy load image component usando NPM:

// Yarn
$ yarn add react-lazy-load-image-component

//o NPM
$ npm i --save react-lazy-load-image-component

Step 2 – Importa il componente

Importeremo soltanto la nostra immagine e il componente lazy load, ma puoi usare un URL esterno se preferisci. Nel mio caso, lo sto importando come un componente dalla cartella immagini.

import Image from "../images/bird.jpg";
import { LazyLoadImage } from "react-lazy-load-image-component";

Step 3 – Dichiarare l'immagine

Per iniziare a utilizzarlo, invece di dichiarare le immagini in un tag img, sostituisci questo tag con LazyLoadImage e dichiara l'immagine con un attributo src come faresti normalmente.

Ecco l'aspetto che ha il codice:

import React from "react";
import Image from "../images/bird.jpg";
import { LazyLoadImage } from "react-lazy-load-image-component";

export default function App() {
  return (
    <div>
      <LazyLoadImage src={Image}
        width={600} height={400}
        alt="Image Alt"
      />
     </div>
  );
}

Abbiamo definito esplicitamente la larghezza e l'altezza dell'immagine. Questo aiuta a evitare problemi come il cumulative layout shift (CLS).

Per vedere gli effetti del componente, vai sulla scheda "Rete" dopo aver aperto gli strumenti per sviluppatori usando Ctrl + Shift + J su Windows, o Cmd + Opt + J su Mac. Poi imposta la limitazione su una rete più lenta (3G), disabilita la cache e ricarica la pagina.

network-tab

Ecco il risultato:

default

Di default, puoi vedere che l'immagine non si carica sulla schermo perché non è visibile nel viewport. Una volta che inizi a scorrere e l'immagine è nella vista, lazy load viene disabilitato e possiamo vedere l'immagine.

Live Demo

Step 4 – Aggiungi un'immagine segnaposto

Alternativamente, possiamo aggiungere un'anteprima di un'immagine a bassa risoluzione mentre avviene il caricamento della pagina principale. Può essere utile per riempire l'area dell'immagine in modo che gli utenti sappiano che c'è una foto che si sta caricando. Ci riferiamo a questa immagine segnaposto come LQIP (low-quality image placeholder).

Fare ciò non migliora soltanto la pagina, ma dà anche all'utente un'idea dell'aspetto dell'immagine effettiva.

Per ottenere un'immagine di dimensione minore, mi piace usare squoosh.app. Importa l'immagine e sperimenta con la risoluzione e la qualità finché non sei convinto della dimensione.

Altri strumenti per immagini che puoi usare sono:

rasterized-image

Inizialmente, l'immagine era di 288KB, ma l'abbiamo compressa con successo fino a una versione a bassa risoluzione di 2.41KB. Per usare un'immagine segnaposto, aggiungi all'immagine un attributo PlaceholderSrc con l'immagine come valore.

import Image from "../images/bird.jpg";
import PlaceholderImage from "../images/placeholder.jpg";

<LazyLoadImage src={Image}
    width={600} height={400}
    PlaceholderSrc={PlaceholderImage}
    alt="Image Alt"
/>


React-lazyload-LQIP-

Come puoi vedere, inizialmente avviene il caricamento dell'immagine segnaposto e, una volta terminato, viene rimpiazzata dell'immagine principale.

Live Demo

Step 5 – Aggiungere una sfocatura

LazyLoadImage fornisce anche un plugin per presentare inizialmente un'immagine sfocata per poi rimuovere la sfocatura a caricamento completato.

In combinazione con l'immagine segnaposto, renderà più bello l'aspetto complessivo, offrendo un output migliore.

Per utilizzare la sfocatura (blur), dobbiamo importare il file CSS che la governa:

import Image from "../images/bird.jpg";
import PlaceholderImage from "../images/placeholder.jpg";
import { LazyLoadImage } from 'react-lazy-load-image-component';
import 'react-lazy-load-image-component/src/effects/blur.css';

<LazyLoadImage src={Image}
    width={600} height={400}
    PlaceholderSrc={PlaceholderImage}
    effect="blur"
/>


React-lazyload---Blur

Live Demo

Perché dovresti usare Lazy Load per le tue immagini?

Potresti chiederti perché dovresti affrontare tutti i problemi del caricare le immagini fuori schermata nelle tua applicazioni web con lazy load. Ne vale la pena? E perché dovresti interessarti dei punti condivisi in questo articolo?

Ecco una lista di ragioni:

1. Lazy Loading risparmia dati e banda

Dato che le immagini fuori dal viewport non sono caricate immediatamente, il lazy loading risparmia l'utilizzo della banda. È favorevole alle prestazioni, soprattutto per gli utenti mobile.

2. Lazy Loading abbassa il costo di un CDN

I servizi di contenuti multimediali come Cloudinary o Imagekit offrono dei piani a pagamento per l'archiviazione multimediale. Caricare le immagini con lazy loading ti assicura che solo le immagini richieste dal CDN siano caricate, riducendo i costi del server.

3. Lazy Loading migliora la SEO

La velocità di una pagina è un fattore critico che influenza la SEO (e rende più probabile che i motori di ricerca suggeriscano la tua pagina). Se il tempo di caricamento della tua pagina è molto basso, i motori di ricerca ameranno il tuo sito.

Conclusione

Ottimizzare le immagini è una buona capacità che credo ogni sviluppatore web debba coltivare. Crea un'esperienza migliore per gli utenti, soprattutto quelli su dispositivi mobili.

Ecco il file del codice di questo articolo su GitHub.

Per ora è tutto, grazie per aver letto questo articolo!

Seguimi su twitter @victorekea.

Risorse