Taze Logo
Frontend Geliştirme20 Mart 2026

Tailwind CSS Harika Başladı, Sonra Projeyi Esir Aldı: Bir Bakım Kabusundan Nasıl Kurtulunur?

Tailwind CSS Harika Başladı, Sonra Projeyi Esir Aldı: Bir Bakım Kabusundan Nasıl Kurtulunur?

Tailwind'in hızına kapılıp projenizi okunmaz bir 'div çorbası'na mı çevirdiniz? Projeler büyüdükçe Tailwind'in nasıl bir bakım kabusuna dönüştüğünü ve @apply, bileşen tabanlı mimarilerle bu kabustan nasıl kurtulacağınızı anlatıyoruz.

Giriş: Balayı Dönemi

Tailwind CSS'i ilk keşfettiğiniz anı hatırlayın. Adeta bir aydınlanmaydı. Artık CSS dosyaları arasında gidip gelmek yok, BEM gibi karmaşık isimlendirme kurallarıyla boğuşmak yok, "bu class'ı değiştirirsem başka neresi bozulur" endişesi yok. Sadece HTML'inizin içinde, ihtiyacınız olan stili anında uyguluyordunuz. Hızlı, sezgisel ve inanılmaz verimliydi.

Basit bir buton yapmak hiç bu kadar keyifli olmamıştı:


<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
  Kaydet
</button>
        

Bu mükemmel bir başlangıç. Ancak proje büyüdükçe, takvim yaprakları döküldükçe, balayı yavaşça sona erer ve farkında olmadan kendinizi bir bakım kabusunun içinde bulursunuz.

Problem 1: Okunmazlık Cehennemi ve "Div Çorbası"

Projeniz karmaşıklaştıkça, basit butonunuz yerini onlarca class içeren devasa bileşenlere bırakır. İşte o an, "Div Çorbası" adını verdiğimiz canavar ortaya çıkar. Aşağıdaki basit bir kart bileşenine bakalım:


<div class="max-w-sm rounded-lg border border-gray-200 bg-white shadow-md p-6 flex flex-col items-center text-center">
  <img class="w-24 h-24 mb-3 rounded-full shadow-lg" src="/path/to/image.jpg" alt="Avatar" />
  <h5 class="mb-1 text-xl font-medium text-gray-900">Taze Yazılım</h5>
  <span class="text-sm text-gray-500">Frontend Developer</span>
  <div class="mt-4 flex space-x-3 lg:mt-6">
    <a href="#" class="inline-flex items-center rounded-lg bg-blue-700 px-4 py-2 text-center text-sm font-medium text-white hover:bg-blue-800 focus:outline-none focus:ring-4 focus:ring-blue-300">Ekle</a>
    <a href="#" class="inline-flex items-center rounded-lg border border-gray-300 bg-white px-4 py-2 text-center text-sm font-medium text-gray-900 hover:bg-gray-100 focus:outline-none focus:ring-4 focus:ring-gray-200">Mesaj</a>
  </div>
</div>
        

Bu kodu 6 ay sonra açtığınızda, yapıyı anlamak için harcadığınız zihinsel eforu bir düşünün. Hangi class'ın ne işe yaradığını çözmek, adeta bir şifre çözme seansına dönüşür. Kod artık "ne olduğunu" değil, sadece "nasıl göründüğünü" anlatmaktadır.

Problem 2: Kaybolan Anlam ve "Neden" Sorusu

Geleneksel CSS'te bir butona .btn-primary dediğimizde, ona bir kimlik ve anlam yükleriz. Bu, "sitemdeki ana eylem butonu" demektir. Rengini, boyutunu merkezi bir yerden değiştirebiliriz. Tailwind'de ise aynı buton bg-blue-700 px-4 py-2... gibi bir dizi faydacı class'tan oluşur. Bu bize butonun "ne olduğunu" değil, sadece "o anki görünümünü" söyler.

Peki, projenizdeki tüm ana butonların rengini maviden yeşile çevirmeye karar verdiğinizde ne olacak? Yüzlerce dosyada bg-blue-700'ü bulup bg-green-700 ile mi değiştireceksiniz? Bu, sürdürülebilir bir sistem değil, bir arama-değiştirme kabusudur.

