ViraStack
  • Akademi
  • Hakkında
  • Destek
Genel BakışKaynaklarKatkı
ViraStack

Frontend geliştiricileri için DX odaklı araç seti: starter’lar, ajan kuralları, form hook’ları ve rehber.

Ürünler

  • ViraStack Start
  • ViraStack AI
  • ViraStack Mask
  • ViraStack Password
  • ViraStack Guide

Keşfet

  • Akademi
  • Hakkında
  • Marka
  • Destek

© 2026 ViraStack.

Açık kaynak · MIT

Mimari ve Ölçeklenebilirlik

01 / 09

Klasör Yapısı ve İsimlendirme

Feature-based yapı, dosya isimlendirme ve import kuralları.

Klasör yapısının işi basit: bir şeyi değiştireceğiniz zaman ilgili dosyaları tek yerde bulmak. Dosyaları türüne göre (components/, hooks/, utils/) değil, ait oldukları özelliğe göre (sepet, ürün listesi, ödeme) gruplarsanız bir özelliği değiştirmek tek klasörde biter. İlke Kent C. Dodds'ın colocation yazısındaki gibi: kodu ilgili olduğu yere olabildiğince yakın koyun.1

Bu rehber, Next.js ve TanStack Start'ta aynı şekilde çalışan feature-based yapıyı, isimlendirme ve import kurallarını anlatıyor.

Tür mü, özellik mi?

Türe göreÖzelliğe göre
Yapıcomponents/, hooks/, stores/ altında her özelliğin dosyasıfeatures/cart/ altında sepetin tüm dosyaları
Sepeti değiştirirkenBirkaç büyük klasörde dosya aranırTek klasörde biter
BüyüdükçeBir özellik birçok klasöre dağılırÖzellik tek yerde kalır

Türe göre dizilim Next.js ve Nuxt gibi framework'lerde başlaması kolay olduğu için yaygın. Ama proje büyüdükçe bir özelliği değiştirmek birçok büyük klasöre dokunmak demek oluyor.2

Özellik bazlı dizilimi birbirinden bağımsız kaynaklar öneriyor. bulletproof-react kodun büyük kısmını features/ altında toplamayı, özellik koduyla ortak bileşenlerin karışmasını önlemek için öneriyor.3 Feature-Sliced Design aynı fikri daha katı bir metodolojiye çeviriyor: kod katmanlara, katmanlar da yüksek uyumlu dilimlere ayrılıyor.4

Konferans sahnesinde de konuşuluyor. Conf42'de Aleksandr Guzenko, bağımlılıkları sınırlayarak mimari borcun birikmesinin nasıl önlenebileceğini bu metodolojiyle anlatıyor.5 HolyJS'te Alexander Morgunov ise yöntemin kavramlarını (modülerlik, public API, altyapı ile iş mantığını ayırma) ve zayıf yanlarını (modüller arası çapraz import, yetersiz dokümantasyon, katmanlara dağılan kod) birlikte ele alıyor.6 Yani yaklaşım tartışmasız bir reçete değil, ödünleşimleri olan bir tercih.

Üst düzey yapı

ViraStack da bu yapıyı kullanıyor. Şablonunun sadeleştirilmiş hali:7

src/
├── app/ | routes/   # yönlendirme
├── features/        # özellik modülleri
├── components/      # ortak bileşenler (ui/, layout/, shared/)
├── hooks/           # ortak hook'lar
├── lib/             # yapılandırılmış kütüphane örnekleri (API istemcisi, date-fns)
├── helpers/         # paket import'u olmayan saf fonksiyonlar
├── schemas/
├── stores/
├── types/
├── constants/
├── config/
├── providers/
├── styles/
└── env.ts

Yeni bir klasör açmadan önce mevcutlardan birine uyup uymadığına bakın.7

Asıl karar, proje kodunun yönlendirme klasörünün dışında durması:

Next.jsTanStack Start
Yönlendirme klasörüapp/src/routes/
Framework'ün sunduğu seçeneklerProje kodu app dışında, app içinde ya da rotaya göre bölünmüş olabilir8- önekli dosya ve klasörler rota ağacına girmez, rota klasörlerinde kod barındırmak için kullanılır9
Framework'e ait özel adlarpage, layout, route, _klasör, (grup), [param]8__root, $param, _ öneki (pathless layout), - öneki9

