Render Süreci / render blocking

Render Blocking Kaynaklar Nedir ve Nasıl Çözülür?

Render Blocking Kaynaklar Nedir ve Nasıl Çözülür? için performans görseli

Render-blocking kaynaklar ilk ekranı geciktirdiğinde kullanıcı sayfa yükleniyor mu, takıldı mı ayrımını yapamaz hale gelir.

Bu içerikte liste halinde tavsiyeler yerine kritik yol sadeleştirmesini inceliyoruz: hangi dosya gerçekten bloklayıcı, hangisi yanlış önceliklendirme nedeniyle soruna dönüşüyor.

Amaç yalnızca ilk boya süresini düşürmek değil; bunu layout kırılmaları üretmeden sürdürülebilir hale getirmek.

Render-blocking için başlangıç ölçümünü netleştirin

Gerçek kullanıcı verisi laboratuvar testinden farklı sonuç verir.

Aynı sayfa farklı cihazlarda farklı hız gösterir. Mobil tarafta düşük işlem gücü ve ağ dalgalanması masaüstünde görünmeyen gecikmeleri büyütür. Tek sayı üzerinden acele karar vermek yerine dağılıma bakın: 75. persentil, 90. persentil ve en kötü %5'lik dilim ayrı ayrı incelenmeli.

  • Gerçek kullanıcı verisi: CrUX raporunu haftalık kontrol edin, 28 günlük trend grafiğini izleyin.
  • Laboratuvar testi: Lighthouse skorunu 3G throttling ile ölçün, mobil cihaz simülasyonu açık olsun.
  • Cihaz kırılımı: Düşük, orta ve yüksek performanslı cihazları ayrı segmentlere ayırın.
  • Zaman karşılaştırması: Her değişiklik öncesi baseline kaydedin, 7 gün sonra tekrar ölçün.

Küçük disiplinler uzun vadede büyük fark yaratır. Değişiklik öncesi ve sonrası aynı ölçüm koşullarını korursanız ekip içi değerlendirmede tartışma azalır, karar kalitesi yükselir. Belirlediğiniz eşikleri sürüm notlarına işleyin; yeni geliştirmeler performans çizgisini bozduğunda daha erken yakalarsınız.

Render-blocking darboğazını katman katman ayırın

Kaynak sıralamasını düzeltirken critical CSS uygulaması ve JavaScript defer async planı birlikte ele alındığında ilk çizim daha stabil olur.

Sorun her zaman kodda değil.

Ağır medya ilk boyamayı geciktirir: 2MB'lık hero görseli WebP'ye çevirseniz bile lazy loading olmadan bloklama devam eder. Bloklayan kaynak kritik yolu uzatır: harici CSS dosyası 400ms yükleme süresi gösteriyorsa inline critical CSS ile ilk ekranı hızlandırabilirsiniz. Ana iş parçacığı yükü JavaScript parse süresini artırır: 300KB bundle'ı code splitting ile parçalarsanız Time to Interactive düşer.

Sunucu gecikmesi TTFB'yi yükseltir. CDN kullanıyorsanız cache hit oranını kontrol edin; %60'ın altındaysa cache stratejinizi gözden geçirin.

  • Ağır medya: Hero görseli 150KB altına düşürün, above-the-fold dışındaki görsellere loading="lazy" ekleyin.
  • Bloklayan kaynak: Critical CSS'i inline yapın (max 14KB), geri kalan stilleri async yükleyin.
  • Ana iş parçacığı yükü: Long Task'ları tespit edin (50ms üzeri), büyük JavaScript dosyalarını dynamic import ile bölün.
  • Sunucu gecikmesi: TTFB 600ms üzerindeyse sunucu tarafı cache ekleyin, database query'lerini optimize edin.

Bir metriği iyileştirirken başka bir alanda sorun üretmek kolay. LCP'yi düşürmek için tüm görselleri preload ederseniz bandwidth tüketimi artar, düşük bant genişliğindeki kullanıcılar daha yavaş deneyim yaşar.

