Statyczne vs dynamiczne renderowanie z i18n w Next.js
Problem z next-intl
Co się dzieje? Gdy używasz
useTranslations,getTranslationslub jakiegokolwiek helpera next-intl wewnątrz komponentu serwerowego w aplikacji z trasowaniem i18n (/en/…,/fr/…), Next.js oznacza całą trasę jako dynamiczną. ([Next Intl][1])Dlaczego? next-intl odczytuje bieżący locale z nagłówka dostępnego tylko w żądaniu (
x-next-intl-locale) za pomocąheaders(). Ponieważheaders()jest dynamicznym API, każdy komponent, który z niego korzysta, traci optymalizację statyczną. ([Next Intl][1], [Next.js][2])Oficjalne obejście (boilerplate)
- Eksportuj
generateStaticParamsdla każdego obsługiwanego locale. - Wywołaj
setRequestLocale(locale)w każdym layoucie/stronie przed wywołaniemuseTranslations. ([Next Intl][1]) To usuwa zależność od nagłówka, ale teraz masz dodatkowy kod do utrzymania oraz niestabilne API w produkcji.
- Eksportuj
Jak intlayer omija ten problem
Wybory projektowe
- Tylko parametr trasy – Locale pochodzi z segmentu URL
[locale], który Next.js już przekazuje do każdej strony. - Pakiety w czasie kompilacji – Tłumaczenia są importowane jako zwykłe moduły ES, dzięki czemu są poddawane tree-shakingowi i osadzane podczas budowania.
- Brak dynamicznych API –
useT()odczytuje dane z kontekstu React, a nie zheaders()czycookies(). - Zero dodatkowej konfiguracji – Gdy Twoje strony znajdują się pod
app/[locale]/, Next.js automatycznie prerenderuje jeden plik HTML na locale.