Lazy loading

Esempio dell'applicazione del lazy loading su Wikipedia
Esempio dell'applicazione del lazy loading su Wikipedia: le immagini vengono caricate progressivamente in base alla loro vicinanza all'area visibile della pagina, riducendo il caricamento iniziale delle risorse (anno 2016). Nel grafico, le immagini in versione beta nella pagina dedicata a Barack Obama.
Confronto dei tempi di caricamento delle immagini con e senza tecnica di lazy loading su Wikipedia giapponese, mediante i protocolli HTTP/1 e HTTP/2 (2016)
Confronto dei tempi di caricamento delle immagini con e senza tecnica di lazy loading su Wikipedia giapponese, mediante i protocolli HTTP/1 e HTTP/2 (2016)

Il lazy loading (conosciuto anche come caricamento asincrono) è una tecnica utilizzata nella programmazione informatica, in particolare nel web design e nello sviluppo web, che consiste nel posticipare l'inizializzazione di un oggetto fino al momento in cui diventa effettivamente necessario.

Se utilizzato in modo corretto e appropriato, può contribuire a migliorare l'efficienza e le prestazioni di un programma.

Questa tecnica è particolarmente indicata nei casi in cui si accede a contenuti tramite rete e si desidera ridurre al minimo i tempi di caricamento iniziali, come nel caso delle pagine web.

Ad esempio, posticipare il caricamento delle immagini di una pagina web fino al momento in cui queste diventano necessarie per la visualizzazione può rendere più veloce la visualizzazione iniziale della pagina.

L'opposto del lazy loading è l'eager loading (caricamento anticipato), che prevede invece il caricamento degli oggetti prima che siano effettivamente necessari.

Esempi

Con i framework web

Prima che venisse introdotto come standard web, il lazy loading veniva generalmente implementato attraverso l'utilizzo di framework web.

Uno di questi è Angular. Poiché il lazy loading riduce l'utilizzo della larghezza di banda e, di conseguenza, il consumo di risorse del server, rappresenta una soluzione particolarmente utile da implementare in un sito web.

Questa tecnica è utile soprattutto per migliorare la fidelizzazione degli utenti, riducendo i tempi di attesa durante il caricamento delle pagine. Ciò può contribuire anche a migliorare l'ottimizzazione per i motori di ricerca.

Di seguito viene riportato un esempio di utilizzo del lazy loading in Angular, scritto in TypeScript e realizzato da Farata Systems.

@NgModule({
 imports: [ BrowserModule,
 RouterModule.forRoot([
 {path: '', component: HomeComponent},
 {path: 'product', component: ProductDetailComponent},

 {path: 'luxury', loadChildren: () => import('./luxury.module').then(m => m. LuxuryModule), data: {preloadme: true} } ]
// , {preloadingStrategy: CustomPreloadingStrategy}
 )
 ],
 declarations: [ AppComponent, HomeComponent, ProductDetailComponent],
 providers: [{provide: LocationStrategy, useClass: HashLocationStrategy}, CustomPreloadingStrategy],
 bootstrap: [ AppComponent ]
})

Come standard web

A partire dal 2020, i principali browser web hanno introdotto il supporto nativo al lazy loading, consentendone la gestione automatica.

Questa funzionalità permette di integrare il lazy loading direttamente in una pagina web attraverso l'aggiunta di attributi HTML.

L'attributo loading supporta due valori: lazy ed eager.

  • lazy: la risorsa viene caricata solo quando diventa necessaria, ad esempio quando un'immagine entra nell'area visibile della pagina mentre l'utente scorre verso il basso.
  • eager: la risorsa viene caricata immediatamente. Questo è il comportamento predefinito del browser.
<!-- Queste risorse saranno caricate immediatamente -->
<img src="header_image.jpg">
<img src="header_image2.jpg" loading="eager">

<!-- Queste risorse saranno lazy loaded (non saranno caricate fino al momento in cui diventeranno effettivamente necessarie) -->
<img src="article_image.jpg" alt="..." loading="lazy"> 
<iframe src="video-player.html" title="..." loading="lazy"></iframe>

Metodi

Esistono quattro modalità comuni per implementare il design pattern del lazy loading: l'inizializzazione lazy (lazy initialization), il proxy virtuale (virtual proxy), il ghost e il contenitore di valori (value holder).

Ognuna di queste modalità presenta vantaggi e svantaggi specifici.

Inizializzazione lazy

Con l'inizializzazione lazy, l'oggetto viene inizialmente impostato a null.

Ogni volta che viene richiesto l'accesso all'oggetto, il programma ne verifica l'esistenza. Se il suo valore è null, l'oggetto viene creato immediatamente e restituito.