Render-blocking tarafında öncelik sırası kurun

Tüm sorunları aynı anda çözemezsiniz.

Etki büyüklüğü ile uygulama maliyetini karşılaştırın. Critical CSS inline yapmak 2 saatlik iş, LCP'yi 800ms düşürür. Font subsetting 4 saatlik iş, LCP'yi 150ms düşürür. Hangisi önce? İlki. Uygulama maliyeti düşük, etki büyük olan adımları önceliklendirin.

Risk seviyesini hesaba katın: üçüncü taraf script'i kaldırmak analytics verilerini bozabilir, geri alma planı olmadan canlıya almayın. Geri dönüş süresi kısa olan değişiklikleri tercih edin: feature flag ile kontrol edilen optimizasyonlar sorun çıkarsa anında geri alınabilir.

  • Etki büyüklüğü: Lighthouse'da "Opportunities" bölümündeki tahmini kazanımlara bakın, 500ms üzeri kazanım veren adımları önceliklendirin.
  • Uygulama maliyeti: 1 günden kısa sürecek değişiklikleri hızlı kazanım için seçin, uzun projeler için ayrı sprint planlayın.
  • Risk seviyesi: Kritik iş akışını etkileyecek değişiklikleri staging'de 1 hafta test edin, A/B test ile %10 trafiğe açın.
  • Geri dönüş süresi: Feature flag veya CDN konfigürasyonu ile kontrol edilen değişiklikleri tercih edin, kod deploy gerektiren değişiklikleri son sıraya bırakın.

Render-blocking değişikliklerini küçük yayınlarla doğrulayın

Büyük değişiklikler risk taşır.

Aşamalı yayın yapın: önce %5 trafiğe açın, 24 saat bekleyin, metrik stabil kalırsa %25'e çıkarın. Önce test sonra canlı: staging ortamında 3 gün çalıştırın, gerçek kullanıcı verisi simülasyonu yapın, sorun yoksa production'a alın. Regresyon kontrolü: her deploy sonrası Lighthouse skorunu otomatik çalıştırın, LCP 200ms üzeri artarsa alarm tetikleyin.

Geri alma planı hazırlayın. Feature flag kullanıyorsanız tek tıkla eski versiyona dönebilirsiniz. CDN konfigürasyonu değiştirdiyseniz önceki ayarları yedekleyin, sorun çıkarsa 5 dakikada geri alın.

  • Aşamalı yayın: Canary deployment ile %5 → %25 → %50 → %100 şeklinde ilerleyin, her aşamada 24 saat bekleyin.
  • Önce test sonra canlı: WebPageTest ile 9 farklı lokasyondan test edin, median değer baseline'dan %10'dan fazla sapma gösteriyorsa değişikliği gözden geçirin.
  • Regresyon kontrolü: CI/CD pipeline'a Lighthouse CI ekleyin, LCP budget'ı 2.5s olarak ayarlayın, aşılırsa build'i fail edin.
  • Geri alma planı: Her değişiklik için rollback prosedürü yazın, maksimum geri alma süresi 15 dakika olsun.

Render-blocking verisini yanlış okumayın

Doğrulama adımında Lighthouse rapor okuma yöntemi ile TTFB katman analizi bir arada izlendiğinde hatalı çıkarım oranı düşer.

Tek ölçüm yanılgısı: Lighthouse'da 95 skor aldınız, gerçek kullanıcı verisi 65 gösteriyor. Neden?

