Langsung ke konten utama

[Lv2] Fundamental Lifecycle dan Hydration di Nuxt 3

Memahami batas lifecycle dan perilaku hydration adalah kunci untuk menghindari masalah mismatch antara SSR dan client.


1. Fokus wawancara

  1. Perbedaan lifecycle server-side vs client-side
  2. useState vs ref di SSR
  3. Penyebab umum hydration mismatch beserta perbaikannya

2. Batas lifecycle di Nuxt 3

Dalam mode SSR:

  • setup() berjalan di server dan client
  • onMounted() hanya berjalan di client
  • Browser API harus diberi guard agar hanya dieksekusi di client
<script setup lang="ts">
if (process.server) {
console.log('Server render phase');
}

onMounted(() => {
// Client only
console.log(window.location.href);
});
</script>

3. Mengapa hydration mismatch terjadi

Penyebab umum:

  • Merender nilai acak (Math.random()) saat SSR
  • Merender nilai berbasis waktu (new Date()) tanpa sinkronisasi
  • Mengakses browser-only API saat server render
  • Cabang kondisional berbeda antara server dan client

4. useState vs ref di SSR

  • ref adalah state reaktif lokal untuk instance komponen
  • useState melakukan serialisasi dan hydration state lintas batas SSR
const counter = useState<number>('counter', () => 0);

Untuk state bersama yang sadar SSR, pilih useState.

5. Pencegahan mismatch yang praktis

  • Bungkus UI browser-only dengan ClientOnly bila diperlukan
  • Pindahkan browser API ke onMounted
  • Pastikan nilai initial render bersifat deterministik
  • Buat percabangan SSR dan client eksplisit (process.server, process.client)

6. Alur debugging

  • Reproduksi mismatch dengan full page refresh
  • Bandingkan HTML dari server dan DOM setelah hydration
  • Nonaktifkan fragmen dinamis yang mencurigakan secara bertahap
  • Konfirmasi stabilitas render akhir pada jaringan lambat dan cold load

Ringkasan siap wawancara

Saya memperlakukan SSR dan client sebagai dua fase eksekusi. Saya menjaga output awal tetap deterministik, memakai useState untuk state bersama SSR, dan mengisolasi logika browser-only ke hook client. Ini mencegah hydration mismatch dan membuat rendering tetap terprediksi.