Ulaşım
- Adres: Kazımdirik Mah. 296.Sokak Ofis:1 No:314 Folkart Time | Bornova / İzmir
- Telefon:
0505 532 36 38 - eMail: admin@alestaweb.com
React dünyasında uzun süredir tek bir cevap vardı: tam yığın bir uygulama mı yapacaksın, Next.js kur. 2026'da bu tablo değişti. TanStack Start, TanStack Router'ın üzerine kurulu, uçtan uca tip güvenli (type-safe) bir React framework olarak v1 sürümüne ulaştı ve ciddi bir alternatif haline geldi. Alesta Web olarak bu rehberde kurulumdan ilk sayfaya, server function yazmaktan Next.js ile dürüst bir karşılaştırmaya kadar her adımı örnek kodla anlatıyoruz. Spoiler: her proje için doğru seçim değil, ama bazı projeler için açık ara daha iyi.
TanStack Start, TanStack ekosisteminin (TanStack Query, Table, Router ile tanıdığınız ekip) tam yığın React çerçevesi. Temeli üç parça üzerine oturuyor:
Sunduğu özellikler listesi tanıdık gelecek: tam doküman sunucu tarafı render (full-document SSR), streaming, server functions, API rotaları, middleware ve tam yığın derleme. Peki farkı ne?
TanStack Start'ın sloganı özetle şu: "sadece React". React Server Components zorunlu değil, "use client" direktifi yok, derleyici sihri yok. Bileşenlerinizi her zaman yazdığınız gibi yazarsınız; framework üstüne tam yığın yetenekleri ekler. Yeni bir zihinsel model öğrenmek zorunda kalmazsınız.
Bu tercih hem gücü hem de sınırı. React Server Components'ın getirdiği sunucu tarafı veri erişimi kolaylığını istiyorsanız TanStack Start size bunu (henüz) tam olarak vermez. Buna karşılık, RSC'nin getirdiği karmaşayı da yaşamazsınız.
Bu rehber yalnızca TanStack Start çerçevesine odaklanıyor. Query, Table, Router ve diğer TanStack araçlarının birbiriyle nasıl çalıştığını merak ediyorsanız daha önce yayınladığımız TanStack ekosistemi genel bakış yazımıza göz atabilirsiniz.
TanStack Start v1.0 sürümü 2026'nın ilk çeyreğinde yayınlandı ve üretime hazır kabul ediliyor. Resmî dokümantasyonun bazı sayfaları hâlâ sürüm adayı (release candidate) dönemine ait ifadeler taşıyor; bu bir tutarsızlık gibi görünse de API kararlı durumda. Alesta Web olarak değerlendirmemiz şu: gerçek uygulamalar için yeterince olgun, ama ekosistem Next.js kadar geniş değil.
# Resmi CLI ile npx @tanstack/cli@latest create # Sorulara cevap verin: proje adi, TypeScript, paket yoneticisi cd projem npm install npm run dev
Geliştirme sunucusu ayağa kalktığında Vite'ın bilindik hızını görürsünüz. Soğuk başlangıç (cold start) genellikle bir saniyenin altında.
src/
routes/
__root.tsx # kok layout
index.tsx # /
posts.tsx # /posts (layout)
posts.index.tsx # /posts
posts.$postId.tsx # /posts/:postId
server/
db.ts
router.tsx
vite.config.ts
Dosya adlandırması nokta ile ayrılıyor: posts.$postId.tsx dosyası /posts/:postId rotasına karşılık geliyor. $ işareti dinamik parametreyi belirtir. Klasör tabanlı yapı da destekleniyor; tercih size kalmış.
Framework'ün asıl iddiası burada. Rotalarınız derleme zamanında doğrulanıyor. Yani $postId yerine yanlışlıkla $postID yazarsanız, siteyi açıp 404 görmeden önce editörünüz uyarıyor.
// src/routes/posts.$postId.tsx
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params }) => {
return fetchPost(params.postId) // params.postId: string
},
component: PostPage,
})
function PostPage() {
const post = Route.useLoaderData() // tipi otomatik cikarilir
const { postId } = Route.useParams()
return (
<article>
<h1>{post.title}</h1>
<p>{post.body}</p>
</article>
)
}
Route.useLoaderData() çağrısının dönüş tipi, loader fonksiyonunuzun dönüşünden otomatik türetilir. Elle tip yazmanıza gerek yok; as Post gibi zorlamalara da.
Bu, çoğu framework'ün zayıf bıraktığı bir alan. TanStack Start'ta URL sorgu parametreleri şema ile doğrulanır:
import { createFileRoute } from '@tanstack/react-router'
import { z } from 'zod'
const searchSchema = z.object({
page: z.number().int().min(1).catch(1),
sirala: z.enum(['tarih', 'baslik']).catch('tarih'),
})
export const Route = createFileRoute('/posts/')({
validateSearch: searchSchema,
component: PostList,
})
function PostList() {
const { page, sirala } = Route.useSearch() // number, 'tarih'|'baslik'
// ...
}
Yönetim panelleri ve filtreli listelerde bu özellik zaman kazandırıyor. Elle parseInt(searchParams.get('page') ?? '1') yazmak ve her sayfada aynı doğrulamayı tekrarlamak zorunda kalmıyorsunuz. Alesta Web olarak veri yoğun panellerde en çok fayda gördüğümüz nokta burası oldu.
import { Link } from '@tanstack/react-router'
<Link to="/posts/$postId" params={{ postId: '42' }}>
Yaziyi ac
</Link>
// Olmayan bir rota yazarsaniz: DERLEME HATASI
// Eksik parametre birakirsaniz: DERLEME HATASI
Sunucuda çalışması gereken kodu istemciden doğrudan çağırıyormuş gibi yazarsınız. Framework araya HTTP katmanını kendisi koyar.
import { createServerFn } from '@tanstack/react-start'
import { db } from '~/server/db'
export const getPosts = createServerFn({ method: 'GET' })
.handler(async () => {
// Bu kod SADECE sunucuda calisir
return db.post.findMany({ orderBy: { createdAt: 'desc' } })
})
// Istemciden cagirma
const posts = await getPosts() // tip: Post[]
import { z } from 'zod'
const yeniYazi = z.object({
baslik: z.string().min(3),
icerik: z.string().min(10),
})
export const addPost = createServerFn({ method: 'POST' })
.validator((veri: unknown) => yeniYazi.parse(veri))
.handler(async ({ data }) => {
return db.post.create({ data })
})
Server function'lar istemciden çağrılabilen ağ uç noktalarıdır. validator katmanını atlamayın ve yetkilendirme kontrolünü handler içinde yapın. "Bu fonksiyonu sadece admin sayfasından çağırıyorum" varsayımı güvenlik değildir — uç nokta herkese açıktır. Bu, tüm RPC tabanlı yaklaşımların ortak tuzağıdır.
import { createMiddleware } from '@tanstack/react-start'
const authMiddleware = createMiddleware()
.server(async ({ next, context }) => {
const user = await getUserFromSession()
if (!user) throw new Error('Yetkisiz erisim')
return next({ context: { user } })
})
export const deletePost = createServerFn({ method: 'POST' })
.middleware([authMiddleware])
.validator((d: unknown) => z.object({ id: z.string() }).parse(d))
.handler(async ({ data, context }) => {
if (context.user.role !== 'admin') throw new Error('Yetki yok')
return db.post.delete({ where: { id: data.id } })
})
TanStack Start, TanStack Query ile doğal biçimde çalışır. Rota loader'ında ön yükleme yapıp bileşen içinde Query ile devam edebilirsiniz:
export const Route = createFileRoute('/posts/$postId')({
loader: ({ context, params }) =>
context.queryClient.ensureQueryData(
postQueryOptions(params.postId)
),
component: PostPage,
})
function PostPage() {
const { postId } = Route.useParams()
const { data: post } = useSuspenseQuery(postQueryOptions(postId))
return <h1>{post.title}</h1>
}
Bu kalıbın güzelliği şu: sayfa sunucuda render edilirken veri hazır olur (SEO ve ilk yükleme için iyi), istemci tarafında ise Query'nin önbellek, yeniden doğrulama ve arka plan yenileme yetenekleri devreye girer.
Topluluk tarafından yayınlanan bir kıyaslamada, veri yoğun bir uygulamanın TanStack Start'a taşınmasıyla saniyedeki istek sayısında yaklaşık 5,5 kat, ortalama gecikmede yaklaşık 10 kat iyileşme raporlandı. Bu rakamları mutlak gerçek olarak almayın — kıyaslamalar test senaryosuna çok bağlıdır. Ancak yönü doğru: RSC yükü olmayan, istemci öncelikli bir mimari sunucu tarafında daha az iş yapar.
| Kriter | TanStack Start | Next.js |
|---|---|---|
| Tip güvenliği | Uçtan uca, rota ve search params dahil | İyi, ama rota tipleri sonradan eklendi |
| React Server Components | Deneysel | Olgun, varsayılan model |
| Öğrenme eğrisi | React biliyorsanız düşük | Sunucu/istemci ayrımı öğrenmeyi gerektirir |
| Ekosistem | Yeni, sınırlı | Çok geniş |
| Dağıtım esnekliği | Nitro sayesinde çok geniş | Geniş, ama bazı özellikler platforma bağlı |
| Statik/içerik siteleri | Yeterli | Daha güçlü (ISR, image optimizasyonu) |
| Benimsenme | React geliştiricilerinin yaklaşık %15'i | Fiili standart |
Buradan çıkarılacak sonuç "biri diğerinden iyi" değil. İki framework farklı problemleri çözüyor. Next.js içerik ve pazarlama sitelerinde, görsel optimizasyonu ve artımlı statik üretim gibi olgun araçlarıyla önde. TanStack Start ise veri yoğun, oturum açmalı, karmaşık filtreleme ve durum yönetimi olan uygulamalarda parlıyor.
* Yonetim paneli / dashboard / ic arac yaziyorsaniz * Karmasik filtre ve URL durumu yonetiyorsaniz * TanStack Query'yi zaten yogun kullaniyorsaniz * Tip guvenligini pazarlik konusu yapmiyorsaniz * RSC'nin zihinsel yukunu istemiyorsaniz * Farkli platformlara dagitim esnekligi ariyorsaniz
* Icerik/blog/e-ticaret sitesi yapiyorsaniz * SEO ve statik uretim on planda ise * Genis eklenti ekosistemine ihtiyaciniz varsa * Ekibiniz zaten Next.js biliyorsa * React Server Components'i bugun kullanmak istiyorsaniz * Ise alim havuzunun genisligi onemliyse
Alesta Web olarak pratikte uyguladığımız ayrım şu: müşteriye bakan içerik siteleri bir tarafta, işletme içi veri uygulamaları diğer tarafta. Aynı şirket için ikisini farklı çerçevelerle yapmak hiç de tuhaf değil.
next/image karşılığı için harici çözüm gerekir.Yeni bir framework'ü ilk kez üretimde kullanacaksanız, kritik olmayan bir iç araçla başlayın. Ekip framework'ü tanısın, tuzakları görsün. Müşteriye giden ana projeyi ilk deney tahtası yapmak, teknoloji seçimi kadar önemli bir yönetim hatasıdır.
Bu rehberdeki bilgiler resmî dokümantasyon ve topluluk kaynaklarından derlenmiş, örnek kodlar Alesta Web ekibi tarafından yapılandırılmıştır:
TanStack Start, React tarafında yıllardır eksikliği hissedilen bir şeyi getiriyor: gerçekten uçtan uca tip güvenliği ve öngörülebilir bir zihinsel model. Alesta Web olarak değerlendirmemiz net — veri yoğun uygulamalarda ciddi bir seçenek, içerik sitelerinde ise henüz Next.js'in yerini almıyor.
Hızlı Özet / Quick Summary:
Faydalı Bağlantılar / Useful Links:
React tabanlı bir panel ya da tam yığın uygulama planlıyor ve hangi çerçeveyle ilerleyeceğinize karar veremiyorsanız, Alesta Web ekibi alestaweb.com üzerinden projenizin ihtiyacına göre değerlendirme yapabilir.
© 2026 Alesta Web — Tüm hakları saklıdır.