Laboratuvar testi ideal koşullarda çalışır: sabit ağ hızı, temiz cache, tek sayfa yüklemesi. Gerçek kullanıcı farklı koşullarda gezinir: yavaş 3G, dolu cache, çoklu sekme, arka planda çalışan uygulamalar. Aşırı ortalama kullanımı gerçeği gizler: ortalama LCP 2.1s olabilir ama %25'lik dilim 4.8s görüyordur. Coğrafya farkı büyük: Avrupa'dan 1.2s yüklenen sayfa Güneydoğu Asya'dan 3.7s yüklenir. Cihaz sınıfı etkisi: iPhone 14'te 800ms olan parse süresi Android Go cihazda 2.4s'ye çıkar.

  • Tek ölçüm yanılgısı: CrUX verisi ile Lighthouse skorunu karşılaştırın, %20'den fazla fark varsa gerçek kullanıcı verisine odaklanın.
  • Aşırı ortalama kullanımı: Median yerine 75. persentil değerini hedef alın, Google Core Web Vitals de bu değeri kullanır.
  • Coğrafya farkı: Trafiğinizin %80'inin geldiği 3 lokasyonu tespit edin, her birinden ayrı ölçüm yapın.
  • Cihaz sınıfı etkisi: Düşük performanslı cihazları (2GB RAM altı) ayrı segment olarak izleyin, bu segment için ayrı optimizasyon hedefi belirleyin.

Render-blocking için sürdürülebilir kontrol rutini kurun

Tek seferlik optimizasyon yetmez.

Haftalık denetim yapın: her Pazartesi sabahı CrUX raporunu açın, LCP ve FID değerlerini önceki haftayla karşılaştırın, %10'dan fazla artış varsa nedenini araştırın. Yayın öncesi kontrol: her production deploy öncesi Lighthouse CI çalıştırın, performance budget'ı aşan değişikliği merge etmeyin. Otomatik alarm: LCP 2.5s'yi geçtiğinde Slack'e bildirim gönderin, 3.0s'yi geçtiğinde on-call developer'ı uyandırın.

Dokümantasyon disiplini: her optimizasyonu wiki'ye yazın, hangi değişiklik hangi metriği ne kadar iyileştirdi kayıt altına alın. 6 ay sonra aynı sorunu tekrar yaşadığınızda önceki çözümü 5 dakikada bulursunuz.

  • Haftalık denetim: CrUX raporunu her Pazartesi kontrol edin, trend grafiğinde ani düşüş veya yükseliş varsa root cause analysis yapın.
  • Yayın öncesi kontrol: Lighthouse CI'ı GitHub Actions'a entegre edin, LCP budget 2.5s, FID budget 100ms, CLS budget 0.1 olarak ayarlayın.
  • Otomatik alarm: Datadog veya New Relic ile real user monitoring kurun, 75. persentil LCP 3.0s'yi geçtiğinde PagerDuty ile alert gönderin.
  • Dokümantasyon disiplini: Her optimizasyon için before/after screenshot, metrik karşılaştırması ve uygulama adımlarını Confluence'a yazın.

Belirlediğiniz eşikleri sürüm notlarına işleyin; yeni geliştirmeler performans çizgisini bozduğunda daha erken yakalarsınız.

Vaka Notu: Kritik yol sadeleşince ilk ekran hızlandı

Kurumsal bir sayfada kullanıcı uzun süre boş alan görüyordu. Analizde sorun, bloklayan stil ve font zincirinin ilk boyamayı geciktirmesiydi. Ekip kritik üst alan için zorunlu stilleri ayırdı, geri kalan yükü kademelendirdi ve kaynak önceliğini düzenledi. Dosya sayısı büyük ölçüde aynı kalmasına rağmen ilk görünür içerik belirgin şekilde erkene geldi.

Bu deneyim, performans kazancının çoğu zaman dosya silmekten değil doğru sırada yüklemekten geldiğini gösterdi. Ölçüm sonrası kullanıcıların içerikle etkileşime başlama süresi düştü ve sayfa daha akıcı algılandı.

Render-blocking iyileştirmeleri, kaynak sırasını düzenli izlediğinizde kısa sürede kalıcı fayda üretir.

Sonraki adım olarak kritik istek zincirini release bazında saklayıp her sürümde yeni bloklayıcıların eklenmesini otomatik kontrol edin.

Periyodik kaynak denetimi, render blocking risklerini erken yakalar ve render blocking kaynaklı gecikmeleri büyümeden durdurur.