SEO: multilingual homepage (homeSlug per locale in path/sitemap), Article + llms.txt generators, siteDescription fallback, composeTitle dedup
This commit is contained in:
+50
-1
@@ -52,4 +52,53 @@ stopce / bannerze cookies bierzesz z `getSystemPagePath({ role: privacyPolicy })
|
||||
```ts
|
||||
import { ALL_SYSTEM_PAGE_ROLES } from '@intecion/ipal-kit'
|
||||
// ['homepage', 'privacyPolicy', 'cookiePolicy']
|
||||
```
|
||||
```
|
||||
|
||||
## KRYTYCZNE: generateStaticParams dla [[...slug]] (SEO + head)
|
||||
|
||||
Trasa `[[...slug]]` (opcjonalny catch-all) BEZ `generateStaticParams` jest przez
|
||||
Next traktowana jako **dynamiczna** (`ƒ Dynamic`). W trybie dynamicznym z React 19
|
||||
serwer wysyła pusty `<head>`, a metadata streamuje na końcu `<body>` — crawlery
|
||||
(Lighthouse, Screaming Frog) nie widzą `<meta description>` w head → SEO spada.
|
||||
|
||||
**Z `generateStaticParams` trasa kompiluje się jako SSG (`●`)** → synchroniczny,
|
||||
kompletny `<head>` → SEO 100/100. To najsilniejsze rozwiązanie problemu
|
||||
metadata-w-head (mocniejsze niż samo ISR/htmlLimitedBots).
|
||||
|
||||
Plugin dostarcza gotowy generateStaticParams przez createContentHelpers:
|
||||
|
||||
```ts
|
||||
// lib/content.ts — dodaj do destrukturyzacji
|
||||
export const {
|
||||
getCachedPayload, getSettings, resolveRoute,
|
||||
generateStaticParams, // ← z pluginu
|
||||
sitemap, robots,
|
||||
} = createContentHelpers({ config, content: contentConfig, i18n: i18nConfig, baseUrl })
|
||||
|
||||
// app/(frontend)/[[...slug]]/page.tsx (albo [locale]/[[...slug]])
|
||||
export { generateStaticParams } from '@/lib/content'
|
||||
```
|
||||
|
||||
Helper automatycznie: pobiera pages + kolekcje treści, wyklucza homepage (→ root),
|
||||
drafty, 404/500, noindex; zwraca `{slug}[]` (jednojęzyczny) albo
|
||||
`{locale, slug}[]` (wielojęzyczny). Obsługuje slugi wielopoziomowe (`a/b` → `['a','b']`).
|
||||
|
||||
## PUŁAPKA: await searchParams deoptymalizuje ISR
|
||||
|
||||
W Next 15/16 `searchParams` to Promise. Odczyt `const { page } = await searchParams`
|
||||
w komponencie strony **deoptymalizuje ISR** — wymusza dynamiczne renderowanie dla
|
||||
tego requestu (traci cały zysk SSG/ISR + wraca problem metadata w body).
|
||||
|
||||
- **Strona BEZ paginacji** → NIE przekazuj/nie czytaj `searchParams` wcale:
|
||||
```ts
|
||||
export default async function Page({ params }) { // bez searchParams
|
||||
const { locale, slug } = await params
|
||||
const route = await resolveRoute(locale, slug ?? []) // bez page
|
||||
}
|
||||
```
|
||||
- **Strona Z paginacją** (archiwum) → czytaj searchParams, ale świadomie (ta trasa
|
||||
będzie dynamiczna). Rozważ osobną trasę dla archiwum z paginacją, żeby zwykłe
|
||||
strony zostały SSG.
|
||||
|
||||
Reguła: `searchParams` tylko tam, gdzie NAPRAWDĘ potrzebujesz (paginacja). Wszędzie
|
||||
indziej pomiń — inaczej tracisz SSG i SEO.
|
||||
Reference in New Issue
Block a user