Tarayıcı mı Sunucu mu Render Ediyor?
React 19, framework’ün tarihindeki en büyük mimari dönüşümlerden birini başlattı.
Server Components (RSC) artık resmi olarak stabil sürümde!
Artık bazı bileşenler hiç JavaScript bundle’ına dahil olmadan, doğrudan sunucuda render ediliyor.
Kulağa sihir gibi geliyor, değil mi? ✨
Ama aslında bu, modern web’in doğal evrimi. Gel, adım adım ne olduğunu anlayalım.
Klasik React Modeli (Client Components)
React’in bugüne kadar kullandığımız yapısı tamamen tarayıcı odaklıydı. Her bileşen JS bundle’ına dahil olur, hydration sonrası etkileşimli hale gelirdi.function Hello() {
return <h1>Hello Client!</h1>
}
Bu bileşen, kullanıcıya HTML olarak gönderilse bile, tarayıcıda JS olarak yeniden yüklenmek zorundaydı. Yani HTML + JS = React uygulaması.⚠️ Sorun: Büyük projelerde JS bundle’ı devasa boyutlara ulaşır ve sayfa yüklenme süresi uzar.
Yeni Model: Server Components (RSC)
React 19 ile birlikte artık bazı bileşenler tamamen sunucuda render ediliyor ve tarayıcıya yalnızca statik HTML çıktısı gidiyor. Bu bileşenler, JS bundle’a hiç eklenmiyor!// Server Component
export default async function Posts() {
const posts = await fetch('https://api.example.com/posts').then(r => r.json())
return (
<ul>
{posts.map(post => <li key={post.id}>{post.title}</li>)}
</ul>
)
}
Bu bileşen tarayıcıya HTML olarak gönderilir, JS olarak değil. Kullanıcı sayfayı açtığında, bu bileşen zaten render edilmiştir -- hydrate edilmeye gerek yoktur.Server Component’in Özellikleri
| Özellik | Açıklama |
|---|---|
| Çalışma Yeri | Sunucu |
| Tarayıcıya JS Gönderir mi? | Hayır |
| Veri Çekebilir mi? | Evet (fetch, DB, API) |
| Hook Kullanımı | Sadece statik hook’lar (ör. useMemo yok) |
| Re-render | Gerektiğinde server-side yeniden oluşturulur |
Client ve Server Component’lerin Birlikte Kullanımı
React 19, iki dünyanın en iyisini birleştiriyor. Artık aynı projede hem client hem server bileşenleri kullanılabiliyor.// 📁 app/page.jsx
import Posts from './Posts.server'
import LikeButton from './LikeButton.client'
export default function Page() {
return (
<main>
<Posts />
<LikeButton />
</main>
)
}
Posts.server→ Server Component (veri çeker, HTML döner).LikeButton.client→ Client Component (etkileşim içerir).
RSC Nasıl Çalışıyor?
Server Components, React’in yeni Flight protokolü üzerinden işliyor. Yani render edilen bileşenler, tarayıcıya JSON benzeri özel bir formatta gönderiliyor. Client tarafında bu veri çözülüp HTML’e dönüştürülüyor.Bu yaklaşım sayesinde:
- JS bundle boyutu küçülür.
- Tarayıcıda gereksiz render azalır.
- SSR + SPA performans dengesi kurulur.
💡 “Render’ı bölmek” artık sadece framework’ün değil, tarayıcı mimarisinin de doğal parçası haline geliyor.
Örnek: Gerçek Hayat Kullanımı (Next.js 15)
React 19’un Server Components mimarisi, Next.js 15 içinde varsayılan hale geliyor.app/ dizinindeki bileşenler otomatik olarak server-side render edilir.// app/posts/page.jsx
export default async function Page() {
const posts = await getPosts()
return (
<>
<h1>Son Gönderiler</h1>
<ul>
{posts.map(p => <li key={p.id}>{p.title}</li>)}
</ul>
</>
)
}
Buradaki bileşenler client’a hiç JS göndermeden çalışır. Yalnızca etkileşim gereken component’ler use client direktifiyle işaretlenir:'use client'
export function LikeButton() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(c => c + 1)}>❤️ {count}</button>
}
Sonuç: sayfa 3 KB JS ile yüklenir, çünkü sadece LikeButton client tarafında çalışıyor.
Artılar ve Eksiler
✅ Avantajlar
- JS bundle boyutu ciddi oranda azalır.
- Server-side veri işlemleri daha hızlı.
- Güvenlik artar (API anahtarları client’a gitmez).
- SEO mükemmel hale gelir (HTML tamamen hazır).
Dikkat Edilmesi Gerekenler
useEffect,useStategibi hook’lar server bileşenlerde kullanılamaz.- Client bileşenleriyle veri paylaşımı props üzerinden yapılmalı.
- SSR cache yönetimi önem kazanır.
Server Components ile Veri Akışı
Server bileşenler async çalışabildiği için, fetch işlemleri doğrudan bileşenin içinde yapılır -- artıkuseEffect gerekmez.export default async function ProductList() {
const products = await fetch('/api/products').then(r => r.json())
return <div>{products.map(p => <Product key={p.id} {...p} />)}</div>
}
Artık veri çekme ve render işlemi tek adımda birleşiyor.Bu yapı, React Query veya SWR gibi kütüphanelerin yükünü azaltır.
RSC’nin Performans Etkisi
- Ortalama %30 daha hızlı ilk render (TTFB).
- %40 daha küçük bundle boyutu.
- Hydration süresi kısaldığı için CPU kullanımı azalır.
React 19 ile Gelen Ek Yenilikler
use()hook → async veriyi component içinde doğrudan await etme.ActionAPI → form submit’leri server component üzerinden yönlendirme.Suspenseartık fetch işlemleriyle tam entegre.
export default function Page() {
const data = use(fetchData()) // doğrudan await!
return <div>{data.title}</div>
}
Yani artık fetch → state → effect → render zinciri yerine tek satırlık kod var.Sonuç
React 19’un Server Components mimarisi, frontend ve backend arasındaki sınırları kaldırıyor. Tarayıcıya giden JavaScript azalıyor, sayfalar hızlanıyor, geliştirici deneyimi sadeleşiyor.Kısaca:
- Server Components = Daha az JS, daha fazla hız.
- Client Components = Etkileşim ve animasyon.
- İkisini birlikte kullanmak = Modern web’in geleceği.