[Lv2] Fondamenti di lifecycle e hydration in Nuxt 3
Comprendere i confini del lifecycle e il comportamento della hydration è fondamentale per evitare mismatch tra SSR e client.
1. Focus da colloquio
- Differenze di lifecycle tra server-side e client-side
useStatevsrefin SSR- Cause tipiche di hydration mismatch e relative soluzioni
2. Confini del lifecycle in Nuxt 3
In modalità SSR:
setup()gira sia su server che su clientonMounted()gira solo sul client- Le API browser devono essere protette per l'esecuzione client
<script setup lang="ts">
if (process.server) {
console.log('Server render phase');
}
onMounted(() => {
// Client only
console.log(window.location.href);
});
</script>
3. Perché avviene un hydration mismatch
Cause comuni:
- Rendering di valori casuali (
Math.random()) durante SSR - Rendering di valori dipendenti dal tempo (
new Date()) senza sincronizzazione - Accesso ad API solo browser durante il render server
- Branch condizionali diversi tra server e client
4. useState vs ref in SSR
refè stato reattivo locale all'istanza del componenteuseStateserializza e idrata lo stato attraverso il confine SSR
const counter = useState<number>('counter', () => 0);
Per stato condiviso consapevole di SSR, preferisci useState.
5. Prevenzione pratica dei mismatch
- Racchiudi UI solo browser con
ClientOnlyquando necessario - Sposta le API browser in
onMounted - Garantisci valori iniziali deterministici nel render
- Mantieni espliciti i branch SSR/client (
process.server,process.client)
6. Flusso di debug
- Riproduci il mismatch con refresh completo della pagina
- Confronta HTML server e DOM idratato
- Disabilita gradualmente i frammenti dinamici sospetti
- Conferma la stabilità del render finale con rete lenta e cold load
Sintesi pronta per il colloquio
Tratto SSR e client come due fasi di esecuzione distinte. Mantengo deterministico l'output iniziale, uso
useStateper lo stato condiviso SSR e isolo la logica solo browser nei client hook. Questo evita hydration mismatch e mantiene il rendering prevedibile.