Skip to content

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:

  1. Funzioni event handler (es. onClick, onChange) - Non serve useCallback
  2. Componenti - Non serve React.memo
  3. Codice React in generale - Analisi automatica delle dipendenze

⚠️ Quando useCallback e useMemo sono ANCORA Necessari ​

useCallback Γ¨ necessario quando: ​

  1. La funzione Γ¨ nella dependency array di useEffect

    tsx
    const fetchData = useCallback(async () => {
        const result = await api.getData();
        setData(result);
    }, []);
    
    useEffect(() => {
        fetchData(); // βœ… Con useCallback: stabile
    }, [fetchData]);
  2. La funzione Γ¨ passata a un hook custom che la usa in useEffect

    tsx
    function handleMessage(msg) { ... }
    useBroadcastChannel("auth", handleMessage); // βœ… Serve useCallback

useMemo Γ¨ necessario quando: ​

  1. Calcoli costosi con dipendenze esplicite
    tsx
    // ❌ 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: ​

CasouseCallback/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:

bash
# Avvia il dev server
npm run dev

# Apri nel browser (dev mode usa /client/ come base path)
http://localhost:5173/client/test-compiler

Nota: 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:

  1. Apri la Console del Browser (F12)

  2. Clicca "Increment Parent" su ENTRAMBI i componenti (verde e rosso)

  3. Verifica nella console:

    • 🟒 Con Compiler: Vedi solo [WITH COMPILER] Rendering, NON vedi [WITH COMPILER] Child Rendering
    • πŸ”΄ Senza Compiler: Vedi sia [WITHOUT COMPILER] Rendering che [WITHOUT COMPILER] Child Rendering
  4. Clicca "Click from Child" su entrambi

  5. Verifica nella console:

    • Entrambi ora mostrano il rendering del Child (corretto, perchΓ© value Γ¨ cambiato)

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:

  1. Installa React DevTools
  2. Apri DevTools β†’ Tab "Profiler"
  3. Vai su /test-compiler

Test:

  1. Clicca il pulsante ⏺ Record nel Profiler
  2. Clicca "Increment Parent" 3-4 volte
  3. Clicca ⏹ Stop recording

Cosa verificare nel Flame Graph:

  • βœ… Il componente Parent appare in ogni render
  • βœ… Il componente Child NON appare (non viene re-renderizzato)
  • βœ… Questo dimostra che React Compiler sta ottimizzando automaticamente

3. Test Automatici ​

I test verificano che il comportamento sia corretto:

bash
# Esegui tutti i test
npm run test:run

# Esegui test con coverage
npm run test:coverage

Risultato atteso:

  • βœ… Tutti i test passano
  • βœ… Le funzioni con useCallback mantengono 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:

  1. Apri l'applicazione in dev mode: npm run dev
  2. Esegui azioni che usano TanStack Query hooks:
    • Login
    • Cambio password
    • Selezione azienda
  3. 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:

typescript
babel({
    filter: /\.[jt]sx?$/,
    babelConfig: {
        presets: ["@babel/preset-typescript"],
        plugins: [["babel-plugin-react-compiler", ReactCompilerConfig]],
    },
})

Verifica installazione:

bash
npm list babel-plugin-react-compiler

πŸ“Š Riepilogo Stato Attuale ​

οΏ½ Riepilogo Stato Attuale ​

βœ… Ottimizzazioni Applicate ​

  1. Rimozione React.memo - Non piΓΉ necessario per componenti
  2. useCallback mantenuto dove necessario:
    • βœ… AuthSyncListener - callback passati ad altri hook
  3. useMemo usato per calcoli costosi con dipendenze esplicite

πŸ§ͺ Test di Verifica ​

bash
# 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/useMemo dove semanticamente necessario
  • βœ… Codice piΓΉ pulito e manutenibile
  • βœ… Performance garantite

Questo Γ¨ l'approccio consigliato anche dalla documentazione ufficiale di React! πŸš€

Documentazione Elerama Frontend