Verifica Funzionamento React Compiler β
Questa guida spiega come verificare che React Compiler stia funzionando correttamente e quando Γ¨ ancora necessario usare useCallback e useMemo.
π― Cosa Ottimizza React Compiler β
React Compiler ottimizza automaticamente:
- Funzioni event handler (es.
onClick,onChange) - Non serveuseCallback - Componenti - Non serve
React.memo - Codice React in generale - Analisi automatica delle dipendenze
β οΈ Quando useCallback e useMemo sono ANCORA Necessari β
useCallback Γ¨ necessario quando: β
La funzione Γ¨ nella dependency array di
useEffecttsxconst fetchData = useCallback(async () => { const result = await api.getData(); setData(result); }, []); useEffect(() => { fetchData(); // β Con useCallback: stabile }, [fetchData]);La funzione Γ¨ passata a un hook custom che la usa in
useEffecttsxfunction handleMessage(msg) { ... } useBroadcastChannel("auth", handleMessage); // β Serve useCallback
useMemo Γ¨ necessario quando: β
- Calcoli costosi con dipendenze esplicitetsx
// β React Compiler non puΓ² ottimizzare questo const result = expensiveCalculation(props.data); // β Usa useMemo per controllo esplicito const result = useMemo(() => expensiveCalculation(props.data), [props.data] );
Regola Pratica: β
| Caso | useCallback/useMemo necessario? |
|---|---|
Funzione event handler (onClick) | β NO |
| Componente figlio | β NO (non serve React.memo) |
Funzione in dependency di useEffect | β SΓ - useCallback |
| Funzione passata a hook custom | β SΓ - useCallback |
| Calcolo costoso con dipendenze | β SΓ - useMemo |
π Metodi di Verifica β
1. Pagina di Test Dedicata β CONSIGLIATO β
Abbiamo creato una pagina di test: /test-compiler
β οΈ Nota: Questa pagina Γ¨ accessibile SOLO in modalitΓ sviluppo. In produzione viene automaticamente reindirizzata alla home.
Come usarla:
# Avvia il dev server
npm run dev
# Apri nel browser (dev mode usa /client/ come base path)
http://localhost:5173/client/test-compilerNota: In dev mode l'app Γ¨ servita su
/client/, mentre in build Γ¨ servita sulla root/.
La pagina mostra due componenti affiancati:
- π’ Con React Compiler - Ottimizzazioni automatiche attive
- π΄ Senza React Compiler - Nessuna ottimizzazione
Test da eseguire:
Apri la Console del Browser (F12)
Clicca "Increment Parent" su ENTRAMBI i componenti (verde e rosso)
Verifica nella console:
- π’ Con Compiler: Vedi solo
[WITH COMPILER] Rendering, NON vedi[WITH COMPILER] Child Rendering - π΄ Senza Compiler: Vedi sia
[WITHOUT COMPILER] Renderingche[WITHOUT COMPILER] Child Rendering
- π’ Con Compiler: Vedi solo
Clicca "Click from Child" su entrambi
Verifica nella console:
- Entrambi ora mostrano il rendering del Child (corretto, perchΓ©
valueè cambiato)
- Entrambi ora mostrano il rendering del Child (corretto, perchΓ©
Differenza chiave:
- π’ Con Compiler: Child NON si ri-renderizza quando cambia solo
parentCount - π΄ Senza Compiler: Child si ri-renderizza OGNI volta
2. React DevTools Profiler β PROFESSIONALE β
Il Profiler mostra graficamente i re-render:
Setup:
- Installa React DevTools
- Apri DevTools β Tab "Profiler"
- Vai su
/test-compiler
Test:
- Clicca il pulsante βΊ Record nel Profiler
- Clicca "Increment Parent" 3-4 volte
- Clicca βΉ Stop recording
Cosa verificare nel Flame Graph:
- β
Il componente
Parentappare in ogni render - β
Il componente
ChildNON appare (non viene re-renderizzato) - β Questo dimostra che React Compiler sta ottimizzando automaticamente
3. Test Automatici β
I test verificano che il comportamento sia corretto:
# Esegui tutti i test
npm run test:run
# Esegui test con coverage
npm run test:coverageRisultato atteso:
- β Tutti i test passano
- β
Le funzioni con
useCallbackmantengono identitΓ stabile - β
Nessun loop infinito in
useEffect
5. Verifica Manuale nel Codice β
File ottimizzati:
app/components/auth/AuthSyncListener.tsx- callback passati ad altri hook
Come verificare:
- Apri l'applicazione in dev mode:
npm run dev - Esegui azioni che usano TanStack Query hooks:
- Login
- Cambio password
- Selezione azienda
- Verifica nella Console Network (F12 β Network):
- β Le chiamate API funzionano correttamente
- β Non ci sono chiamate duplicate
- β Il comportamento Γ¨ identico a prima
π§ Configurazione React Compiler β
La configurazione si trova in vite.config.ts:
babel({
filter: /\.[jt]sx?$/,
babelConfig: {
presets: ["@babel/preset-typescript"],
plugins: [["babel-plugin-react-compiler", ReactCompilerConfig]],
},
})Verifica installazione:
npm list babel-plugin-react-compilerπ Riepilogo Stato Attuale β
οΏ½ Riepilogo Stato Attuale β
β Ottimizzazioni Applicate β
- Rimozione
React.memo- Non piΓΉ necessario per componenti useCallbackmantenuto dove necessario:- β
AuthSyncListener- callback passati ad altri hook
- β
useMemousato per calcoli costosi con dipendenze esplicite
π§ͺ Test di Verifica β
# Test protezione route
npm test -- test-compiler.protection
# Tutti i test
npm run test:runοΏ½π Risorse β
β¨ Best Practices Finali β
Quando React Compiler Ottimizza Automaticamente: β
- β
Event handlers (
onClick,onChange, ecc.) - β
Componenti semplici (non serve
React.memo) - β JSX e rendering
Quando Serve Ancora Ottimizzazione Manuale: β
- β οΈ Funzioni in dependency array β
useCallback - β οΈ Callback passati ad altri hook β
useCallback - β οΈ Calcoli costosi con dipendenze β
useMemo
Regola d'Oro: β
Se una funzione Γ¨ usata come dipendenza di useEffect, usa useCallback.
π― Conclusione β
Il progetto usa un approccio ibrido:
- β React Compiler per ottimizzazioni automatiche generali
- β
useCallback/useMemodove semanticamente necessario - β Codice piΓΉ pulito e manutenibile
- β Performance garantite
Questo Γ¨ l'approccio consigliato anche dalla documentazione ufficiale di React! π