TB
← Tüm yazılar

Progressive enhancement

Progressive enhancement felsefesi ile temel HTML ve sunucu yanitindan baslayarak, gelismis tarayici ve ag kosullarinda zenginlesen katmanli web deneyimi tasarlamayi ele aliyoruz.

Progressive enhancement, web gelistirmede temel deneyimin her kullanıcıya calismasini, gelismis tarayici ozelliklerinin ise ekstra zenginlik katmasini hedefleyen bir felsefedir. Graceful degradation ile karsilastirildiginda fark sudur: degradation en zengin deneyimden baslayip eksik ozelliklerde kirilirken, progressive enhancement en sade çalışan cekirdekten baslayip uzerine katman ekler.

Temel ilkeler

Progressive enhancement uc katmandan olusur: içerik ve anlam (HTML), sunum (CSS) ve davranis (JavaScript). Her katman bir oncekine bağımlıdır ancak bir önceki olmadan da anlamli bir deneyim sunabilir.

  • Semantik HTML: Formlar, basliklar ve linkler JavaScript olmadan çalışır.
  • CSS gelistirmesi: Görsel zenginlik ekler; içerik okunabilir kalir.
  • JavaScript zenginlestirmesi: Etkileşim, validasyon ve dinamik güncelleme sağlar.

Neden hala önemli?

Modern frameworkler varsayilan olarak client-heavy yaklaşım sunsa da, ag kosullari, cihaz yetenekleri ve erisilebilirlik gereksinimleri progressive enhancementi yeniden gundeme tasir. Yavas ag baglantisi, eski cihazlar, ekran okuyucu kullanıcıları ve JavaScript engelleyici kullananlar temel deneyime ihtiyaç duyar.

Gerçek dünya senaryolari

Bir e-ticaret sitesinde ürün listesi sunucu tarafinda HTML olarak render edilirse, JavaScript yuklenmeden once bile kullanıcı urunleri gorebilir ve linke tiklayabilir. Sepete ekleme işlemi form POST ile calisabilir; JavaScript yuklendiginde AJAX ile anlik güncelleme eklenir.

Formlar ve sunucu yanitli akislar

Formlar progressive enhancementin en net ornegidir. Geçerli bir form HTML attribute ile çalışır:

<form action="/api/contact" method="post">
  <label for="email">E-posta</label>
  <input id="email" name="email" type="email" required>
  <button type="submit">Gonder</button>
</form>

JavaScript devreye girdiginde preventDefault ile sayfa yenilemesi engellenir, fetch API ile asenkron gonderim yapilir ve sonuç arayuzde gosterilir. JavaScript başarısız olursa form klasik POST ile calismaya devam eder.

Fetch ve fallback stratejileri

Veri cekme islemlerinde once sunucu tarafinda render edilmis içerik sunun, istemci tarafinda hydration veya partial update ile zenginlestirin. Next.js, Nuxt ve benzeri frameworkler bu modeli SSR ve SSG ile destekler.

  1. Ilk yanıt tam HTML icerir.
  2. JavaScript yuklenince event listenerlar baglanir.
  3. Ek özellikler feature detection ile kosullu aktif edilir.

Feature detection

Browser sniffing yerine özellik tespiti kullanın. Modernizr veya native kontroller ile desteklenmeyen özellikler icin alternatif sunun.

if ('IntersectionObserver' in window) {
  enableLazyImages();
} else {
  loadAllImagesImmediately();
}

@supports CSS kurali ile de sunum katmaninda kosullu stil uygulanabilir. Grid desteklenmiyorsa flexbox fallback devreye girer.

Erisilebilirlik baglantisi

Progressive enhancement ve erisilebilirlik birbirini destekler. Klavye navigasyonu, ARIA attribute kullanımı ve anlamli HTML, JavaScript olmadan da erisilebilir bir temel oluşturur. JavaScript ile eklenen dinamik iceriklerde focus yönetimi ve canli bolge guncellemeleri kritik hale gelir.

Focus yönetimi

Modal acildiginda focus trap uygulanmali, kapatildiginda önceki ogeye geri donulmelidir. Bu davranis JavaScript katmaninda uygulanir ancak temel sayfa navigasyonu linkler uzerinden calismaya devam eder.

CSS-only gelistirmeler

Bazi etkilesimler yalnizca CSS ile sağlanabilir: accordion (details/summary), hover durumlari, :target pseudo-class ile tab gecisi. Bu teknikler JavaScript bagimliligini azaltir.

Test stratejisi

Progressive enhancementi dogrulamak icin JavaScripti devre disi birakarak veya yavas 3G throttling ile test yapin. E2E testlerde hem JS açık hem kapali senaryolari kapsayin.

  • JavaScript kapali: temel akislar tamamlanabiliyor mu?
  • Yavas ag: içerik erken gorunuyor mu?
  • Ekran okuyucu: anlamli sıra ve etiketler doğru mu?

Anti-patternler