Problem 3: Koşullu Class'lar ve Şablon Mantığı Kabusu

İşin içine JavaScript ve koşullu mantık girdiğinde, her şey daha da kötüleşir. React veya Vue gibi bir framework'te, bir bileşenin durumuna göre class ekleyip çıkarmak yaygın bir durumdur. Tailwind ile bu, okunması ve yönetilmesi imkansız hale gelen şablon literallerine yol açabilir.


// Bu kodu anlamak ne kadar zor, değil mi?
<button
  className={`
    ${baseClasses}
    ${size === 'large' ? 'py-3 px-6 text-lg' : 'py-2 px-4 text-sm'}
    ${type === 'primary' ? 'bg-blue-500 text-white' : 'bg-gray-200 text-gray-800'}
    ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-opacity-80'}
  `}
  disabled={disabled}
>
  {children}
</button>
        

Kaçış Planı: Tailwind'i Evcilleştirme Sanatı

Sorun Tailwind'in kendisinde değil, onu nasıl kullandığımızda. Neyse ki bu kabustan çıkmanın ve Tailwind'in gücünü sürdürülebilir bir şekilde kullanmanın yolları var.

Çözüm 1:" @apply ile Anlamı Geri Getirin

Tailwind'in en güçlü özelliklerinden biri olan @apply, faydacı class'ları birleştirip yeniden kullanılabilir, anlamlı CSS class'ları oluşturmanıza olanak tanır. HTML'inizi temiz tutar ve CSS dosyanıza merkezi bir kontrol noktası ekler.


/* styles.css */
.card {
  @apply max-w-sm rounded-lg border border-gray-200 bg-white shadow-md p-6 flex flex-col items-center text-center;
}

.btn-primary {
  @apply inline-flex items-center rounded-lg bg-blue-700 px-4 py-2 text-center text-sm font-medium text-white hover:bg-blue-800;
}

.btn-secondary {
  @apply inline-flex items-center rounded-lg border border-gray-300 bg-white px-4 py-2 text-center text-sm font-medium text-gray-900 hover:bg-gray-100;
}
        

Artık HTML'imiz yeniden okunabilir ve anlamlı hale geldi:


<div class="card">
  ...
  <a href="#" class="btn-primary">Ekle</a>
  <a href="#" class="btn-secondary">Mesaj</a>
  ...
</div>
        

Çözüm 2: Bileşen Tabanlı Mimariler (Asıl Çözüm)

Tailwind, React, Vue, Svelte gibi bileşen tabanlı framework'lerle kullanıldığında gerçek potansiyelini ortaya koyar. O karmaşık class listesini, yeniden kullanılabilir bir bileşenin içine hapsedersiniz.


// components/Button.jsx

function Button({ children, type = 'primary', ...props }) {
  const baseClasses = "inline-flex items-center rounded-lg px-4 py-2 text-center text-sm font-medium";
  
  const typeClasses = type === 'primary'
    ? 'bg-blue-700 text-white hover:bg-blue-800'
    : 'border border-gray-300 bg-white text-gray-900 hover:bg-gray-100';

  return (
    <button className={`${baseClasses} ${typeClasses}`} {...props}>
      {children}
    </button>
  );
}
        

Artık bu bileşeni kullanmak tertemiz ve çok daha kolay. Tüm karmaşa, tek bir dosyanın içinde saklı kalır ve projenin geri kalanında sadece <Button type="secondary">Mesaj</Button> yazarsınız.

Sonuç: Aracın Kölesi Değil, Efendisi Olun

Tailwind CSS, doğru kullanıldığında inanılmaz derecede güçlü bir araçtır. Ancak disiplin gerektirir. İlk baştaki "her şeyi HTML'e yazma" kolaycılığına kapılmak, projenin geleceğine konulmuş bir zaman ayarlı bombadır. Amaç, faydacı class'ları bir kenara atmak değil, onları daha büyük, daha anlamlı ve daha sürdürülebilir sistemler (bileşenler veya anlamlı class'lar) inşa etmek için birer yapı taşı olarak kullanmaktır. Tailwind'in size değil, sizin Tailwind'e hükmettiğiniz gün, bakım kabusu sona erer.