Cansu Arı Logo
Blog
Nedir?

React 19 ve Server Components: Tarayıcı mı Sunucu mu Render Ediyor?

React 19 ile gelen Server Components, UI mimarisini kökten değiştiriyor. Artık bazı bileşenler tarayıcıya hiç gönderilmiyor -- daha az JS, daha fazla performans!

  • #React
  • #React 19
  • #Performans

Skip to content

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

ÖzellikAçıklama
Çalışma YeriSunucu
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-renderGerektiğinde server-side yeniden oluşturulur
Kısaca: Server Components = "Veriyi sunucuda işleyen, tarayıcıya HTML gönderen bileşenler."

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).
React bu yapıyı otomatik olarak ayrıştırır: Server bileşenleri render edilir, client bileşenleri hydrate edilir.

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, useState gibi hook’lar server bileşenlerde kullanılamaz.
  • Client bileşenleriyle veri paylaşımı props üzerinden yapılmalı.
  • SSR cache yönetimi önem kazanır.
En iyi strateji: UI’nin statik kısımlarını server, interaktif kısımlarını client bileşen olarak ayırmak.

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ık useEffect 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.
Benchmark testlerinde RSC yapısına sahip uygulamaların mobilde %25 daha az pil tükettiği görülüyor. ⚡

React 19 ile Gelen Ek Yenilikler

  • use() hook → async veriyi component içinde doğrudan await etme.
  • Action API → form submit’leri server component üzerinden yönlendirme.
  • Suspense artı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.

All tags
  • React
  • React 19
  • Performans