Rendering Statis vs Dinamis dengan i18n di Next.js
Masalah dengan next-intl
Apa yang terjadi? Saat Anda menggunakan
useTranslations,getTranslations, atau helper next-intl lainnya di dalam Server Component pada aplikasi dengan routing i18n (/en/…,/fr/…), Next.js menandai seluruh rute sebagai dinamis. ([Next Intl][1])Mengapa? next-intl mengambil locale saat ini dari header yang hanya tersedia pada request (
x-next-intl-locale) melaluiheaders(). Karenaheaders()adalah dynamic API, setiap komponen yang mengaksesnya kehilangan optimasi statis. ([Next Intl][1], [Next.js][2])Solusi resmi (boilerplate)
- Ekspor
generateStaticParamsdengan setiap locale yang didukung. - Panggil
setRequestLocale(locale)di setiap layout/halaman sebelum Anda memanggiluseTranslations. ([Next Intl][1]) Ini menghilangkan ketergantungan pada header, tetapi Anda sekarang memiliki kode tambahan yang harus dipelihara dan API yang tidak stabil di produksi.
- Ekspor
Bagaimana intlayer menghindari masalah ini
Pilihan desain
- Hanya parameter route – Locale berasal dari segmen URL
[locale]yang sudah diteruskan Next.js ke setiap halaman. - Bundle waktu kompilasi – Terjemahan diimpor sebagai modul ES biasa, sehingga mereka di-tree-shaken dan disematkan pada saat build.
- Tanpa API dinamis –
useT()membaca dari konteks React, bukan dariheaders()ataucookies(). - Tanpa konfigurasi tambahan – Setelah halaman Anda berada di bawah
app/[locale]/, Next.js secara otomatis melakukan prerender satu file HTML per locale.