Onclick ile span kullanarak buton oluşturmak, bos href ile link vermek veya tüm içeriği JavaScript ile DOMa enjekte etmek progressive enhancementi ihlal eder. Bu yaklasimlar hem SEO hem erisilebilirlik hem de dayaniklilik acisindan risklidir.

Modern frameworklerde uygulama

React Server Components, Astro islands architecture ve Remix loader/action modeli progressive enhancementi framework seviyesinde destekler. Statik HTML cekirdegi uretip, interaktif bolgeleri secici olarak hydrate etmek bu yaklasimin pratik ifadesidir.

Progressive enhancement kullanicilara saygi gosteren, dayanikli ve sürdürülebilir web uygulamalari insa etmenin yoludur. En gelismis deneyimi hedeflerken temel akisin her kosulda calistigindan emin olmak, uzun vadede daha az teknik borc ve daha geniş kitle erisimi sağlar.

Offline ve Service Worker katmanı

Service Worker ile cachelenmis shell, ag kesintisinde bile temel navigasyonu sağlar. Bu katman JavaScript gerektirir ancak önceki HTML/CSS temeli uzerine insa edilir. Offline sayfasi basit ve bilgilendirici olmalidir. Network-first veya cache-first stratejisi içerik turune gore secilir.

Işlevsel programlama ve yan etkisiz kod

Progressive enhancementi destekleyen kod, DOM manipulasyonunu izole eder. Is mantigi saf fonksiyonlarda, DOM guncellemesi ayri katmanda tutulursa test ve fallback üretmek kolaylasir. Bu ayrim unit test yazimini da kolaylastirir.

Performans ve perceived speed

Skeleton screen ve optimistic UI, gelismis katmanda algilanan hizi artirir. Temel katmanda ise içeriğin erken gorunmesi onceliklidir. Her iki yaklaşım birlikte kullanıldığında hem dayaniklilik hem hiz sağlanır. Kullanıcıya aninda geri bildirim vermek guven oluşturur.

Dokumantasyon ve ekip aliskanliklari

Yeni özellik geliştirirken once HTML akisini tasarlayin, ardindan CSS ve JavaScript ekleyin. Code review checklistine JavaScript olmadan calisiyor mu sorusunu ekleyin. Bu aliskanlik uzun vadede daha az production incident demektir.

Navigasyon ve routing

SPA routing history API ile çalışır ancak sunucu tarafinda her route icin fallback HTML gerekir. Aksi halde dogrudan URL erisimi 404 verir. Sunucu yapilandirmasi tüm istekleri index.html veya ilgili SSR handlera yonlendirmelidir. Progressive enhancement bu fallback ile uyumlu çalışır.

Veri güncelleme ve polling

Canli veri gerektiren sayfalarda once statik snapshot sunulur, JavaScript yuklendikinde WebSocket veya SSE ile güncelleme baslar. Bağlantı koparsa son bilinen durum ekranda kalir ve periyodik yenileme devreye girer.

Progressive enhancement ve tasarım sistemi

Tasarım sistemi bilesenleri once statik HTML/CSS prototipi olarak tanimlanmali, interaktif varyantlar ayri katmanda gelistirilmelidir. Storybook gibi araclarda hem no-JS hem enhanced storyleri yan yana göstermek ekip icinde ortak dil oluşturur.

Gerçek kullanıcı verisi

Analytics verilerinde JavaScript devre disi kullanıcı orani düşük gorunse de kurumsal aglar ve erisilebilirlik araclari bu segmenti temsil eder. Temel akisin calismamasi destek taleplerini ve hemen cikma oranini artirir.

Mikro-etkilesimler ve animasyon

CSS transition ve animation ile saglanan geri bildirimler JavaScript gerektirmez. prefers-reduced-motion sorgusu ile animasyonlar devre disi birakilabilir. Bu yaklaşım hem erisilebilirlik hem performans acisindan tercih edilir.

Tablo ve veri sunumu

Veri tablolarinda semantik table, thead, tbody ve th scope kullanımı ekran okuyucular icin anlamli sıra sağlar. JavaScript ile siralama eklendiginde ARIA sort attribute güncellenmelidir. Tablo olmadan div grid kullanımı erisilebilirlik acisindan risklidir.

Medya ve video

Video oynatici HTML5 controls attribute ile JavaScript olmadan çalışır. Altyazi track elementi erisilebilirlik sağlar. Gelismis analitik ve özel kontroller JavaScript katmaninda eklenir.

Özet ve ilkeler

Progressive enhancement ozetle su ilkelere dayanir: once çalışan temel, sonra geliştirme, her zaman geri donus imkani. Bu yaklaşım webin evrensel erişim vaadini korur ve teknik borcu azaltir. Yeni projelerde ilk gununden itibaren uygulanmasi en düşük maliyetli stratejidir. Ekip icinde bu felsefeyi dokumante etmek ve code review surecine dahil etmek kalıcı davranis degisikligi sağlar.