dokümanlar sitesinin CMS düzenleme modu işlevselliğini korurken hızlı statik sayfa yüklemelerini nasıl gerçekleştirdiğini açıklar
Bu kılavuz, dokümanlar sitesinin CMS düzenleme modu işlevselliğini korurken hızlı statik sayfa yüklemelerini nasıl gerçekleştirdiğini açıklar.
Aynı içerik için iki rota kullanıyoruz:
app/
├── [...slug]/page.tsx # Üretim: force-static (hızlı)
└── preview/[...slug]/page.tsx # Düzenleme modu: force-dynamic (searchParams okur)
Bir proxy ara katmanı, düzenleme modu isteklerini şeffaf bir şekilde yeniden yazar:
Kullanıcı isteği: /en/headless/quickstart?edit_mode=true
↓
Proxy ?edit_mode=true değerini algılar
↓
Dahili yeniden yazma: /preview/en/headless/quickstart?edit_mode=true
↓
Dinamik rota düzenleme sarmalayıcılarıyla işler
Kullanıcı, URL'sinde asla /preview görmez - bu dahili bir yeniden yazmadır.
// app/[...slug]/page.tsx
export const dynamic = 'force-static';
export const revalidate = 60;
export default async function Page({ params }) {
// searchParams yok - sayfa tamamen statiktir
return
// app/preview/[...slug]/page.tsx
export const dynamic = 'force-dynamic';
export default async function PreviewPage({ params, searchParams }) {
// searchParams mevcut - edit_mode algılanabilir
return <ParametricRoutePage params={params
?edit_mode=true değerini okuyabilir// src/proxy.ts
export const proxy = async (request: NextRequest) => {
const { pathname, searchParams } = request.nextUrl;
const editMode = searchParams.get('edit_mode');
| Senaryo | Yanıt Süresi | İşleme |
|---|---|---|
| Üretim sayfası (önbellekte) | ~50-100ms | CDN'den statik |
| Üretim sayfası (bayat) | ~50-100ms + arka plan yenilemesi | Statik, ardından ISR |
| Düzenleme modu | ~500-1500ms | Dinamik SSR |
revalidate = 60 ayarı ISR'ı etkinleştirir. Bu, sayfaların her 60 saniyede bir yeniden hesaplandığı anlamına GELMEZ.
ISR, stale-while-revalidate desenini kullanır:
İstek gelir:
→ Önbellekteki sayfa < 60 sn mi? → Önbellekten sun (anında)
→ Önbellekteki sayfa > 60 sn mi? → Bayat önbelleği sun (anında)
+ bir sonraki istek için arka planda yeniden doğrula
İstek yok = Yeniden hesaplama yok. Asla.
Örnek:
60 saniyelik pencere bir güvenlik ağıdır. İdeal olarak, CMS içeriği değiştiğinde webhook'lar aracılığıyla isteğe bağlı yeniden doğrulama kullanırdık.
| Kullanım Durumu | URL | Kullanılan Rota |
|---|---|---|
| Normal gezinme | /en/headless/quickstart | Statik |
| CMS şablon oluşturucu | /en/headless/quickstart?edit_mode=true | Önizleme (yeniden yazma aracılığıyla) |
| Yapay zekâ blok önizlemesi | /en/headless/quickstart?ai_preview=1 | Önizleme (yeniden yazma aracılığıyla) |
Basit yaklaşım (force-static yok, önizleme rotası yok) işe yarar ama yavaştır:
// Basit yaklaşım - çalışır ama istek başına ~1-2 sn
export default async function Page({ params, searchParams }) {
return <ParametricRoutePage params={params} searchParams={searchParams} />;
}
Bu, her istekte dinamik olarak render eder. Birçok sayfaya sahip bir dokümantasyon sitesi için bu şu anlama gelir:
Çift rotalı mimari bize her iki dünyanın en iyisini sunar: okurlar için statik hız, editörler için dinamik işlevsellik.