Ad esempio, il lazy loading di un widget può essere implementato nel linguaggio di programmazione C# nel seguente modo:

private int _myWidgetID;
private Widget _myWidget = null;

public Widget MyWidget
{
 get
 {
 if (_myWidget == null)
 {
 _myWidget = Widget. Load(_myWidgetID);
 }

 return _myWidget;
 }
}

In alternativa, è possibile utilizzare l'operatore di assegnazione con coalescenza dei valori nulli ??=.

private int _myWidgetID;
private Widget _myWidget = null;

public Widget MyWidget
{
 get => _myWidget ??= Widget. Load(_myWidgetID);
}

Questo metodo è il più semplice da implementare. Tuttavia, se null è un valore di ritorno valido, potrebbe essere necessario utilizzare un oggetto segnaposto (placeholder object) per indicare che l'oggetto non è ancora stato inizializzato.

Se questo metodo viene utilizzato in un'applicazione multithread, è necessario implementare meccanismi di sincronizzazione per evitare eventuali condizioni di competizione (race condition).

Proxy virtuale

Un proxy virtuale è un oggetto che presenta la stessa interfaccia dell'oggetto reale.

La prima volta che viene invocato uno dei suoi metodi, il proxy carica l'oggetto reale e successivamente gli delega l'esecuzione della chiamata.

Ghost

Un ghost è un oggetto che viene caricato in uno stato parziale. Inizialmente può contenere soltanto l'identificativo dell'oggetto, ma carica autonomamente i propri dati la prima volta che viene effettuato l'accesso a una delle sue proprietà.

Ad esempio, si consideri il caso in cui un utente stia per richiedere dei contenuti tramite un modulo online. Al momento della creazione dell'oggetto, l'unica informazione disponibile è che verrà effettuato l'accesso a dei contenuti, mentre non sono ancora noti né l'azione specifica che verrà eseguita né i contenuti richiesti.

Un esempio in PHP:

$userData = array (
 "UID" = > uniqid(),
 "requestTime" => microtime(true),
 "dataType" => "",
 "request" => ""
);

if (isset($_POST['data']) && $userData) {
 // ...
}

Value holder

Un value holder è un oggetto generico che gestisce il comportamento di lazy loading e viene utilizzato al posto dei campi dati dell'oggetto originale.

private ValueHolder<Widget> valueHolder;

public Widget MyWidget => valueHolder. GetValue();

Note

  1. ↑ Cos’è il Lazy loading, su Nicholas Marmonti. URL consultato il 9 novembre 2026.
  2. ↑ Cos'è il lazy loading e perché è utile - Noa Agency | Agenzia Marketing Aversa, su noa.agency, 12 settembre 2023. URL consultato il 9 novembre 2026.
  3. ↑ (EN) What is Lazy Loading | Lazy vs. Eager Loading | Imperva, su Learning Center. URL consultato il 9 novembre 2026.
  4. ↑ (EN) Gordon Donnelly, 6 Quick Ways to Increase Website Speed, su WordStream. URL consultato il 9 novembre 2026.
  5. ↑ Fain, Y., Moiseev, A. (2018). Angular Development with TypeScript, Second Edition. December ISBN 9781617295348.
  6. ↑ (EN) angulartypescript, su GitHub. URL consultato il 9 novembre 2026.
  7. ↑ (EN) A Deep Dive into Native Lazy-Loading for Images and Frames, su CSS-Tricks, 15 maggio 2019. URL consultato il 9 novembre 2026.
  8. ↑ (EN) Lazy loading - Performance | MDN, su MDN Web Docs, 27 marzo 2026. URL consultato il 9 novembre 2026.
  9. ↑ (EN) Lazy initialization - Design patterns - Haxe programming language cookbook, su code.haxe.org, 4 aprile 2016. URL consultato il 9 novembre 2026.
  10. ↑ Martin Fowler, Patterns of Enterprise Application Architecture, Addison-Wesley, 2003, p. 200–214, ISBN 0-321-12742-0.
  11. ↑ (EN) BillWagner, ?? and ??= operators - null-coalescing operators - C# reference, su learn.microsoft.com. URL consultato il 9 novembre 2026.
  12. ↑ (EN) Virtual Proxy Pattern in Java: Enhancing Performance with Lazy Loading Techniques, su Java Design Patterns. URL consultato il 9 novembre 2026.
  13. ↑ (EN) Simple Image Lazy Loading with Ghost, su Xander Dumaine, 2 gennaio 2016. URL consultato il 9 novembre 2026.
  14. ↑ Martin Fowler, Lazy Load, su martinfowler.com. URL consultato il 9 novembre 2026.

Bibliografia

Voci correlate

Collegamenti esterni

  Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica