Ders 02 / 26
Biçem Dosyasının Bağlanması
Bir biçem kümesinin belgeye satır içi, iç ve dış olmak üzere üç yolla bağlanması; bu üç yolun istek sayısı, yeniden kullanım ve çakışma çözümü bakımından farkları.
İçindekiler
Önceki ders bir kuralın seçici ve bildirim bloğundan oluştuğunu kurdu ve istasyon sayfasının ilk üç kuralını yazdı. Kurallar bir yerde durmalıdır ve durdukları yer, hem bakım maliyetini hem de sayfanın ilk çiziminin ne zaman başlayacağını belirler.
Bu ders üç bağlama yolunu tanımlar, aralarındaki farkları ölçülebilir bir örnekle gösterir ve Web’in Temelleri ve HTML kursundaki kaynak yükleme sırası dersinde kurulan engelleme davranışını biçem tarafından yeniden ele alır.
Üç Yol
Satır içi biçem (inline style) ögenin style özniteliğine yazılır. Seçici yoktur:
bildirimler doğrudan o tek ögeye bağlanır.
<h1 style="color: #8a1c1c; font-size: 2rem">Kuzey Yamaç Ölçüm İstasyonu</h1>
İç biçem (internal style sheet) belgenin baş bölümündeki bir style ögesinin içine
yazılır. Kurallar tam biçimlidir; seçiciler yalnızca o belgeye bakar.
<head> <meta charset="utf-8"> <title>Kuzey Yamaç Ölçüm İstasyonu</title> <style> h1 { font-size: 2rem; } </style> </head>
Dış biçem (external style sheet) ayrı bir .css dosyasıdır ve belgeye link ögesiyle
bağlanır. rel="stylesheet" bağlantının türünü bildirir; href kaynağın adresini verir.
<link rel="stylesheet" href="/istasyon.css">
Dördüncü bir yol daha vardır: bir biçem dosyasının içinden @import url("…") yazarak
başka bir dosya çağırmak. Bu yazım işler ama bir sıralılık getirir: içeri alınan dosyanın
adresi, onu çağıran dosya indirilip ayrıştırılmadan bilinemez. Bu yüzden @import
zinciri, aynı sayıda link ögesinden daha geç tamamlanır.
Dış Biçem Ayrı Bir Kaynaktır
Dış biçem dosyasının belgeden ayrı bir kaynak olduğu ölçülebilir. Aşağıdaki sunucu iki adresi ayrı ayrı sunar ve aldığı her isteği kütüğe yazar.
// bicem-sunucu.mjs — iki kaynagi ayri ayri sunar ve istekleri kutuge yazar import { createServer } from "node:http"; const belge = `<!doctype html> <html lang="tr"> <head> <meta charset="utf-8"> <title>Kuzey Yamac Olcum Istasyonu</title> <link rel="stylesheet" href="/istasyon.css"> <style>h1 { font-size: 2rem }</style> </head> <body> <h1 style="color: #8a1c1c">Kuzey Yamac Olcum Istasyonu</h1> </body> </html> `; const bicem = `body { font-family: system-ui; line-height: 1.5 } h1 { color: #143a52 } `; const sunucu = createServer((istek, yanit) => { console.log(`istek: ${istek.method} ${istek.url}`); if (istek.url === "/istasyon.css") { yanit.writeHead(200, { "content-type": "text/css; charset=utf-8" }); yanit.end(bicem); } else { yanit.writeHead(200, { "content-type": "text/html; charset=utf-8" }); yanit.end(belge); } }); sunucu.listen(8123, "127.0.0.1", () => { console.log("dinliyor: 127.0.0.1:8123"); });
Sunucu arka planda çalıştırılıp iki adres ayrı ayrı istenir:
node bicem-sunucu.mjs > sunucu.log 2>&1 & sleep 1 curl -s -o /dev/null -w "%{http_code} %{content_type}\n" http://127.0.0.1:8123/ curl -s -o /dev/null -w "%{http_code} %{content_type}\n" http://127.0.0.1:8123/istasyon.css cat sunucu.log
200 text/html; charset=utf-8 200 text/css; charset=utf-8 dinliyor: 127.0.0.1:8123 istek: GET / istek: GET /istasyon.css
Kütükteki iki satır, dış biçem dosyasının belgeyle birlikte gelmediğini gösterir: ikinci bir istek yapılır. Bunun üç sonucu vardır.
Birincisi, dosya yeniden kullanılabilir. On sayfa aynı istasyon.css dosyasına
bağlanırsa dosya bir kez indirilir; sonraki sayfalarda önbellekten okunur. İnternet Nasıl
Çalışır kursunda tanımlanan koşullu istek ve yaşam süresi kavramları burada işler.
İkincisi, dosya belgeden bağımsız değişebilir. Belgenin baytları değişmeden biçem güncellenebilir; tersi de doğrudur.
Üçüncüsü, ikinci istek bir maliyettir. Belge ayrıştırılırken bulunan link ögesi yeni
bir bağlantı gerektirebilir ve bu, ilk çizimin başlamasını geciktirir.
Çizim, Biçem Çözülmeden Başlamaz
Web’in Temelleri ve HTML kursundaki kaynak yükleme sırası dersinde betiklerin ayrıştırmayı engellemesi anlatılmıştı. Biçem dosyası ayrıştırmayı engellemez — belge ağacı kurulmaya devam eder — ama çizimi engeller.
Gerekçe, engellememenin sonucuna bakılınca görülür. Biçem çözülmeden çizim yapılsaydı, sayfa önce varsayılan biçemle çizilir, dosya geldiğinde yeniden çizilirdi. Kullanıcı iki farklı sayfa görürdü. Bu yüzden tanımlı davranış, biçem çözülene kadar beklemektir.
Bu kural üç pratik sonuç doğurur:
- Biçem dosyası belgenin baş bölümünde bağlanır. Gövdenin sonuna konursa çizim yine bekler, ama bekleme daha geç başlar; toplam süre uzar.
- Dosya küçük tutulur; bir sayfada kullanılmayan kurallar o sayfanın çizimini geciktirir.
- Bir bağlantı yalnızca belirli bir ortamda gerekiyorsa
mediaözniteliğiyle koşullanır. Koşulu sağlamayan bir bağlantının dosyası yine indirilir, ancak çizimi engellemez:
<link rel="stylesheet" href="/istasyon.css"> <link rel="stylesheet" href="/yazdirma.css" media="print">
İkinci dosya yazdırma çıktısı için yazılmış kuralları taşır; ekran çiziminin başlamasını beklemez.
Üç Yolun Karşılaştırması
| Ölçüt | Satır içi | İç | Dış |
|---|---|---|---|
| Seçici yazılabilir mi | Hayır | Evet | Evet |
| Birden çok belgede kullanım | Hayır | Hayır | Evet |
| Ayrı istek | Hayır | Hayır | Evet |
| Önbelleğe alınabilir | Belgeyle birlikte | Belgeyle birlikte | Bağımsız |
| Çakışmada önceliği | En yüksek | Kaynak sırasına göre | Kaynak sırasına göre |
| Sözde sınıf yazılabilir mi | Hayır | Evet | Evet |
Tablodaki iki satır ayrıca açıklama ister.
Satır içi biçemde seçici yoktur, dolayısıyla sözde sınıf da yazılamaz. Bir ögenin üzerine
gelindiğinde ya da odaklandığında değişecek bir bildirim style özniteliğine yazılamaz;
bunun için bir kural gerekir.
Satır içi biçemin önceliği en yüksektir. Bir sonraki bölümlerde göreceğimiz özgüllük hesabı satır içi bildirimleri kapsamaz; onlar hesabın dışında, daha üstte durur. Bu, satır içi bir bildirimi bir kuralla bastırmayı olağan yollarla imkânsız kılar. Sonuç şudur: satır içi biçem, bakımı en pahalı yoldur ve yalnızca değeri belge üretilirken hesaplanan durumlarda gerekçelendirilebilir.
Göreli Adresler Dosyanın Kendisine Göre Çözülür
Dış biçem dosyasının ayrı bir kaynak olmasının sık gözden kaçan bir sonucu vardır: o dosyanın içindeki göreli adresler, belgeye göre değil biçem dosyasının kendi adresine göre çözülür.
Belge /urunler/istasyon.html adresinde, biçem dosyası /bicem/istasyon.css adresinde
olsun. Biçem dosyasında background-image: url("desen.png") yazılırsa istenecek adres
/bicem/desen.png olur — /urunler/desen.png değil. Aynı yazım belgenin style
özniteliğinde geçseydi belgeye göre çözülür ve /urunler/desen.png istenirdi.
Ayrım, bir biçem dosyasını yeniden kullanılabilir kılan şeyin ta kendisidir: dosya, kendi komşusundaki varlıklara sabit bir yoldan başvurur ve hangi belgeden çağrıldığından etkilenmez. Görsel dosyalarını biçem dosyasının yanında tutmak bu yüzden bir düzen tercihinden fazlasıdır.
İstasyon Sayfasının Bağlanması
Kursun ekseninde tek bir dış dosya kullanılır. Belgenin baş bölümü şu hâle gelir:
<head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Kuzey Yamaç Ölçüm İstasyonu</title> <link rel="stylesheet" href="/istasyon.css"> </head>
istasyon.css dosyası önceki dersteki üç kuralla başlar ve kurs boyunca büyür. Belgeye
tek bir noktadan bağlanması, sonraki derslerde bir kuralı değiştirmenin belgeye
dokunmadan yapılabilmesi anlamına gelir — yapı ve sunum ayrımının dosya düzeyindeki
karşılığı budur.
Özet
- Bir biçem kümesi belgeye üç yolla bağlanır: ögenin
styleözniteliği (satır içi), baş bölümündekistyleögesi (iç) velinkögesiyle çağrılan ayrı dosya (dış). - Dış biçem dosyası ayrı bir HTTP isteğidir; bağımsız önbelleğe alınabilir ve birden çok belgede yeniden kullanılabilir, ama bir istek maliyeti getirir.
- Biçem dosyası ayrıştırmayı engellemez, çizimi engeller; bu, sayfanın iki kez farklı görünmesini önlemek için tanımlanmış bir davranıştır.
mediaözniteliğiyle koşullanan bir bağlantının dosyası indirilir ama koşul sağlanmıyorsa çizimi engellemez.- Satır içi biçemde seçici yoktur, dolayısıyla durum biçemi yazılamaz; ayrıca önceliği özgüllük hesabının üstünde olduğu için bastırılması güçtür.
Sonraki Adım
Kurallar artık belgeye ulaşıyor, ama hangi ögelere ulaştıkları henüz tek bir örnekle
sınırlı. h1 yazmak bütün birinci düzey başlıkları seçer; peki yalnızca ölçüm
çizelgesindeki eksik değerleri seçmek gerekirse? Sonraki ders seçicinin dört temel türünü
tanımlar — tür, sınıf, kimlik ve evrensel seçici — ve her birinin belge ağacında hangi
kümeyi döndürdüğünü çalıştırılabilir bir eşleyiciyle ölçer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.