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 | İyi | Geliştirilmeli | Zayıf |
|---|---|---|---|
| LCP (Largest Contentful Paint) | < 2.5s | 2.5–4.0s | > 4.0s |
| INP (Interaction to Next Paint) | < 200ms | 200–500ms | > 500ms |
| CLS (Cumulative Layout Shift) | < 0.1 | 0.1–0.25 | > 0.25 |
| TTFB (Time to First Byte) | < 600ms | 600–1500ms | > 1500ms |
Görseller
En büyük kazancı buradan alırsınız.
<img
src="{{ product.image }}"
width="800"
height="800"
loading="lazy"
alt="{{ product.title }}"
/>
| Kural | Neden |
|---|---|
width ve height her zaman ver | CLS = 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ın | Erişilebilirlik + SEO |
| Görseli doğru boyutta yükleyin | 4000px 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
Tekrarı `@layer components`'a al
.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
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
| Kural | Neden |
|---|---|
| Ağır kütüphane eklemeyin (jQuery, Moment, Lodash full) | INP riski + bundle şişer |
| Ana ipliği bloklayan döngülerden kaçının | Uzun task ⇒ INP > 200ms |
| Kodu yalnızca ilgili element sayfada varsa çalıştırın | Gereksiz işlem ve listener oluşmaz |
| DOM olaylarını delegate edin | 1000 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:
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 / GA4 | defer, sayfa interaktif olduktan sonra |
| Meta / TikTok Pixel | Aynı |
| 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 |
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ğırmak | Snippet 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-pattern | Etkisi | Çözüm |
|---|---|---|
width/height olmayan <img> | CLS bozulur | Her görsele boyut ver |
Hero görseline loading="lazy" | LCP süresi uzar | Hero eager (varsayılan) kalsın |
| Inline base64 görseller (büyük) | HTML şişer | Görseli assets/images/'a koyup asset() ile çağırın |
| Sabit hex renk (panel renklerini görmezden gelmek) | Mağaza tema değiştirince uyumsuzluk | bg-primary / text-primary gibi semantik class kullanın |
theme.js içinde ağır kütüphane | INP riski | Vanilla JS ile yazın, ağır kodu koşullayın |
| Twig'de hesaplanan dinamik Tailwind class | Derleme sırasında bulunamaz, stil kaybı oluşur | Olası class'ları kaynakta açıkça yazın |