Next.js yapı konusunda görüş bildirmiyor, seçtiğiniz stratejide tutarlı kalmanızı istiyor.8 Bu yapıda features/, components/ gibi klasörler app/ ve routes/ ile aynı seviyede duruyor, yani "proje kodunu app dışında tut" stratejisi uygulanıyor.7 src/ klasörü Next.js'te isteğe bağlı, uygulama kodunu kök dizindeki yapılandırma dosyalarından ayırıyor.8

Feature klasörünün içi

features/cart/
├── api/          # istek fonksiyonları ve API hook'ları
├── components/
├── hooks/
├── schemas/      # Zod şemaları
├── stores/
├── types/
└── index.ts

Bunların yanında constants/, data/ ve helpers/ de olabilir.7 Her özellikte hepsi gerekmez, yalnızca ihtiyaç duyduğunuz klasörü açın.3

Test dosyası, test ettiği dosyanın yanında durur (cart-summary.test.tsx). Uçtan uca testler ise src/ yapısına bağlı olmadığı için proje kökünde kalır.1

İpucu

Klasör adı tür olabilir, dosya adı alanı anlatsın. Feature-Sliced Design, types/, components/, utils/ gibi genel klasör adlarını ve types.ts, utils.ts, helpers.ts gibi genel dosya adlarını sorun sayıyor: farklı alanların kodu aynı dosyada birikiyor.2 helpers/utils.ts yerine helpers/format-price.ts yazın.

Ortak kod ne zaman global'e çıkar?

Her şey features/[özellik]/ içinde başlar. İkinci bir özellik aynı koda ihtiyaç duyunca kod global src/ katmanına (components/, lib/, hooks/) taşınır.

Neden taşınır? Çünkü özellikler birbirinden import etmez. Özellikleri birleştirmek sayfa (uygulama) katmanının işidir, böylece her özellik bağımsız kalır.3 Feature-Sliced Design de aynı katmandaki dilimlerin birbirini kullanmasını yasaklıyor.4 Akış tek yönlüdür: ortak kod → özellikler → uygulama.3

Feature içinde kalırGlobal katmana çıkar
features/cart/components/cart-summary.tsxcomponents/ui/button.tsx
Sepet toplamını hesaplayan fonksiyonPara birimi formatlayan fonksiyon (helpers/)
Sepet API hook'larıPaylaşılan API istemcisi (lib/api.ts)

helpers/ paket import'u içermeyen saf fonksiyonlara, paket kullanan yapılandırılmış örnekler ise lib/ altına gider.7

İpucu

Neden ikinci kullanımda, üçüncüde değil? Bilinen "Rule of Three" kuralı şöyle işler: ilk seferde yazarsınız, ikincide tekrarı fark edip yine de kopyalarsınız, üçüncüde ortak koda çıkarırsınız.10 Bu yapıda kural daha sıkı: iki özellik aynı koda ihtiyaç duyuyorsa kod global katmana taşınır, çünkü özellikler birbirini import edemez.7

Uyarı

Benzeyen her kod aynı kod değildir. Sandi Metz'in tarif ettiği döngü: biri tekrarı ortak fonksiyona çıkarır, sonra gelen yeni ihtiyaç için fonksiyona parametre ve koşul eklenir, ortak kod anlaşılmaz hale gelir.11 Metz'e göre tekrar, yanlış soyutlamadan çok daha ucuz.12 Dan Abramov'un The Wet Codebase konuşması aynı tuzağı bir hikâye olarak anlatıyor: kopyalamayı önlemek için çıkarılan ortak soyutlama özel durumlar biriktirip genelleşiyor. Önerisi, kötü soyutlamayı satır içine almaktan çekinmemek.13 Taşımadan önce sorun: iki kullanım aynı kuralı mı paylaşıyor, yoksa tesadüfen mi benziyor? Tesadüfi tekrarı fazla erken temizlemek kodu kırılganlaştırır.10

Import kuralları

1. Alias kullanın, ../ kullanmayın

// ❌ Hangi klasördeyseniz ona göre değişir
import { Button } from '../../../components/ui/button'

