Hydration SSR terjadi saat markup server-side diinisialisasi ulang di sisi klien. Masalah utama adalah mismatch state: data saat render server berbeda dengan state saat JavaScript berjalan di browser. Langkah pertama adalah memastikan payload yang dikirim bersama HTML tetap konsisten dan ditransformasikan ulang ke state lokal sebelum komponen aktif.
Pembaca akan menemukan pola konkret membuat data hydration di Next.js atau Nuxt.js, teknik menjaga state tetap sinkron, metrik observabilitas untuk mendeteksi perbedaan, serta checklist troubleshooting ketika mismatch muncul.
1. Pola Hydration Data di Next.js dan Nuxt.js
Keduanya mengirimkan data awal bersama HTML agar komponen tidak kehilangan state saat hydrated. Di Next.js, getServerSideProps atau getStaticProps mengumpulkan data dan serialisasikan ke props:
export async function getServerSideProps() {
const res = await fetch('https://api.internal/user-123');
const user = await res.json();
return { props: { user, serverTimestamp: Date.now() } };
}
export default function ProfilePage({ user, serverTimestamp }) {
const [profile, setProfile] = useState(user);
// state lokal tetap sejalan dengan payload server
}Nuxt.js menyediakan asyncData dan useState untuk menyimpan nilai yang sudah dimuat. Hindari memanggil API tambahan dalam mounted yang memperbarui state sebelum hydration selesai, karena bisa menimbulkan content flash.
2. Strategi Menjaga State Client Konsisten
Serialisasi Awal dan Validasi
Pastikan server menyertakan representasi serializable (JSON-safe) dari state, lalu deserialisasi di client sebelum inisialisasi. Hindari menyimpan objek seperti Date tanpa konversi—tangani dengan map ke string lalu kembalikan ke Date di client.
Flags dan Checksum untuk Deteksi Cepat
Buat flag pada payload untuk membedakan state utama, misalnya hydrationKey atau versi data. Saat client menerima data, bandingkan checksum atau timestamp dengan local store. Contoh:
const hydratePayload = window.__HYDRATION_PAYLOAD__;
if (hydratePayload?.checksum !== computeChecksum(localState)) {
console.warn('Mismatch state terdeteksi, reset state awal.');
setState(hydratePayload.data);
}
Pemakaian checksum membantu mencegah perubahan tidak sengaja dari script pihak ketiga.
Latch dan Lock Hydration
Gunakan flag seperti isHydrated sebelum menampilkan komponen interaktif. Hindari re-render sebelum data valid dengan mekanisme seperti:
return (
{isHydrated ? : 'Loading...'}
);
Lock ini mencegah server-rendered markup tertimpa state belum siap.
3. Observabilitas dan Diagnostik
Deteksi mismatch lebih mudah jika Anda logging dan snapshot state sepanjang lifecycle.
Snapshot State dan Logging
Selipkan logging singkat pada server dan client untuk nilai kunci. Contoh sederhana:
console.log('SSR payload', { userId: payload.user.id, version: payload.version });
console.log('Client state init', clientState);
Untuk produksi, kirimkan ke sistem observability (misalnya Sentry/ELE). Lakukan snapshot state sebelum dan sesudah hydration untuk membandingkan.
Hook Khusus untuk Diagnostik
Implementasi hook custom seperti useHydrationWatcher memudahkan pencatatan mismatch:
function useHydrationWatcher(serverState, clientState) {
useEffect(() => {
if (JSON.stringify(serverState) !== JSON.stringify(clientState)) {
console.error('Hydration mismatch', { serverState, clientState });
}
}, [serverState, clientState]);
}
Gunakan hanya untuk debugging karena stringify boleh mahal; aktifkan di mode development saja.
4. Testing dan Validasi Hydration
Automasi testing adalah kunci. Pastikan test environment meniru SSR dan melakukan hydration ulang.
End-to-End Test dengan SSR
Gunakan testing tool seperti Playwright atau Cypress untuk menyertakan server rendering dan periksa DOM setelah hydration selesai. Contoh langkah:
- Render halaman via server test server.
- Periksa markup statis serta atribut data-hydration.
- Trigger interaksi sederhana untuk memastikan state tetap konsisten.
Test ini memverifikasi bahwa data awal identik dengan state client saat JavaScript aktif.
Unit Test untuk Serialisasi
Tambahkan unit test yang memastikan data saat getServerSideProps sama persis dengan data yang dikonsumsi component, termasuk konversi serialisasi/deserialisasi.
5. Checklist Troubleshooting Hydration Mismatch
- Periksa payload SSR: apakah JSON yang sama diterima di client?
- Validasi serialisasi manual untuk objek seperti
Date,Map, atauundefined. - Bandingkan checksum/timestamp payload dengan state lokal sebelum setState.
- Gunakan logging/observability untuk melihat nilai server vs client saat hydration.
- Pastikan effect seperti data fetching hanya dijalankan setelah state awal siap (gunakan flag
isHydrated). - Jalankan e2e test SSR dan periksa DOM akhir terhadap ekspektasi.
- Jika mismatch sering terjadi, tambahkan hook debug dengan stringify tapi aktif di dev mode.
Dengan checklist ini, Anda bisa menelusuri mismatch dengan sistematik dan memperbaiki sumbernya.
Kesimpulan
Hydration SSR menuntut kontrol ketat atas payload dan state lokal. Terapkan serialisasi yang konsisten, checksum atau flag, serta observabilitas seperti logging dan state snapshot untuk mendeteksi mismatch. Lengkapi dengan testing automasi untuk memastikan state tetap sinkron di setiap deployment. Dengan pendekatan bertahap seperti ini, aplikasi SSR Anda dapat menampilkan pengalaman yang stabil tanpa flicker atau error hydration.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!