Skip to content

Bölüm 20 / 20

Kendi başına yapabilir misin?

Hat sonu yeterlilik kontrolü: gerçekçi görev + kontrol listesi.

9 dakikalık okuma

Hat 07'nin yeterliliğinde bir API servisini gerçek veritabanına bağlamış ve "servisi silme, sonraki hatlarda üzerine ekleyeceksin" denmişti. Sırası geldi: artık o servise tarayıcı arayüzü yazacaksın. Bu hattın kapanış görevi "sayfa tasarlamak" değil; semantik bir iskelet kurmak, erişilebilir bir form yazmak, veriyi duyarlı biçimde listelemek, ekranın beş durumunu doğru sürmek ve bunların hepsini çerçeve kullanmadan yapmaktır. Bu hat İlan A'nın "HTML, CSS, JavaScript, TypeScript ile modern, responsive, kullanıcı odaklı web uygulamaları" maddesinin temelidir. Kural aynı: görevi derslere bakmadan tamamlayamıyorsan hat bitmemiştir.

01Bu hat sana ne kazandırmış olmalı

  • Adres çubuğundan piksele kadar zinciri ölçerek açıklayabilmek: DNS, TLS, HTTP sürümleri, önbellek katmanları, kritik render yolu.
  • Anlamına göre işaretleme yazmak: yer imleri, başlık hiyerarşisi, erişilebilir form ve tablo; div ile düğme yapmamak.
  • CSS'te hangi kuralın neden kazandığını okuyabilmek; kutu modelini ve birimleri bilinçli seçmek.
  • Flexbox ve Grid arasında gerekçeyle seçim yapmak; duyarlı düzeni çoğu zaman medya sorgusu yazmadan kurmak.
  • JavaScript'in tuzaklarını bilerek yazmak: ===, ??, kapanış, this, mutasyon yapan dizi metotları.
  • DOM'u güvenli ve erişilebilir biçimde güncellemek; olay devretmeyi kullanmak.
  • Asenkron kodu doğru kurmak: paralellik, iptal, zaman aşımı, yarış koşulu ve fetch'in hata davranışı.
  • Kullanıcı odaklı davranmak: beş ekran durumu, anlamlı hata mesajları, WCAG AA ölçütleri.
  • Bir sorunu tahmin ederek değil DevTools'ta okuyarak çözmek.
  • Modül, npm ve paketleyici kavramlarını bilmek — ve derleme adımının ne zaman gerekmediğini savunabilmek.

02Görev — Servise tarayıcı arayüzü yaz

Hat 07'de veritabanına bağladığın başvuru servisinin üzerine, çerçeve, CDN ve derleme adımı kullanmadan çalışan bir arayüz yaz. Sunucu tarafına dokunma; yalnız tarayıcı tarafını kur.

BölümYapılacak
1. İskelet Semantik bir sayfa: header + nav (etiketli), main, footer, doğru başlık hiyerarşisi, atlama bağlantısı, lang="tr", charset ve viewport meta.
2. Liste Başvuruları sunucudan çekip göster. Geniş ekranda erişilebilir tablo (caption, scope, kimlik sütununda th scope="row"), dar ekranda kart görünümü ya da klavyeyle kaydırılabilir bölge. Sunucu tarafı sayfalama ve sıralama; sıralanabilir başlıklar gerçek <button> ve aria-sort ile.
3. Form Yeni başvuru formu: her alanda label, doğru type/inputmode/autocomplete, radyo grubu fieldset+legend içinde. Doğrulama alandan çıkışta başlasın, hata sonrası yazarken sürsün; hatalar aria-describedby ve aria-invalid ile bağlansın, gönderim hatalıysa odak ilk hatalı alana gitsin. Çift gönderimi engelle.
4. Beş durum Yükleniyor (iskelet), boş (ne yapılacağını söyleyen metin), hata (tekrar dene düğmesiyle), kısmi ve dolu. Göstergeci 300 ms'den önce gösterme. Sonuç sayısını role="status" ile duyur.
5. Arama Arama kutusu: debounce, önceki isteği AbortController ile iptal ve sıra numarasıyla yarış koşulu koruması.
6. Düzen ve tema Sayfa iskeleti Grid, bileşen içleri Flexbox. Tasarım belirteçleri CSS değişkenleriyle; koyu/açık tema prefers-color-scheme + kullanıcı tercihi ve tema sıçraması olmadan. prefers-reduced-motion bloğu bulunsun.
7. Kod düzeni Kodu dosyalara böl (istek katmanı, biçimlendirme, arayüz). ES modülü ya da bilinçli olarak klasik betik seç ve seçimini gerekçelendir. Kullanıcı verisini hiçbir yerde innerHTML ile yazma.
8. Doğrulama Klavye turu (fare yok), 320 px genişlik, %200 yakınlaştırma, Lighthouse erişilebilirlik denetimi, Slow 4G ile yükleme durumları, konsolda sıfır hata.

