All Systems Operational
Powered By
profound-logo
profound-logoProfound CMS
⌘K
Admin

Duzenleme Modu Destegiyle Statik Isleme

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

Continue Reading
Previous‹Yönetici paneli proxy kurulumuNextŞablon Oluşturucuda Betik Yazma›

Hibrit

Renderer ProjesiParametrik YönlendirmeBileşenler TürleriSseYönetici paneli proxy kurulumuDuzenleme Modu Destegiyle Statik IslemeŞablon Oluşturucuda Betik YazmaCreate Profound Next

Başsız

Hızlı başlangıçJson Ve Claude KodBileşen Zod Çekme

Mcp

Mcp

Cms Özellikleri

Özellik Belgeler ŞablonuÖzellik Şablon OluşturucuÖzellik ÇeviriciÖzellik Organizasyon

Motivasyon

Bizim yaklaşımımız

Terminoloji

Hibrit Vs Headless

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.

Çift Rotalı Mimari

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.

Nasıl Çalışır

Üretim Yolu (Varsayılan)

// 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
  • Sayfalar derleme sırasında önceden oluşturulur
  • CDN uç önbelleğinden anında sunulur
  • Bir güvenlik ağı olarak her 60 saniyede bir (ISR) yeniden doğrulanır

Düzenleme Modu Yolu

// 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
  • Her istekte yeniden işlenir
  • URL'den ?edit_mode=true değerini okuyabilir
  • CMS düzenlenebilir sarmalayıcılar ve blok konturlarıyla render eder

Proxy Yeniden Yazması

// src/proxy.ts
export const proxy = async (request: NextRequest) => {
  const { pathname, searchParams } = request.nextUrl;

  const editMode = searchParams.get('edit_mode');

Performans Karşılaştırması

SenaryoYanıt Süresiİşleme
Üretim sayfası (önbellekte)~50-100msCDN'den statik
Üretim sayfası (bayat)~50-100ms + arka plan yenilemesiStatik, ardından ISR
Düzenleme modu~500-1500msDinamik SSR

ISR'ı (Artımlı Statik Yenileme) Anlamak

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:

  • Sayfa 10:00'da önbelleğe alındı
  • 15:00'e kadar ziyaretçi yok
  • 15:00'teki ilk ziyaretçi anında bayat önbelleği alır
  • Arka planda yenileme gerçekleşir, bir sonraki ziyaretçi taze içeriği alır

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.

Her Rotayı Ne Zaman Kullanmalı

Kullanım DurumuURLKullanılan Rota
Normal gezinme/en/headless/quickstartStatik
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)

Neden Sadece Dinamik İşlemeyi Kullanmayalım?

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:

  • Her sayfada soğuk başlangıçlar
  • CDN uç önbelleği avantajı yok
  • Milisaniyelere karşı 1-2 saniyelik yükleme süreleri

Ç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.

<
ParametricRoutePage
params
={
params
} />;
}
}
searchParams
={
searchParams
} />;
}
const
aiPreview
=
searchParams.
get
(
'ai_preview'
);
// edit_mode veya ai_preview mevcutsa ve pathname '/preview' ile başlamıyorsa önizleme rotasına yeniden yaz
if ((editMode === 'true' || editMode === '1' || aiPreview) && !pathname.startsWith('/preview')) {
const url = request.nextUrl.clone();
url.pathname = `/preview${pathname}`;
return NextResponse.rewrite(url);
}
return NextResponse.next();
};