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;
divile 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üm | Yapı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.
