T-SOFT/Tema Geliştirme/Performans

Performans

Vitrin performansı; kullanıcı deneyimini, dönüşüm oranlarını ve arama görünürlüğünü doğrudan etkiler. Bu sayfa, geliştiricinin tema kodunda kontrol edebildiği noktalara odaklanır.

theme.css ve theme.js yüklenmesi, bundle/cache başlıkları, font yüklemesi ve CDN dağıtımı T-SOFT altyapısı tarafından yönetilir. Tema geliştiricisinin performansa etkisi, bu dosyaların içeriği ve Twig çıktısının yapısı üzerinden oluşur.

Hedefler

Bir vitrinden bekleyeceğiniz Core Web Vitals aralıkları:

MetrikİyiGeliştirilmeliZayıf
LCP (Largest Contentful Paint)< 2.5s2.5–4.0s> 4.0s
INP (Interaction to Next Paint)< 200ms200–500ms> 500ms
CLS (Cumulative Layout Shift)< 0.10.1–0.25> 0.25
TTFB (Time to First Byte)< 600ms600–1500ms> 1500ms
3G + orta seviye mobil cihaz simüle eden Lighthouse mobile skorunuz 85+ olmalı. Chrome DevTools → Lighthouse veya PageSpeed Insights üzerinden ölçebilirsiniz.

Görseller

En büyük kazancı buradan alırsınız.

snippets/product-card.twig
<img
  src="{{ product.image }}"
  width="800"
  height="800"
  loading="lazy"
  alt="{{ product.title }}"
/>
KuralNeden
width ve height her zaman verCLS = 0 için layout reservation
Katlamanın altındaki görsellere loading="lazy"Bant genişliği
Hero / LCP elementinde lazy kullanmayın (varsayılan eager)Aksi halde LCP süresi uzar
Anlamlı alt metni yazınErişilebilirlik + SEO
Görseli doğru boyutta yükleyin4000px PNG'yi kart için göndermeyin

Slider'da ilk slide deseni

Hero slider gibi LCP olan slider'larda ilk slide eager + fetchpriority high, diğer slide'lar lazy:

{% for key, IMAGE in SETTING.IMAGES %}
  {% if key == 0 %}
    <img src="{{ IMAGE.IMG1.PATH }}"
         width="{{ IMAGE.IMG1.WIDTH }}" height="{{ IMAGE.IMG1.HEIGHT }}"
         alt="{{ IMAGE.TITLE|striptags }}"
         fetchpriority="high" loading="eager" decoding="async">
  {% else %}
    <img data-src="{{ IMAGE.IMG1.PATH }}"
         width="{{ IMAGE.IMG1.WIDTH }}" height="{{ IMAGE.IMG1.HEIGHT }}"
         alt="{{ IMAGE.TITLE|striptags }}"
         class="lazyload" loading="lazy">
  {% endif %}
{% endfor %}

İlk slide src ile hemen yüklenir → LCP'yi bu belirler. Diğerleri data-src + lazyload ile Swiper kaydırınca yüklenir.

CSS (yazdığınız theme.css)

assets/css/theme.css dosyasının nasıl yüklendiğini T-SOFT yönetir. Sizin etkileyebildiğiniz, içine ne yazdığınız:

Tailwind utility'lerine yaslan

Çoğu arayüzü özel CSS yazmadan, utility class'larla kurabilirsiniz. Yazdığınız her satır bundle boyutuna eklenir.

Tekrarı `@layer components`'a al

Aynı utility dizisini 3+ yerde yazıyorsanız .btn-primary gibi component class'ına taşıyın.

Eski/ölü kuralları sil

theme.css zamanla şişer; redesign sonrası kullanılmayan kuralları temizleyin.

`@import` zinciri kurma

Hepsi tek theme.css içinde. Ek dosya zinciri ek RTT demektir.

JavaScript (yazdığınız theme.js)

theme.js dosyasının yüklenmesini T-SOFT yapar — <script> etiketi yazmayın, defer eklemeyin. Performansa etkiniz, dosyanın içine yazdığınız kodun ağırlığıyla olur.

Temel kurallar

KuralNeden
Ağır kütüphane eklemeyin (jQuery, Moment, Lodash full)INP riski + bundle şişer
Ana ipliği bloklayan döngülerden kaçınınUzun task ⇒ INP > 200ms
Kodu yalnızca ilgili element sayfada varsa çalıştırınGereksiz işlem ve listener oluşmaz
DOM olaylarını delegate edin1000 listener yerine 1 listener
Bir kez bağlanan event'lara { once: true }Hafıza ve INP

Element varsa çalıştırma örneği

theme.js her sayfada yüklendiği için, bir elemente kod bağlamadan önce o elementin sayfada olup olmadığını kontrol edin:

assets/js/theme.js
const addToCartBtn = document.querySelector('[data-toggle="add-to-cart"]');

if (addToCartBtn) {
  addToCartBtn.addEventListener('click', () => {
    console.log('Sepete ekle butonuna tıklandı');
  });
}

Buton yalnızca ürün sayfasında bulunur; if kontrolü sayesinde diğer sayfalarda gereksiz listener oluşmaz.

Üçüncü taraf script'leri

Tema içine eklediğiniz analytics / pixel / chat widget'larını dikkatli yönetin — bunlar genellikle performans regresyonunun en büyük tek sebebidir.

ScriptÖnerilen yaklaşım
Google Analytics / GA4defer, sayfa interaktif olduktan sonra
Meta / TikTok PixelAynı
Chat widget'ları (Intercom, Zendesk…)İlk kullanıcı etkileşiminden sonra (idle) yükle
A/B test araçlarıİstemcide CLS yaratırlar; mümkünse server-side çalışan bir alternatif tercih edin
Üçüncü taraf script'leri düzenli olarak gözden geçirin. Kullanılmayan entegrasyonları kaldırmak LCP ve INP metriklerinde belirgin iyileşme sağlayabilir.

Render hacmi

Bir sayfa ne kadar fazla section/snippet işlerse o kadar yavaşlar.

TuzakÇözüm
Bir sayfada 50+ ürünü tek seferde render etmekİlk batch'i (ör. 12) render edin, gerisi için pagination / lazy load
Aynı snippet'ı yüzlerce kez çağırmakSnippet içindeki sabitleri snippet dışına taşıyın; sade tutun
Her ürün için ayrı API çağrısıTek toplu veri ile çalışın; section veri olarak alsın

Fontlar

Birincil, ikincil ve RTL fontlar panelden seçilir; yüklemeyi, preload'u ve font-display davranışını T-SOFT yönetir. Tema kodunda ek @font-face veya <link rel="preload"> yazmanıza gerek yoktur. Detay için bkz. Temayı Özelleştir.

Yaygın tuzaklar — geliştirici tarafında

Anti-patternEtkisiÇözüm
width/height olmayan <img>CLS bozulurHer görsele boyut ver
Hero görseline loading="lazy"LCP süresi uzarHero eager (varsayılan) kalsın
Inline base64 görseller (büyük)HTML şişerGörseli assets/images/'a koyup asset() ile çağırın
Sabit hex renk (panel renklerini görmezden gelmek)Mağaza tema değiştirince uyumsuzlukbg-primary / text-primary gibi semantik class kullanın
theme.js içinde ağır kütüphaneINP riskiVanilla JS ile yazın, ağır kodu koşullayın
Twig'de hesaplanan dinamik Tailwind classDerleme sırasında bulunamaz, stil kaybı oluşurOlası class'ları kaynakta açıkça yazın

Sıradaki adım