---
title: "Barrel File: index.ts Dosyası Gerekli mi?"
description: "Barrel file'lar import yollarını kısaltıyor ama modül grafiğini şişiriyor. Atlassian, Vercel ve TkDodo'nun ölçümlerine bakıp fikrimi neden değiştirdim."
url: https://omergulcicek.com/blog/barrel-file
author: "Ömer Gülçiçek"
published: 2026-10-31
language: tr
tags: ["TypeScript","Frontend"]
---

# Barrel File: index.ts Dosyası Gerekli mi?

Barrel file kullanmayı tercih eden biriydim; ViraStack AI kurallarında da bunu önermiştim. Kaynakları okuyunca fikrim değişti ve kuralı güncelliyorum.

## Barrel File Nedir?

Barrel file, bir klasörün `index.ts` dosyasında içindeki modülleri tek noktadan dışarı açmak. [Feature-Driven Proje Yapısı](https://omergulcicek.com/blog/feature-driven-proje-yapisi) yazımda feature'ları böyle anlatmıştım:

```ts
// src/features/auth/index.ts
export { LoginForm } from "./components/login-form"
export { useAuth } from "./hooks/use-auth"
```

```ts
import { LoginForm, useAuth } from "@/features/auth"
```

Import yolu kısalıyor, feature'ın dışarıya açtığı kısım tek dosyada görünüyor. Bu yüzden seviyordum.

[Bulletproof React](https://github.com/alan2207/bulletproof-react/blob/master/docs/project-structure.md) rehberi de feature'ların `index.ts` ile dışarı açılmasını öneriyordu ([Mayıs 2024 sürümü](https://github.com/alan2207/bulletproof-react/blob/b898a0d209498a7e9d3e55e1ed5dea6a11aa1b40/docs/project-structure.md)). Güncel sürüm bunu bırakmış: barrel file'ların Vite'ta tree shaking'i zorlaştırabildiğini ve performans sorunlarına yol açabildiğini yazıyor, dosyaları doğrudan import etmeyi öneriyor.

## Bedeli Ne?

`@/features/auth`'tan yalnızca `LoginForm`'u import ettiğinde, JavaScript barrel'ın re-export ettiği her modülü yükleyip çalıştırıyor. Kullanmadıkların da dahil. [Marvin Hagemeister](https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-7/) bunu içinde yalnızca import satırı olan boş dosyalarla ölçmüş. M1 Air'de 1.000 modül 0,31 saniye, 10.000 modül 3,12 saniye, 50.000 modül 48,44 saniye sürüyor. [Vercel](https://vercel.com/blog/how-we-optimized-package-imports-in-next-js)'e göre tree shaking de çözmüyor: bu bir bundler özelliği ve external bir paketin içine bakamıyor.

Bir de döngüsel import riski var. [TkDodo'nun örneğinde](https://tkdodo.eu/blog/please-stop-using-barrel-files#circular-imports) `tab-panel.ts` içinde `useTabState`'i `./use-tab-state` yerine barrel'dan (`@/tab`) import etmek döngü oluşturuyor: `tab-panel.ts` barrel'ı, barrel de `tab-panel.ts`'i import ediyor. Bundler'lar bu yüzden anlaşılmaz hata mesajlarıyla çökebiliyor.

Gerçek projelerde fark şöyle:

Bu sayıların çoğu binlerce modüllü kod tabanlarından geliyor. Marvin'e göre birkaç barrel genelde sorun değil, her klasörde bir tane olması sorun.

## Vazgeçince Ne Değişiyor?

Doğrudan import'a geçiyorsun: `@/features/auth/components/login-form`. [Atlassian ekibi](https://www.atlassian.com/blog/how-we-build/faster-builds-when-removing-barrel-files) bedelini açıkça yazmış: paketler public API'yi artık barrel'la kontrol edemiyor, bir dosyayı taşıdığında ona doğrudan import eden her yeri güncellemen gerekiyor.

Kütüphane yazıyorsan durum farklı. [TkDodo](https://tkdodo.eu/blog/please-stop-using-barrel-files#what-barrels-are-good-for), `package.json`'daki `main` alanının gösterdiği tek giriş noktasını tek istisna sayıyor; `@tanstack/react-query` bunun örneği. Uygulama kodunda ise `index.ts` dosyalarının işi zorlaştırdığını söylüyor. Biome'un `noBarrelFile` kuralı da yalnızca type export'larını (`export type { Foo } from "foo"`) ve `.d.ts` dosyalarını muaf tutuyor.

Yeni bir projede ilk `index.ts`'i açmadan önce Biome'un [noBarrelFile](https://biomejs.dev/linter/rules/no-barrel-file/javascript/) kuralını açmak, barrel'ları baştan işaretletmek için yeterli.

## Kaynaklar

- [Please Stop Using Barrel Files - TkDodo](https://tkdodo.eu/blog/please-stop-using-barrel-files)
- [noBarrelFile - Biome](https://biomejs.dev/linter/rules/no-barrel-file/javascript/)
- [Faster builds when removing barrel files - Atlassian](https://www.atlassian.com/blog/how-we-build/faster-builds-when-removing-barrel-files)
- [How we optimized package imports in Next.js - Vercel](https://vercel.com/blog/how-we-optimized-package-imports-in-next-js)
- [Speeding up the JavaScript ecosystem, part 7 - Marvin Hagemeister](https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-7/)
- [Project Structure - Bulletproof React](https://github.com/alan2207/bulletproof-react/blob/master/docs/project-structure.md)
