f in x
> cd .. / HUB_EDITORIALE > Visualizza in Inglese
Sviluppo di siti web

React Performance con memo lazy Suspense e Profiling — Rendi la tua App Veloce senza Riscrivere Tutto

[2026-06-23] Author: Ing. Calogero Bono

Il cliente che ti ha commissionato il carrello e-commerce ora ti scrive: «L'app si blocca quando carico il catalogo con 500 prodotti». Tu apri il profiler, vedi un albero di componenti che si ri-renderizza 12 volte per click. Il problema non è il framework — è che non hai mai messo un memo dove serviva, non hai caricato lazy le sezioni pesanti, e non sai nemmeno dove guardare per capire cosa rallenta. Partiamo da lì.

Quale problema risolve React memo rispetto a un componente senza memo?

React, di default, ri-renderizza un componente ogni volta che il suo stato cambia o il genitore si ri-renderizza. Se hai un ProductList che filtra 500 prodotti e ogni card contiene un ProductCard con sottocomponenti, cambiare anche solo il filtro di un carattere fa ripartire l'intero albero. Qui entra React.memo: è un higher-order component che fa un shallow comparison delle props. Se le props non sono cambiate, il componente salta la renderizzazione.

Quando usarlo e quando evitarlo

Usalo su componenti puri che ricevono le stesse props per la maggior parte dei cicli. Non usarlo su componenti con props che cambiano sempre (es. un contatore che incrementa ogni secondo) — la comparazione costa più del re-render stesso. Noi, in un progetto di dashboard per una PMI, abbiamo ridotto i re-render del 40% su una tabella di 1000 righe applicando memo solo alle righe che non cambiavano mai (es. campi lettura).

Sponsored Protocol

import React, { memo } from 'react';

const ProductCard = memo(function ProductCard({ name, price, image }) {
  console.log('Rendering:', name); // utile per debug
  return (
    
{name}

{name}

€{price.toFixed(2)}

); }); export default ProductCard;

Checklist pratica per memo

  • Il componente riceve props che cambiano raramente?
  • Il componente è puro (stesso input = stesso output)?
  • Hai misurato il costo della comparazione con il profiler?
  • Per props oggetto/funzione, usa useMemo o useCallback nel genitore per evitare comparazioni sempre diverse.

Come implementare React lazy e Suspense per ridurre il bundle iniziale?

Il bundle JS iniziale di un'app React cresce rapidamente: una libreria per grafici, un editor Markdown, un modulo di amministrazione. Se carichi tutto subito, il primo caricamento è lento. React.lazy permette di caricare un componente solo quando serve, e Suspense gestisce il fallback (spinner, scheletro).

Sponsored Protocol

Esempio pratico: caricamento differito di un modulo pesante

import React, { lazy, Suspense } from 'react';

const AdminPanel = lazy(() => import('./AdminPanel'));

function App() {
  const [showAdmin, setShowAdmin] = useState(false);

  return (
    
Caricamento in corso…
}> {showAdmin && }
); }

Errori comuni con lazy

  • Non usarlo su componenti visibili subito: il primo render aspetta il download, peggiorando il First Paint. Usalo solo per route o sezioni sotto la piega.
  • Dimenticare il fallback: senza Suspense, React.lazy non funziona proprio (lancia errore).
  • Non combinarlo con il code splitting a livello di route: in React Router, lazy carica ogni route separatamente.

Noi abbiamo applicato questa tecnica su un e-commerce moda con catalogo di 3000 SKU: il bundle iniziale passò da 2.8MB a 1.1MB, e il tempo di interattività (TTI) calò da 7.2s a 3.4s. Il margine su quel negozio? +12% di conversioni.

Sponsored Protocol

Come profilare una React app con React DevTools Profiler per identificare colli di bottiglia?

La profilazione è il punto cieco di molti sviluppatori. «L'app è lenta» non è un bug report: è un sintomo. Con il React DevTools Profiler puoi registrare una sessione e vedere esattamente chi si ri-renderizza, per quanto e perché.

Passi operativi per una profilazione efficace

  1. Apri React DevTools in Chrome/Firefox, vai alla scheda Profiler.
  2. Clicca il pulsante rosso di registrazione (o usa il comando da console: window.__REACT_DEVTOOLS_GLOBAL_HOOK__ per trigger automatici).
  3. Interagisci con la UI: filtra, scrolla, apri modali — fai esattamente le azioni che il tuo utente reale fa.
  4. Ferma la registrazione: vedrai una flame graph (grafico a fiamma). Cerca barre larghe e rosse — indicano componenti che impiegano molto tempo.
  5. Clicca su una barra: nel pannello destro vedrai “why did this render?”: props cambiate, stato locale, contest.

Esempio: debugging con profiler

// Se vedi che MyComponent si ri-renderizza a causa di una nuova funzione passata come prop:
// Prima (ri-crea una funzione a ogni render del genitore):
 doSomething(id)} />

// Dopo (con useCallback):
const handleClick = useCallback(() => doSomething(id), [id]);

Come combinare memo lazy e Suspense per un flusso di caricamento ottimale?

Le tre tecniche non vivono isolate: memo evita re-render inutili, lazy riduce il bundle iniziale, Suspense gestisce il caricamento. Insieme creano un pattern robusto.

Sponsored Protocol

Architettura consigliata per app React con sezioni pesanti

import React, { lazy, Suspense, memo } from 'react';

const HeavyChart = lazy(() => import('./HeavyChart'));

const ChartWrapper = memo(function ChartWrapper({ data }) {
  return (
    }>
      
    
  );
});

export default ChartWrapper;

In questo esempio: ChartWrapper è memoizzato — se data non cambia, non si ri-renderizza. HeavyChart è caricato lazy — non entra nel bundle iniziale. Suspense mostra uno scheletro mentre carica. Tre problemi risolti con una combinazione semplice.

Sponsored Protocol

Cosa fare adesso

  1. Installa React DevTools nel browser se non lo hai già. È il tuo stetoscopio.
  2. Apri il Profiler e registra 30 secondi di uso reale della tua app. Identifica i 3 componenti che si ri-renderizzano di più.
  3. Applica memo a quei componenti se le loro props non cambiano a ogni render. Verifica la riduzione dei re-render.
  4. Trova il modulo più pesante (es. editor, grafico, mappa) e avvolgilo con lazy + Suspense. Misura il bundle size prima/dopo con webpack-bundle-analyzer o Vite’s rollup-plugin-visualizer.
  5. Leggi la documentazione ufficiale su React.memo e React.lazy (EN).

Hai un progetto React in produzione? Torna alla guida principale React per il quadro completo.

Ing. Calogero Bono

> AUTHOR_EXTRACTED

Ing. Calogero Bono

Ingegnere Informatico, co-fondatore di Meteora Web. Esperto in architetture software, sicurezza informatica e sviluppo sistemi scalabili.
[ Read Full Dossier ]

> METEORA_WEB // WEB AGENCY

Costruiamo la presenza digitale che la tua azienda merita.

Siti web, social, pubblicità online, e-commerce e hosting performante: ingegnerizzati con metodo da ingegneri informatici a Sciacca, per tutta Italia.

> MW_JOURNAL

> READ_ALL()