// ✅ Her dosyada aynı
import { Button } from '@/components/ui/button'
  • Next.js: create-next-app varsayılan olarak @/* alias'ını kurar.14

  • TanStack Start: Alias varsayılan gelmez. Dokümandaki örnek ~/* kullanıyor. Vite 8 ve sonrasında tsconfig yollarını okuyan yerleşik destek var (varsayılan kapalı), Vite 7 ve öncesi için vite-tsconfig-paths eklentisi gerekiyor.15

  • Zorlamak için: import/no-relative-parent-imports ESLint kuralı ../ ile başlayan import'ları yasaklar. Kardeş (./b) ve alt klasör (./lib/a) import'ları serbesttir.16

2. Özellikler arası import yok

Özellikleri sayfada birleştirin:

// app/products/[id]/page.tsx
import { ProductDetail } from '@/features/products'
import { AddToCartButton } from '@/features/cart'

Her özellik, dışarıya açtığı parçaları kökündeki index.ts ile dışa verir (aşağıda index.ts bölümüne bakın).

features/products içinden features/cart'a import yoktur. Bu kuralı ESLint ile zorlamayı Component ve Kod Organizasyonu rehberinde göreceksiniz.

3. index.ts: giriş kapısı mı, yük mü?

Feature-based yapılarda her özelliğin köküne genellikle bir index.ts konur. Bu konuda iki görüş var:

Tek giriş (public API)Doğrudan import
SavunanlarFeature-Sliced Design: index dosyası özelliğin dışa açık sözleşmesi17bulletproof-react: Vite'ta tree shaking ve performans sorunları nedeniyle doğrudan import3. Marvin Hagemeister: barrel her yere yayıldıysa hepsini silin18. TkDodo: uygulama kodunda barrel'ı bırakın19
KazancıÖzelliğin iç yapısı değişince dışarıdaki import'lar bozulmaz17Daha hızlı araçlar, net bağımlılıklar20
MaliyetiDöngüsel import riski ve büyük projelerde yavaşlama1719Dosya taşımak her import'u etkiler, kapsülleme azalır20

Ölçümler büyük projelerde net. Marvin Hagemeister, barrel'ın her klasöre yayıldığı projelerde hepsini silmenin birçok işi %60-80 hızlandırabileceğini yazıyor. Birkaç barrel'ın ise genelde sorun olmadığını da ekliyor.18 TkDodo kendi Next.js projesinde bir sayfanın yüklediği modül sayısını yaklaşık 11 binden 3,5 bine indirdi (%68).19 Atlassian, Jira frontend'inde commit başına build dakikalarında %75 düşüş ölçtü, karşılığında paketlerin public API'sini kaybettiklerini de not ediyor.20

İpucu

Orta yol:

  • Özellik kökünde tek ve ince bir index.ts: yalnızca adlandırılmış re-export, export * yok.17

  • Özelliğin içindeki alt klasörlerde (components/index.ts gibi) ayrı barrel yok.17

  • Aynı özelliğin dosyaları birbirini index.ts üzerinden değil, doğrudan dosya yoluyla import eder. Döngüsel import böyle önlenir.1719

  • import/no-cycle kuralını açın.19

  • Dev sunucusu veya testler yavaşlarsa ilk bakacağınız yer barrel'lardır.18

İsimlendirme

  • Dosya ve klasörler kebab-case: cart-summary.tsx, use-cart.ts. macOS ve Windows büyük/küçük harfi ayırmaz, Linux (CI, canlı sunucu) ayırır. Yerelde çalışan bir import canlıda "Module not found" hatası verebilir.21 Tek bir yazım seçin ve lint ile zorlayın (unicorn/filename-case).19

  • Bileşen adı PascalCase, dosya adı kebab-case: tab-list.tsx dosyası TabList export eder.19

  • Framework'ün dayattığı adlara dokunmayın: page.tsx, layout.tsx, __root.tsx, $postId.tsx gibi adlar yönlendirmenin parçası.89

  • Genel adlardan kaçının: utils.ts, types.ts, helpers.ts yerine alanı anlatan ad verin.2

  • Test dosyası kaynağın yanında: cart-summary.test.tsx.1

İpucu

Bu yapıyı ajana her seferinde anlatmayın, kural dosyasına yazın. create-next-app kodlama ajanları için AGENTS.md dosyasını kendisi ekliyor.14 ../ yasağı gibi lint kuralları ajan için de bir kontrol işlevi görür, bunu Agentic Kodlama rehberinde anlatmıştık.

Kendin dene

  1. Projenizden bir özellik seçin (örneğin sepet) ve dosyalarını features/cart/ altına taşıyın. Yalnızca ihtiyaç duyduğunuz alt klasörleri açın.

  2. İki özelliğin kullandığı bir fonksiyon bulun (örneğin fiyat formatlama). Aynı kuralı mı paylaşıyorlar, yoksa tesadüfen mi benziyorlar? Aynıysa helpers/ altına taşıyın.

  3. import/no-relative-parent-imports kuralını açın ve ../ içeren import'ları alias'a çevirin.

  4. Projenizdeki index.ts dosyalarını sayın. Özellik kökündekiler dışındakileri doğrudan import'a çevirin.

  5. Aleksandr Guzenko'nun Preventing architectural debt with Feature-Sliced Design konuşmasını izleyin ve anlattığı bağımlılık sorunlarından hangilerinin projenizde olduğuna bakın.5

Kaynaklar

  • 1MakaleKent C. Dodds: Colocation

    Kodu ilgili olduğu yere yakın koyma ilkesi, testler ve yardımcı dosyalar. 17 Haziran 2019.

  • 2DokümanFeature-Sliced Design: Desegmentation

    Türe göre dizilimin sorunları ve genel klasör/dosya adlarından kaçınma.

  • 3Repobulletproof-react: Project Structure

    Feature klasörü yapısı, özellikler arası import yasağı, tek yönlü akış ve barrel notu.

  • 4DokümanFeature-Sliced Design: Layers

    Katman, dilim ve dilimler arası import kuralı.

  • 5VideoAleksandr Guzenko: Preventing architectural debt with Feature-Sliced Design (Conf42 JavaScript 2024)

    Karışık bağımlılıkların mimari borca dönüşmesi ve Feature-Sliced Design ile bunu sınırlama. Slaytlar sayfada.

  • 6VideoAlexander Morgunov: Getting to Grips with Feature-Sliced Design (HolyJS 2024 Autumn)

    Kavramlar, public API ve çapraz import, zayıf dokümantasyon gibi sık görülen sorunlar.

  • 7RepoViraStack AI: architecture-guide.md

    Bu rehberdeki dizin yapısının ve kuralların ajan kural dosyası olarak uygulanmış hali.

  • 8DokümanNext.js: Project structure and organization

    Dosya kuralları, `src` klasörü, private folder'lar ve proje organizasyon stratejileri.

  • 9DokümanTanStack Router: File Naming Conventions

    `__root`, `$`, `_` ve `-` önekleri, rota ağacından dosya hariç tutma.

  • 10MakaleJustin Weiss: I Dry-ed Up My Code and Now It's Hard to Work With

    "Üç vuruş" kuralı, gerekli ve tesadüfi tekrar ayrımı.

  • 11MakaleSandi Metz: The Wrong Abstraction

    Yanlış soyutlamanın nasıl oluştuğu ve geri dönüş yolu. 20 Ocak 2016.

  • 12VideoSandi Metz: All the Little Things (RailsConf 2014)

    Tekrarın yanlış soyutlamadan ucuz olduğu iddiasının çıktığı konuşma.

  • 13VideoDan Abramov: The Wet Codebase (Deconstruct)

    Erken soyutlamanın bedeli ve kötü soyutlamayı satır içine alma. Konferans sayfası 2019 altında listeliyor, sayfadaki etkinlik tarihi Nisan 2020.

  • 14DokümanNext.js: Installation

    `@/*` alias'ı, mutlak import örneği ve `AGENTS.md`.

  • 15DokümanTanStack Start: Path Aliases

    Start'ta alias varsayılan gelmez, Vite sürümüne göre kurulum.

  • 16Repoeslint-plugin-import: no-relative-parent-imports

    `../` import'larını yasaklayan kural.

  • 17DokümanFeature-Sliced Design: Public API

    Public API olarak index dosyası, `export *` sorunu ve index dosyalarının maliyetleri.

  • 18MakaleMarvin Hagemeister: The barrel file debacle

    Barrel dosyalarının araç performansına etkisi. 8 Ekim 2023.

  • 19MakaleTkDodo: Please Stop Using Barrel Files

    Döngüsel import, modül sayısı ölçümü ve dosya adı tutarlılığı. 26 Temmuz 2024.

  • 20MakaleAtlassian: How We Achieved 75% Faster Builds by Removing Barrel Files

    Jira frontend'inde ölçülen sonuçlar ve ödünleşimler. Tim Sebastian, 26 Haziran 2025.

  • 21Makalejoulev/nextjs-faq: "Module not found" on deployment

    Büyük/küçük harf duyarlılığı yüzünden yerelde çalışıp canlıda kırılan import'lar.

Bu sayfayı düzenle

Son güncelleme tarihi: 15 Ekim 2026

Sonraki adım02. Component ve Kod Organizasyonu