Che cos’è il DOM virtuale? Come React e Vue aggiornano la pagina

  • vuetelemetry
  • Guide
  • 6 min di lettura

Il DOM virtuale è una copia leggera della pagina tenuta in memoria, che i framework confrontano (diffing) per aggiornare in modo efficiente il DOM reale. Che cos’è, come funziona il diffing e perché regge il modello dichiarativo di React e Vue.

Chiunque impari React o Vue incontra molto presto l’espressione «DOM virtuale», e tende a suonare come magia. Non lo è: è un’idea semplice e concreta che spiega come i moderni framework front-end mantengono una pagina sincronizzata con i tuoi dati senza che tu debba toccare la pagina a mano.

Il problema che risolve

Codice JavaScript sullo schermo: framework come React e Vue costruiscono e aggiornano il DOM al posto tuo, così descrivi il risultato anziché i passaggi.
Codice JavaScript sullo schermo: framework come React e Vue costruiscono e aggiornano il DOM al posto tuo, così descrivi il risultato anziché i passaggi.

Per capire il problema che risolve, ricorda che cos’è il DOM reale: l’albero vivo di elementi che il browser renderizza. Aggiornarlo direttamente — creare nodi, impostare attributi, riordinare i figli — è al tempo stesso lento quando lo si fa molto e soggetto a errori quando lo si fa a mano. Mantenere corretta un’interfaccia complessa mentre i dati cambiano, con modifiche manuali al DOM ovunque, è esattamente il punto in cui proliferano i bug.

Cos'è il virtual DOM

Il DOM virtuale è la risposta del framework. È una copia leggera dell’interfaccia tenuta in memoria come semplici oggetti JavaScript: un albero che descrive come dovrebbe apparire la pagina in questo preciso momento. È economico da creare e da scartare, perché nulla in esso tocca il browser finché il framework non lo decide.

  • Una copia leggera dell’interfaccia in memoria, come semplici oggetti
  • A ogni cambio di stato si costruisce un nuovo albero e lo si confronta (riconciliazione)
  • Vengono applicate solo le modifiche minime al DOM reale
  • Abilita il modello dichiarativo «l’interfaccia = una funzione dello stato»
  • React e Vue lo usano; Svelte e Solid lo evitano deliberatamente

Come funziona il diffing

Ecco il ciclo. Quando il tuo stato cambia, il framework costruisce un albero di DOM virtuale completamente nuovo che rappresenta l’interfaccia desiderata. Poi confronta quel nuovo albero con il precedente — un passaggio chiamato diffing o riconciliazione — e calcola l’insieme più piccolo di modifiche al DOM reale necessarie per passare dalla vecchia immagine a quella nuova.

Quest’ultima parte è il punto cruciale. Invece di farti capire «quali nodi aggiungo, rimuovo o aggiorno?», il framework calcola la patch minima e applica solo quella al DOM reale. Le costose operazioni del browser vengono raggruppate e ridotte al minimo, così la pagina si aggiorna in modo efficiente anche quando è cambiato molto stato in una volta sola.

Il vero vantaggio: un modello dichiarativo

Ma la velocità è solo metà del beneficio, e probabilmente non quello principale. Il vero vantaggio è il modello di programmazione che il DOM virtuale rende praticabile: scrivi la tua interfaccia come una funzione dello stato — descrivi come deve apparire la pagina per i dati attuali — e lasci che sia il framework a riconciliare la differenza. Questo stile dichiarativo sostituisce il fragile approccio imperativo del «mutare il DOM passo dopo passo».

React e Vue

Sia React sia Vue si fondano su questa idea, ciascuno con le proprie implementazioni e ottimizzazioni. Quando scrivi un componente che restituisce markup a partire dai suoi dati, in realtà stai descrivendo un albero di DOM virtuale; il framework si occupa del diffing e degli effettivi aggiornamenti del DOM dietro le quinte. È per questo che raramente chiami tu stesso metodi del DOM in entrambi.

I limiti, onestamente

Vale la pena essere onesti sui limiti. Un DOM virtuale non è automaticamente l’approccio più veloce possibile: il diffing stesso ha un costo. Framework più recenti come Svelte e Solid rinunciano al DOM virtuale e compilano i componenti in aggiornamenti a grana fine che toccano il DOM direttamente. Il DOM virtuale è quindi una buona strategia, non l’unica — ma per React e Vue è centrale nel loro funzionamento.

Vale la pena essere onesti sui limiti. Un DOM virtuale non è automaticamente l’approccio più veloce possibile: il diffing stesso ha un costo. Framework più recenti come Svelte e Solid rinunciano al DOM virtuale e compilano i componenti in aggiornamenti a grana fine che toccano il DOM direttamente. Il DOM virtuale è quindi una buona strategia, non l’unica — ma per React e Vue è centrale nel loro funzionamento.

— vuetelemetry

In sintesi

In breve, il DOM virtuale è un modello in memoria della tua interfaccia che il framework confronta con la versione precedente per aggiornare il DOM reale con il minor lavoro possibile. Il suo valore duraturo non è solo la performance, ma il modello dichiarativo che abilita: tu descrivi il risultato e il framework trova i passaggi.

FAQ

Che cos’è il DOM virtuale in parole semplici?

È una copia leggera della pagina tenuta in memoria come semplici oggetti JavaScript. Quando i tuoi dati cambiano, il framework costruisce una nuova copia, la confronta con quella vecchia e aggiorna solo le parti della pagina reale che sono davvero cambiate — così non devi mai modificare il DOM a mano.

Perché il DOM virtuale è più veloce?

Le operazioni dirette sul DOM sono costose, e farle in modo ingenuo (ri-renderizzare tutto) è uno spreco. Il DOM virtuale permette al framework di calcolare l’insieme minimo di modifiche e di raggrupparle, così viene toccato solo ciò che è davvero cambiato. Il vantaggio maggiore, però, è il modello di programmazione dichiarativo, più semplice, che abilita.

Qual è la differenza tra il DOM virtuale e il DOM reale?

Il DOM reale è l’albero vivo di elementi che il browser renderizza e mostra. Il DOM virtuale ne è una rappresentazione in memoria, in JavaScript: economica da creare e da confrontare. Il framework confronta due alberi di DOM virtuale e poi applica le modifiche risultanti al DOM reale.

Tutti i framework usano un DOM virtuale?

No. React e Vue sono costruiti attorno a esso, ma non è l’unico approccio. Svelte e Solid rinunciano del tutto al DOM virtuale e compilano i componenti in aggiornamenti a grana fine che modificano il DOM direttamente. Il DOM virtuale è una strategia efficace tra diverse.

Stack correlato