Kabul ölçütü: sayfa yalnız klavyeyle baştan sona kullanılabiliyor, odak her an görünür, hiçbir yerde yatay kaydırma yok, ağ yavaşken arayüz ne olduğunu söylüyor ve aynı sorguyu hızlıca üç kez değiştirdiğinde ekranda doğru sonuç kalıyor.

03Kontrol listesi

Her satırı kendine sorarak işaretle; "evet" diyemediğin satırın dersine dön.

Yardımsız yapabiliyor musun?Takılırsan dön
Adres çubuğundan piksele kadar zinciri anlatmak; önbellek katmanlarını ve defer/async farkını bilmek 1. ders
Geçerli bir belge iskeleti yazmak; textContent ile innerHTML farkını ve tarayıcının hata kurtarmasını bilmek 2. ders
Erişilebilir bir form kurmak; name/disabled davranışını, :user-invalid'i ve çift gönderim savunmasını uygulamak 3. ders
Erişilebilir tablo işaretlemek (caption, scope); sayfalama ve kararlı sıralamayı doğru kurmak 4. ders
Yer imlerini ve başlık hiyerarşisini doğru kullanmak; erişilebilirlik ağacını okumak ve ARIA'yı yalnız gerektiğinde eklemek 5. ders
Bir ekranın beş durumunu tasarlamak; hata mesajı yazmak; WCAG AA ölçütlerini (kontrast, klavye, odak, hedef boyutu) uygulamak 6. ders
Kaskad, özgüllük ve kalıtımı açıklamak; bir kuralın neden uygulanmadığını DevTools'ta bulmak 7. ders
Kutu modelini ve box-sizing'i bilmek; kenar boşluğu çökmesini tanımak; rem/px/dvh/clamp seçimlerini gerekçelendirmek 8. ders
Flexbox ile üst bar, eşit yükseklikli kart ve yapışan altbilgi kurmak; flex: 1 ile auto farkını ve min-width: auto tuzağını bilmek 9. ders
Grid ile sayfa iskeleti ve auto-fit ile medya sorgusuz kart ızgarası kurmak; minmax(0, 1fr)'in ne zaman gerektiğini bilmek 10. ders
Mobil öncelikli yazmak; kırılma noktasını içeriğe göre seçmek; srcset/sizes ile duyarlı görsel sunmak 11. ders
CSS değişkenleriyle tema kurmak, tema sıçramasını önlemek; yalnız transform/opacity animasyonlamak ve prefers-reduced-motion'a uymak 12. ders
var/let/const, tip dönüşümü, ===, ?? ve Türkçe büyük/küçük harf tuzağını bilmek 13. ders
Kapanışı örnekle anlatmak; this'in dört kuralını bilmek; debounce yazmak ve dinleyici sızıntısını önlemek 14. ders
map/filter/reduce ile veri dönüştürmek; mutasyon yapan metotları tanımak; Türkçe sıralamayı doğru yapmak 15. ders
DOM'u güvenli güncellemek; olay yayılımını ve devretmeyi kullanmak; odak ve aria-* durumlarını elle yönetmek 16. ders
Olay döngüsünü açıklamak; paralel/sıralı isteği seçmek; fetch hatasını doğru kontrol etmek; iptal ve yarış koşulunu çözmek 17. ders
ES modüllerini kullanmak; package.json/kilit dosyasını ve paketleyicinin ne yaptığını açıklamak; bağımlılık kararı vermek 18. ders
Bir hatayı hangi panelde arayacağını bilmek; koşullu kesme noktası, DOM kesme noktası ve Network zaman dökümünü kullanmak 19. ders

04Sözlü provası

Tarayıcıya bir adres yazdığınızda ekranda sayfa görünene kadar neler olur?

