legt uit hoe de documentatiesite snelle statische paginaladingen bereikt terwijl de CMS-bewerkmodus behouden blijft
Deze gids legt uit hoe de documentatiesite snelle statische paginaladingen bereikt terwijl de CMS-bewerkmodus behouden blijft.
We gebruiken twee routes voor dezelfde inhoud:
app/
├── [...slug]/page.tsx # Productie: force-static (snel)
└── preview/[...slug]/page.tsx # Bewerkmodus: force-dynamic (leest searchParams)
Een proxy-middleware herschrijft bewerkingsmodus-aanvragen transparant:
Gebruiker vraagt: /en/headless/quickstart?edit_mode=true
↓
Proxy detecteert ?edit_mode=true
↓
Interne herschrijving naar: /preview/en/headless/quickstart?edit_mode=true
↓
Dynamische route rendert met bewerkingswrappers
De gebruiker ziet /preview nooit in de URL - het is een interne herschrijving.
// app/[...slug]/page.tsx
export const dynamic = 'force-static';
export const revalidate = 60;
export default async function Page({ params }) {
// Geen searchParams - pagina is volledig statisch
// app/preview/[...slug]/page.tsx
export const dynamic = 'force-dynamic';
export default async function PreviewPage({ params, searchParams }) {
// searchParams beschikbaar - kan edit_mode detecteren
return <ParametricRoutePage params={params
?edit_mode=true uit de URL lezen// src/proxy.ts
export const proxy = async (request: NextRequest) => {
const { pathname, searchParams } = request.nextUrl;
const editMode = searchParams.get('edit_mode');
| Scenario | Responstijd | Rendering |
|---|---|---|
| Productiepagina (in cache) | ~50-100 ms | Statisch vanaf CDN |
| Productiepagina (verouderd) | ~50-100 ms + achtergrondvernieuwing | Statisch, daarna ISR |
| Bewerkmodus | ~500-1500 ms | Dynamische SSR |
De instelling revalidate = 60 schakelt ISR in. Dit betekent NIET dat pagina's elke 60 seconden opnieuw worden berekend.
ISR gebruikt een stale-while-revalidate-patroon:
Aanvraag komt binnen:
→ Is de gecachte pagina < 60 s oud? → Serveer uit de cache (direct)
→ Is de gecachte pagina > 60 s oud? → Serveer verouderde cache (direct)
+ valideer op de achtergrond voor het volgende verzoek
Geen aanvragen = geen herberekening. Nooit.
Voorbeeld:
Het venster van 60 seconden is een vangnet. Idealiter gebruiken we on-demand revalidatie via webhooks wanneer CMS-inhoud verandert.
| Gebruiksscenario | URL | Gebruikte route |
|---|---|---|
| Normaal browsen | /en/headless/quickstart | Statisch |
| CMS-templatebouwer | /en/headless/quickstart?edit_mode=true | Preview (via herschrijving) |
| AI-blokpreview | /en/headless/quickstart?ai_preview=1 | Preview (via herschrijving) |
De eenvoudige aanpak (geen force-static, geen preview-route) werkt maar is traag:
// Eenvoudige aanpak - werkt maar ~1-2 s per verzoek
export default async function Page({ params, searchParams }) {
return <ParametricRoutePage params={params} searchParams={searchParams} />;
}
Dit rendert dynamisch bij elk verzoek. Voor een documentatiesite met veel pagina's betekent dit:
De architectuur met dubbele route geeft ons het beste van twee werelden: statische snelheid voor lezers, dynamische functionaliteit voor redacteuren.