Sırayla: (1) adres ayrıştırılır — parça (#) sunucuya gitmez, HSTS listesindeyse doğrudan HTTPS'e geçilir; (2) ad çözümleme — tarayıcı ve işletim sistemi önbelleği, hosts, sonra özyineli çözümleyici ve gerekirse kök → TLD → yetkili sunucu; (3) TCP el sıkışması ve HTTPS ise TLS el sıkışması (TLS 1.3'te bir gidiş-dönüş; SNI ile alan adı, ALPN ile HTTP sürümü seçilir); (4) HTTP isteği — önbellek geçerliyse hiç ağa çıkılmaz ya da ETag ile 304 alınır; (5) tarayıcı HTML'den DOM'u, CSS'ten CSSOM'u kurar, birleştirip render ağacını çıkarır; (6) yerleşim, boyama ve birleştirme ile ekrana kare çıkar; (7) betikler çalışır, ek kaynaklar yüklenir. Kritik ayrıntılar: CSS render engelleyicidir; klasik <script> ayrıştırmayı durdurur ve önündeki CSS'i bekler; ön yükleme tarayıcısı ayrıştırma dururken bile kaynakları keşfeder — bu yüzden görselleri JavaScript ile eklemek onları geciktirir. Ölçmek gerekirse Network panelindeki zaman dökümüne (TTFB mi, indirme mi, bağlantı mı) ve LCP/INP/CLS'e bakarım.

Flexbox ile Grid arasında nasıl seçim yaparsınız? Duyarlı bir kart ızgarasını nasıl kurarsınız?

Flexbox tek boyutludur ve içerikten yerleşime çalışır: ögelerin boyutunu içerikleri belirler, tek eksende dizilir. Grid iki boyutludur ve yerleşimden içeriğe çalışır: ızgarayı ben tanımlarım, içerik hücrelere oturur. Karar: üst bar, düğme grubu, etiket–değer satırı ve bir kartın iç dizilimi → Flexbox; sayfa iskeleti, kart ızgarası, form etiket–alan hizalaması → Grid. Tipik bir sayfada dış iskelet Grid, iç bileşenler Flexbox olur. Duyarlı kart ızgarası için tek satır yeter: grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)) — sütun sayısına tarayıcı karar verir, medya sorgusu yazmam. auto-fit boş izleri daraltır, auto-fill korur; fark yalnız öge sayısı sütun sayısından azken görünür. İki tuzağı da bilirim: Grid'de 1fr aslında minmax(auto, 1fr)'dir ve içinde uzun bir URL olan sütun daralmaz — minmax(0, 1fr) gerekir; Flexbox'ta aynı sorun varsayılan min-width: auto'dan gelir ve min-width: 0 ile çözülür. Ayrıca order ve grid-area görsel sırayı değiştirir ama klavye ve ekran okuyucu DOM sırasını izler; sırası anlamlı içerikte kullanmam.

Closure nedir? this nasıl belirlenir? İkisini bir arada bir örnekle anlatın.

Kapanış, bir fonksiyonun tanımlandığı kapsamı — o kapsam sona erdikten sonra bile — hatırlamasıdır. function sayacYap(){ let s = 0; return () => ++s; } örneğinde dönen fonksiyon s'yi canlı tutar ve her sayacYap() çağrısı kendi bağımsız kapanışını üretir. Kullanımı: özel durum tutmak, fabrika fonksiyonu, debounce/throttle. Bedeli kapattığı kapsamı canlı tutmasıdır — kaldırılmayan dinleyiciler ve zamanlayıcılar bu yüzden bellek sızdırır; React'te aynı şey "bayat kapanış" olarak karşıma çıkar. this ise fonksiyonun nasıl çağrıldığına göre belirlenir: new ile yeni nesne, call/apply/bind ile açıkça verilen, nesne.fn() ile noktanın solundaki, serbest çağrıda sıkı modda undefined. Ok fonksiyonlarının kendi this'i yoktur, dıştakini alır. İkisinin birleştiği klasik yer: bir nesne metodunu setTimeout'a referans olarak geçmek — nokta kaybolduğu için this gider; çözüm ok fonksiyonuyla sarmalamak ya da bind. Ve bind her çağrıda yeni bir fonksiyon döndürdüğü için removeEventListener ile kaldırırken referansı saklamak (ya da AbortController kullanmak) gerekir.

Bir listeyi API'den çekip gösteren ekranı nasıl kurarsınız? Nelere dikkat edersiniz?

Beş başlıkta anlatırım. (1) Durumlar: ekranın beş hâli vardır — yükleniyor (iskelet; göstergeci 300 ms'den önce göstermem), boş (ne yapılacağını söyleyen metin), hata (tekrar dene düğmesiyle), kısmi ve dolu. Çoğu ekip yalnız "dolu" durumu tasarlar. (2) İstek: fetch HTTP hatalarında reddetmez, bu yüzden yanit.ok kontrolünü elle yazar ve durum kodunu taşıyan bir hata sınıfı fırlatırım; zaman aşımı yerleşik olmadığı için AbortSignal.timeout eklerim; yeniden denemeyi yalnız idempotent isteklerde, üstel geri çekilmeyle yaparım. (3) Paralellik: birbirine bağlı olmayan istekleri arka arkaya await etmem, Promise.all ile paralel çalıştırırım; kısmi sonuç göstereceksem allSettled kullanırım. (4) Yarış koşulu: filtre ya da arama hızlı değişiyorsa debounce + AbortController ile iptal + sıra numarası kullanırım; yoksa geç gelen eski yanıt yeni sonucu ezer. (5) Çizim ve erişilebilirlik: satırları DocumentFragment ile tek seferde eklerim, kullanıcı verisini textContent ile yazarım, düğmeleri satır satır bağlamak yerine olay devretme kullanırım (yeniden çizimde bozulmaz), sonuç sayısını role="status" ile duyurur ve silme sonrası odağı kaybetmem. Sıralama ve sayfalama sunucudaysa ikisini de sunucuda yaparım; Türkçe sıralama gerekiyorsa Intl.Collator("tr") kullanırım.

05Karar

Görevi yardımsız bitirdiysen

Bu düğümü "tamamladım" işaretle — Hat 08 kapanır. Artık "sayfa yapmak" ile tarayıcı uygulaması yazmak arasındaki farkı biliyorsun: işaretlemeyi anlamına göre seçiyor, CSS'te hangi kuralın neden kazandığını okuyabiliyor, düzeni doğru araçla kurup çoğu duyarlılığı medya sorgusu yazmadan sağlıyor, JavaScript'in tuzaklarını bilerek yazıyor, DOM'u güvenli ve erişilebilir güncelliyor, asenkron kodu iptal ve yarış koşulu dâhil doğru kuruyorsun. Sıradaki durak Hat 09 · TypeScript: bu hatta gördüğün tuzakların büyük kısmının (tanımsız alan, yanlış tip, imza değişikliği) derleme anında yakalanmasını sağlayan katman orada. Ardından aynı temelin üzerine Angular ve React gelir — ikisinin de yaptığı iş, senin bu hatta elle yaptığın DOM güncellemesini ve durum yönetimini üstlenmektir; temeli bilmek, o çerçeveleri kullanmakla anlamak arasındaki farktır. Yazdığın arayüzü silme: 13. hatta kimlik ve yetkilendirmeyle koruyacak, 15. hatta test edecek, 18. hatta boru hattıyla yayınlayacaksın.

Takıldıysan

Bu hat yirmi düğümle yol haritasının en geniş hatlarından biridir; ilk denemede takılmak olağandır. Çözemediğin maddeyi tablodan dersine eşle, yalnız o dersi ve mini alıştırmasını yeniden çalış, 24 saat sonra görevi düzeltmeden, sıfırdan yap. Sık takılınan altı yer ve karşılıkları: erişilebilir form ve hata bağlama (3. ders — aria-describedby, aria-invalid, odak taşıma), kaskad ve özgüllük (7. ders — kural neden uygulanmıyor), daralmayan flex/grid ögesi (9. ders ve 10. ders — min-width: 0 / minmax(0, 1fr)), this kaybı ve dinleyici kaldırma (14. ders — bind her çağrıda yeni referans üretir), fetch'in 404'te hata fırlatmaması ve yarış koşulu (17. ders), ve teşhis sırasını bilmemek (19. ders — hangi soru hangi panelde). Bu altısı gerçek projelerde de en çok zaman kaybettiren yerlerdir; bir kez oturduklarında hattın gerisi kendiliğinden yerine oturur.