Blok 3 · Ders 18
Web nasıl çalışır?
Tarayıcı, sunucu, URL, HTTP ve HTML/CSS/JavaScript üçlüsü; geliştirici araçlarıyla bir sitenin içine bakıyorsun.
Bu dersin sonunda
- Adres çubuğuna bir adres yazınca istemci ile sunucu arasında olanları sırasıyla anlatabilirsin
- Bir URL'yi protokol, alan adı, port, yol, sorgu ve parça olarak ayırabilirsin
nslookupile bir alan adının IP adresini bulabilir, DNS hatasını tanıyabilirsin- HTML, CSS ve JavaScript'in görevlerini ayırt edip ilk web sayfanı yazabilirsin
- Sayfanı Live Server ya da
npx serveile kendi bilgisayarındaki bir sunucudan açabilirsin - Geliştirici araçlarının Elements, Console ve Network sekmeleriyle bir sayfanın içine bakabilirsin
Bu sayfada
- İstemci ve sunucu
- Adres yazınca neler olur?
- URL'nin parçaları
- DNS: alan adından IP adresine
- HTTP: istek ve yanıta ilk bakış
- Sayfanın üç dili: HTML, CSS, JavaScript
- İlk HTML dosyan
- Görünüm ve davranış ekle
- Neden yerel sunucu?
- Live Server ile aç
- Alternatif: npx serve
- Geliştirici araçları: sayfanın içine bak
- Sık hatalar
- Görevler
- Kendini sına
- Kayıt noktası
Şimdiye kadar yazdığın bütün programlar terminalde çalıştı. Bu blokla sahne değişiyor: tarayıcıda açılan sayfalar yapacaksın. Önce adres çubuğuna bir adres yazıp Enter'a basınca perde arkasında olanları öğreneceksin. Dersin sonunda ilk web sayfanı (C:\kod\web-ilk) yazmış, kendi bilgisayarındaki bir sunucudan açmış ve geliştirici araçlarıyla içine bakmış olacaksın.
İstemci ve sunucu
Bir web sayfası senin bilgisayarında değil, başka bir bilgisayarda durur: çoğu zaman bir veri merkezinde gece gündüz açık bekleyen bir makinede. Adresi yazınca tarayıcın o makineye "bu sayfayı bana ver" der, makine de sayfayı gönderir. Konuşmanın iki tarafı var: isteyen ve veren.
"Sunucu" kulağa özel bir donanım gibi gelse de sıradan bir programdır: bu derste kendi bilgisayarında birini çalıştıracak, Ders 27'de de kendin yazacaksın.
Adres yazınca neler olur?
Adres çubuğuna xdd.baby/ders18 yazıp Enter'a bastığında, sayfa ekrana gelmeden önce beş şey sırayla olur. Hepsi çoğu zaman bir saniyeden kısa sürer.
- Adı numaraya çevir. Bilgisayarlar birbirini adla değil numarayla bulur; tarayıcı önce
xdd.baby'nin numarasını, yani IP adresini öğrenir. Bu işin adı DNS. - Bağlan. Tarayıcı o numaraya bir bağlantı açar. Adres
httpsile başlıyorsa bağlantı şifrelenir: aradaki kimse ne istediğini ve ne geldiğini okuyamaz. Şifresizhttpsitelerde tarayıcı adres çubuğuna Güvenli değil (Not secure) yazar. - İstek gönder. Tarayıcı ne istediğini yazar: "
/ders18sayfasını ver." - Yanıtı al. Sunucu bir durum kodu (her şey yolundaysa
200) ve sayfanın HTML'ini gönderir. - Çiz. Tarayıcı HTML'i okur; içinde bir stil dosyasının, JavaScript dosyasının ya da resmin adı geçtikçe her biri için yeni bir istek gönderir ve parçalar geldikçe sayfayı ekrana çizer.
Beşinci adım önemli: bir sayfa tek istek değildir. Bu sayfayı açarken tarayıcın stil dosyası, yazı tipleri ve küçük resimler için de istek gönderdi; hepsini geliştirici araçlarında göreceksin.
URL'nin parçaları
Adres çubuğuna yazdığın şeyin adı URL. Bir URL tek satırda hangi dille konuşulacağını, hangi bilgisayara gidileceğini ve orada hangi sayfanın istendiğini söyler. Parçalarını tanırsan adresleri de hata mesajlarını da rahat okursun.
| Parça | Örnekte | Ne işe yarar? | Sunucuya gider mi? |
|---|---|---|---|
| protokol | https | Hangi dille konuşulacağı; https, HTTP'nin şifreli hâli. | evet |
| alan adı | example.com | Hangi bilgisayar; DNS ile numaraya çevrilir. | evet |
| port | yazılmamış | O bilgisayarın hangi kapısı; https için 443 varsayılır. | evet |
| yol | /sampiyonlar/ahri | Oradaki hangi sayfa ya da dosya. | evet |
| sorgu | ?dil=tr | Ek bilgi: ad=değer çiftleri, aralarında &. | evet |
| parça | #yetenekler | Sayfanın içindeki bir yer; tarayıcı oraya kaydırır. | hayır |
Son satıra dikkat: # ile başlayan parça sunucuya hiç gönderilmez, tarayıcıda kalır. Bu sayfada dene: "Bu sayfada" listesinden bir başlığa tıkla; adresin sonuna #url-nin-parcalari gibi bir parça eklenir, sayfa kayar ama yeniden yüklenmez.
JavaScript de adresleri parçalar
Ders 16'da kendi sınıflarını yazdın. JavaScript'in hazır sınıflarından biri URL: ona new ile bir adres verirsen adresi parçalarına ayırır. C:\kod\ogren klasöründe ders18.js dosyasını oluştur ve yaz:
const adres = new URL("https://example.com/sampiyonlar/ahri?dil=tr#yetenekler")console.log(adres.protocol)console.log(adres.hostname)console.log(adres.pathname)console.log(adres.search)console.log(adres.hash)https:example.com/sampiyonlar/ahri?dil=tr#yeteneklerHer parça objenin bir alanı: protocol protokol (sonundaki iki nokta dahil), hostname alan adı, pathname yol, search sorgu, hash parça. Bütün alanları birden görmek için objenin kendisini yazdır:
const adres = new URL("https://example.com/sampiyonlar/ahri?dil=tr#yetenekler")console.log(adres)URL { href: 'https://example.com/sampiyonlar/ahri?dil=tr#yetenekler', origin: 'https://example.com', protocol: 'https:', username: '', password: '', host: 'example.com', hostname: 'example.com', port: '', pathname: '/sampiyonlar/ahri', search: '?dil=tr', searchParams: URLSearchParams { 'dil' => 'tr' }, hash: '#yetenekler'}port: '' satırına bak: adreste port yazılmadığı için boş. Tanımadığın alanlara (origin, searchParams) şimdilik takılma. example.com tam da böyle örnekler için ayrılmış gerçek bir alan adıdır.
TypeError: Invalid URLNe zaman çıkar? new URL'e adresi protokolsüz verince. Tarayıcının adres çubuğu xdd.baby yazmana izin verir, başına https://'yi kendisi ekler; JavaScript eklemez.
const adres = new URL("xdd.baby/ders18")node:internal/url:840 href = bindingUrl.parse(input, base, true); ^ TypeError: Invalid URL at new URL (node:internal/url:840:25) at Object.<anonymous> (C:\kod\ogren\ders18.js:1:15) ... at node:internal/main/run_main_module:33:47 { code: 'ERR_INVALID_URL', input: 'xdd.baby/ders18'} Node.js v24.20.0Nasıl düzelir? Adresi tam yaz: new URL("https://xdd.baby/ders18"). Mesajın en üstünde senin dosyan değil Node'un kendi dosyası (node:internal/url) var, çünkü hata URL sınıfının içinde fırlatıldı; kendi satırını at satırlarında ders18.js'i arayarak bulursun. Alttaki input: satırı JavaScript'in beğenmediği metni gösterir.
DNS: alan adından IP adresine
İnternete bağlı her cihazın bir numarası var: IP adresi, yani 76.76.21.21 gibi noktalarla ayrılmış dört sayı. Bilgisayarlar birbirini bu numarayla bulur, insanlar ise ad hatırlar: xdd.baby. Ad ile numara arasındaki çeviriyi DNS yapar.
nslookup: rehbere kendin sor
DNS'e terminalden de sorabilirsin. VS Code'un terminaline (ya da bir PowerShell penceresine) yaz:
PS C:\kod> nslookup xdd.babyServer: dns.googleAddress: 2001:4860:4860::8888 Non-authoritative answer:Name: xdd.babyAddress: 76.76.21.21Serverve altındakiAddress: soruyu cevaplayan DNS sunucusu. Bu ders yazılırken Google'ın DNS'iydi; sende büyük ihtimalle modemin görünür (çoğu evdeUnKnownve192.168.1.1).Non-authoritative answer: "yetkili olmayan cevap", yani cevabı alan adının sahibi değil, hafızasında tutan aracı bir sunucu verdi. Normaldir.Nameve en alttakiAddress: aradığın cevap.xdd.baby'nin numarası76.76.21.21.
Bu çıktı, Windows görüntüleme dili Türkçe olan bir bilgisayarda alındı; nslookup yine İngilizce yazdı. Windows'u baştan Türkçe kurulmuş bazı bilgisayarlarda satır adları Türkçe çıkabilir; ad ve numaralar aynı yerde durur. Birden çok numara varsa Addresses altında sıralanır.
Bu siteye ulaşılamıyor / This site can’t be reachedNe zaman çıkar? Olmayan bir alan adına gidince, örneğin adı yanlış yazınca: DNS bir numara bulamaz, tarayıcının bağlanacağı bir yer kalmaz. Denemek için adres çubuğuna başıyla birlikte https://xdd.bbay yaz. Yalnız xdd.bbay yazarsan tarayıcı sonunu tanımadığı bu adı arama sanıp arama sonuçlarını açabilir.

İngilizce tarayıcıda başlık This site can’t be reached, altındaki satır xdd.bbay’s server IP address could not be found. olur. ERR_NAME_NOT_RESOLVED "ad çözülemedi" demek; Chrome bazen yerine DNS_PROBE_FINISHED_NXDOMAIN yazar, anlamı aynı. nslookup da aynısını söyler:
PS C:\kod> nslookup xdd.bbayServer: dns.googleAddress: 2001:4860:4860::8888 *** dns.google can't find xdd.bbay: Non-existent domainNasıl düzelir? Adres çubuğundaki adı harf harf oku. Ad doğruysa ve başka siteler de açılmıyorsa sorun internet bağlantında ya da DNS ayarlarındadır.
HTTP: istek ve yanıta ilk bakış
Bağlantı açıldıktan sonra tarayıcı ile sunucunun konuştuğu dilin adı HTTP. Ders 15'te fetch ile Data Dragon'a istek gönderdiğinde de bu dili kullandın. Tarayıcı her sayfa için aynı konuşmayı yapar; konuşma metindir ve okunabilir:
İsteğin ilk satırı en önemlisi: GET /ders18. GET isteğin metodudur, yani türü: "bana ver" demektir; sayfa açmak da resim indirmek de GET'tir. (Sözcük aynı ama Ders 5'teki obje metotlarıyla ilgisi yok.)
Sondaki HTTP/1.1 konuşulan dilin sürümü. Altındaki satırlar başlıklardır (headers): Host hangi site (aynı IP adresinde birçok site durabilir), User-Agent hangi tarayıcı.
Yanıtın ilk satırında sürümden sonra durum kodu gelir; Ders 15'teki yanit.status buydu. En sık göreceklerin:
| Kod | Anlamı | Ne zaman görürsün? |
|---|---|---|
200 | tamam (OK) | İstediğin geldi. |
301 | kalıcı olarak taşındı | Adres değişmiş; tarayıcı yeni adrese kendisi gider. |
304 | değişmedi | Dosya tarayıcının elindekiyle aynı; kendi kopyasını kullanır. |
404 | bulunamadı | Yol yanlış ya da dosya yok. |
500 | sunucu hatası | Sunucudaki program hataya düştü. |
Yanıt başlıklarından biri bu derste işine yarayacak: Content-Type. Sunucu gönderdiği şeyin türünü burada söyler: text/html sayfa, text/css stil dosyası, application/json JSON. Sondaki charset=utf-8 metnin harf kodlamasıdır; Türkçe harflerin doğru görünmesi buna bağlı.
Boş satırdan sonra gövde gelir: sayfanın HTML'inin kendisi. Metotların, başlıkların ve durum kodlarının hepsini Ders 26'da göreceksin.
Sayfanın üç dili: HTML, CSS, JavaScript
Sunucudan gelen sayfa üç dilde yazılır, her birinin ayrı işi var:
- HTML sayfada ne olduğunu söyler: bu bir başlık, bu bir paragraf, bu bir düğme.
- CSS bunların nasıl görüneceğini söyler: başlık altın sarısı, zemin koyu, düğmenin köşeleri yuvarlak.
- JavaScript sayfanın ne yapacağını söyler: düğmeye basınca altın artsın, liste süzülsün.
JavaScript'i zaten tanıyorsun: tarayıcının içinde de bir JavaScript motoru var, dil aynı. Değişen ortam: tarayıcıdaki JavaScript sayfaya dokunur ama diskindeki dosyaları okuyamaz; Node dosya okur ama ortada sayfa yoktur. Sayfayla konuşmayı Ders 22'de öğreneceksin.
İlk HTML dosyan
Kendi sayfanı yazma sırası. Önce klasörünü hazırla:
- VS Code terminalinde
cd C:\kodyaz, ardındanmkdir web-ilkile yeni klasörü oluştur. - File → Open Folder ile
C:\kod\web-ilkklasörünü aç. Soldaki dosya listesinin başında WEB-ILK yazmalı. Güven sorusu gelirse Ders 0'daki gibi Yes, I trust the authors'a bas. - Dosya listesinde boş bir yere sağ tıkla, New File seç ve adını
index.htmlkoy: küçük harf, uzantısı.html.
Neden index.html? Bir sunucuya klasörün kendisi sorulunca (/), sunucu o klasördeki index.html'i gönderir. Sitelerin ana sayfasının dosya adı neredeyse her zaman budur.
Dosyaya şunu yaz. Kopyalama; parmakların etiketlerin yazımına alışsın:
<!doctype html><html lang="tr"><head> <meta charset="utf-8"> <title>İlk sayfam</title></head><body> <h1>Sihirdar Vadisi'ne hoş geldin</h1> <p>Bu sayfayı kendi elimle yazdım.</p> <p>Görünüm için CSS, davranış için JavaScript ekleyeceğim.</p></body></html>< ile > arasındaki sözcüklere etiket (tag) denir. Çoğu etiket çift gelir: <h1> açar, eğik çizgili </h1> kapatır, arası içeriktir. Etiketleri Ders 19'da tek tek göreceksin; şimdilik iskeleti kalıp olarak yaz ve satırların işini bil:
| Satır | Ne işe yarar? |
|---|---|
<!doctype html> | "Bu modern bir HTML sayfası" der; hep ilk satır. |
<html lang="tr"> | Bütün sayfayı sarar; içerik Türkçe. |
<head> | Sayfa hakkında bilgiler; sayfada görünmez. |
<meta charset="utf-8"> | Harflerin hangi kodlamayla yazıldığı. |
<title> | Sekmede görünen ad. |
<body> | Sayfada görünen her şey. |
<h1>, <p> | Ana başlık, paragraf. |
VS Code dosyalarını zaten UTF-8 olarak kaydeder; sağ alttaki durum çubuğunda UTF-8 yazar. meta satırı bunu tarayıcıya da söyler. Yoksa ne olduğunu sık hatalarda göreceksin.
Tarayıcıda açmak
Dosyayı kaydet (Ctrl+S). Sonra Dosya Gezgini'nde (File Explorer) C:\kod\web-ilk klasörüne git ve index.html'e çift tıkla. Varsayılan tarayıcın açılır:
Adres çubuğuna bak: file:///C:/kod/web-ilk/index.html. Tarayıcın baştaki file:/// yerine yalnız Dosya (File) yazısı gösteriyorsa adres çubuğuna tıkla, tamamı görünür.
Protokol bu sefer file: tarayıcı sayfayı bir sunucudan istemedi, doğrudan diskinden okudu. DNS yok, istek yok, yanıt yok. Sekmede de <title>'a yazdığın "İlk sayfam" görünür.
Şimdi <h1> içindeki yazıyı değiştir, kaydet ve tarayıcıda F5 ile yenile; yeni yazı gelir. Yaz, kaydet, yenile: web geliştirmenin nabzı bu döngüdür.
Görünüm ve davranış ekle
Sayfan çalışıyor ama bembeyaz. Şimdi ona görünüm (CSS) ve davranış (JavaScript) ekleyeceksin; ikisi ayrı dosyalarda duracak, HTML onları adlarıyla çağıracak. web-ilk klasöründe stil.css adlı bir dosya oluştur:
body { font-family: sans-serif; background-color: #0f1923; color: #f0e6d2;} h1 { color: #c8aa6e;}Her kural "hangi parça { özellik: değer; }" biçimindedir: body (sayfanın gövdesi) için yazı tipi ve renkler, h1 için başlık rengi; #0f1923 gibi değerler renk kodudur. CSS'i Ders 20'de öğreneceksin. Sonra uygulama.js:
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log("Sayfa yüklendi")console.log("Takımda " + takim.length + " şampiyon var")PS C:\kod\web-ilk> node uygulama.jsSayfa yüklendiTakımda 5 şampiyon varBu dosyada sayfaya özgü bir şey yok, bu yüzden Node'da da çalışır; birazdan onu tarayıcı çalıştıracak.
Şimdi index.html'i iki satırla bu dosyalara bağla ve son paragrafı da güncelle:
<!doctype html><html lang="tr"><head> <meta charset="utf-8"> <title>İlk sayfam</title> <link rel="stylesheet" href="stil.css"></head><body> <h1>Sihirdar Vadisi'ne hoş geldin</h1> <p>Bu sayfayı kendi elimle yazdım.</p> <p>Görünüm için CSS, davranış için JavaScript ekledim.</p> <script src="uygulama.js"></script></body></html><link rel="stylesheet" href="stil.css">"bu sayfanın stil dosyası şu" der.hrefdosyanın adresidir; yalnız adını yazdığın için tarayıcı onu sayfanın yanında, aynı klasörde arar.<script src="uygulama.js"></script>"şu JavaScript dosyasını çalıştır" der. Sayfanın sonuna koyduk ki tarayıcı önce sayfayı çizsin, sonra kodu çalıştırsın; ayrıntısı Ders 22'de.
Kaydet ve tarayıcıda yenile:
JavaScript nerede? console.log sayfaya değil, tarayıcının Console bölümüne yazar. F12'ye bas ve açılan geliştirici araçlarında Console sekmesine tıkla (Türkçe tarayıcıda Konsol): Sayfa yüklendi ve Takımda 5 şampiyon var orada. Aynı dosya, aynı çıktı; bu sefer onu terminal değil tarayıcı çalıştırdı.
Neden yerel sunucu?
Çift tıklayıp açmak şimdiye kadar işini gördü. Ama gerçek siteler sunucudan gelir ve file:// ile açılan sayfa bazı şeyleri yapamaz; şimdi birine çarpacaksın.
Takımı kodun içine yazmak yerine ayrı bir JSON dosyasından okumak istiyorsun. web-ilk klasöründe takim.json oluştur:
["Ahri", "Garen", "Jinx", "Lux", "Teemo"]uygulama.js'in içini sil ve dosyayı Ders 15'teki gibi fetch ile isteyen hâlini yaz:
async function takimiYukle() { const yanit = await fetch("takim.json") const takim = await yanit.json() console.log("Takımda " + takim.length + " şampiyon var, ilki " + takim[0])} console.log("Sayfa yüklendi")takimiYukle()fetch'e yalnız dosyanın adını verdin; tarayıcı onu sayfanın adresine göre tamamlar (Node bunu yapamaz, bu kodu terminalde çalıştırma). Kaydet, file:// ile açtığın sayfayı yenile ve Console'a bak.
Access to fetch at 'file:///…' has been blocked by CORS policyNe zaman çıkar? Çift tıklayarak (file:// ile) açtığın bir sayfada fetch ile başka bir dosya isteyince:
Sayfa yüklendiAccess to fetch at 'file:///C:/kod/web-ilk/takim.json' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: chrome, chrome-extension, chrome-untrusted, data, http, https, isolated-app.GET file:///C:/kod/web-ilk/takim.json net::ERR_FAILEDUncaught (in promise) TypeError: Failed to fetch takimiYukle @ uygulama.js:2 (anonymous) @ uygulama.js:8Son iki satır, hatanın solundaki üçgene tıklayınca açılır: hata uygulama.js'in 2. satırında, takimiYukle'nin içindeki fetch'te çıktı; o fonksiyonu da 8. satır çağırdı. Uncaught (in promise), Ders 15'teki yakalanmamış ret: fetch'in Promise'i reddedildi ve onu kimse yakalamadı.
Neden? Uzun satırın sonu, Cross origin requests are only supported for protocol schemes: …, "başka yerden veri istemek yalnız şu protokollerde olur" demek; listede http ve https var, file yok. Bu bir güvenlik kuralı: yoksa indirdiğin zararlı bir HTML dosyası diskindeki belgeleri okuyup dışarı gönderebilirdi. CORS, tarayıcının "hangi sayfa hangi adresten veri alabilir" kurallarıdır; ayrıntısı Ders 24'te.
Nasıl düzelir? Sayfayı bir sunucudan aç; aşağıda iki yolunu göreceksin.
file:// ile çift tıklamak | Yerel sunucu (http://) | |
|---|---|---|
| Sayfa nereden gelir? | Doğrudan diskten | Kendi bilgisayarındaki bir sunucudan, HTTP ile |
fetch ile dosya okumak | Çalışmaz | Çalışır |
| Kaydedince yenilemek | Elle F5 | Live Server kendisi yeniler |
İki yol var: VS Code'un Live Server eklentisi ve terminalden npx serve. Birini seçmen yeter; çoğu kişi Live Server'ı kullanır.
Live Server ile aç
Live Server bir VS Code eklentisi (extension). İki işi var: klasörünü küçük bir sunucuyla yayınlar ve sen kaydedince tarayıcıdaki sayfayı yeniler.
- VS Code'da
C:\kod\web-ilkklasörünün açık olduğundan emin ol. - Soldaki dikey çubukta dört kareli Extensions simgesine tıkla (ya da Ctrl+Shift+X).
- Arama kutusuna
Live Serveryaz, yayıncısı Ritwick Dey olanı seç. Adı benzeyen eklentiler de var; doğrusunun kurulum sayısı 80 milyonu geçer. - Install'a bas. Bu yayıncıdan ilk kez eklenti kuruyorsan VS Code "Do you trust the publisher…?" diye sorar; Trust Publisher & Install'a bas.
- Dosya listesinden
index.html'i aç ve sağ alttaki durum çubuğunda Go Live yazısına tıkla. Aynı işi dosya listesindeindex.html'e sağ tıklayıp Open with Live Server'ı seçerek de yapabilirsin. - Tarayıcın
http://127.0.0.1:5500/index.htmladresiyle açılır. Durum çubuğundaki yazı Port : 5500 olur.
Arayüz değişmiş olabilir; düğmeler biraz farklıysa şu sözcükleri ara: Live Server, Ritwick Dey, Install, Go Live.
Sayfa aynı, adres farklı. Console'da bu sefer Takımda 5 şampiyon var, ilki Ahri satırı da var, çünkü takim.json artık HTTP ile istendi. Şimdi index.html'de başlığı değiştir ve kaydet: sayfa kendiliğinden yenilenir.
Bu, Şekil 18.3'ün alt satırındaki adres. 127.0.0.1 her bilgisayarda "bu bilgisayarın kendisi" demektir ve adı localhost'tur. Tarayıcı bu adres için DNS'e sormaz, istek bilgisayarından hiç çıkmaz; bu yüzden şifresiz http burada sorun değildir.
:5500 kısmı port. Bir bilgisayarda aynı anda birçok sunucu çalışabilir; port, isteğin hangisine gideceğini söyler. Gerçek sitelerde portu yazmazsın, çünkü https için 443, http için 80 varsayılır: Şekil 18.2'deki 76.76.21.21:443 buydu.
İşin bitince durum çubuğundaki Port : 5500 yazısına tıkla; sunucu kapanır ve sağ altta Server is now offline. yazar. 5500'ü başka bir program kullanıyorsa Live Server 5501'i dener ve bu yeni portu ayar olarak saklar; klasöründe .vscode\settings.json diye bir dosya belirirse sebebi budur. Hangi durumda olursa olsun adres çubuğundaki portu oku.
Open a folder or workspace... (File -> Open Folder)Ne zaman çıkar? VS Code'da klasör açmadan, yalnız bir dosya açıkken Go Live'a basınca. Live Server bir klasörü yayınlar; klasör yoksa neyi yayınlayacağını bilemez.
Nasıl düzelir? File → Open Folder ile C:\kod\web-ilk'i aç, index.html'i seç, yeniden Go Live'a bas. Go Live hiç görünmüyorsa sol alta bak: Restricted Mode yazıyorsa Live Server kapalı kalır; Ders 0'daki gibi klasöre güven.
Alternatif: npx serve
Live Server'ı kuramıyorsan ya da VS Code dışında çalışıyorsan tek komutla da sunucu açabilirsin. npx, npm'le gelen bir araçtır: bir paketi projene kurmadan indirip çalıştırır; buradaki paket serve. VS Code terminalinde, C:\kod\web-ilk klasöründeyken:
PS C:\kod\web-ilk> npx serveNeed to install the following packages:serve@14.2.6Ok to proceed? (y) ┌──────────────────────────────────────────┐ │ │ │ Serving! │ │ │ │ - Local: http://localhost:3000 │ │ - Network: http://192.168.1.50:3000 │ │ │ │ Copied local address to clipboard! │ │ │ └──────────────────────────────────────────┘ HTTP 11.10.2026 21:04:49 ::1 GET / HTTP 11.10.2026 21:04:49 ::1 Returned 200 in 21 ms HTTP 11.10.2026 21:04:49 ::1 GET /stil.css HTTP 11.10.2026 21:04:49 ::1 GET /uygulama.js HTTP 11.10.2026 21:04:49 ::1 Returned 200 in 3 ms HTTP 11.10.2026 21:04:49 ::1 Returned 200 in 2 ms HTTP 11.10.2026 21:04:49 ::1 GET /takim.json HTTP 11.10.2026 21:04:49 ::1 Returned 200 in 2 ms HTTP 11.10.2026 21:04:49 ::1 GET /favicon.ico HTTP 11.10.2026 21:04:49 ::1 Returned 404 in 6 ms- İlk seferde npx paketi indirmek için izin ister; Enter'a basman yeter (parantezdeki
y"evet" ve varsayılan cevap). Sürüm numarası sende daha yeni olabilir. Local: http://localhost:3000: sayfanın adresi, port bu sefer 3000. Adres panoya da kopyalandı. 3000'i başka bir program kullanıyorsaserverastgele boş bir port seçer ve kutuyaThis port was picked because 3000 is in use.yazar; adresi hep kutudan oku.Networksatırı aynı ağdaki başka bir cihazdan (telefonun gibi) açmak içindir ve sende farklıdır.- Kutunun altındaki satırlar mutfağın sipariş fişleri: sunucu her isteği yazar.
GET /klasörün kendisi (sunucuindex.html'i gönderdi), ardından stil dosyası, JavaScript vefetch'in istediğitakim.json; hepsi200.::1,127.0.0.1'in yeni (IPv6) yazımı. Tarih biçimi Windows'unun bölge ayarına göre değişir. favicon.icoiçin404: Console'da da göreceğin sekme simgesi isteği. Zararsızdır.
Durdurmak için terminalde Ctrl+C'ye bas; INFO Gracefully shutting down. Please wait... yazar ve komut satırı geri gelir. İki fark daha: serve kendiliğinden yenilemez (F5 senden) ve adreslerden .html'i siler. /index.html yazarsan iki kez 301 ile önce /index'e, sonra /'ye yönlendirir.
Geliştirici araçları: sayfanın içine bak
Ders 0'da F12 ile açılan bir bölme gördün; şimdi onu kullanacaksın. Sayfanı Live Server ile aç ve F12'ye bas (ya da sayfada sağ tıklayıp İncele / Inspect). Chrome, Edge ve Brave'de bu bölme hemen hemen aynıdır; aşağıdaki gerçek görüntüler Chrome'un temeli Chromium'dan.
Bölme pencerenin sağına ya da altına yerleşir; yerini sağ üstteki ⋮ menüsünde Dock side (Yerleşim tarafı) satırından değiştirirsin. Tarayıcın Türkçeyse sekmelerin adları da Türkçedir:
| İngilizce | Türkçe tarayıcıda | Ne gösterir? |
|---|---|---|
| Elements | Öğeler | Sayfanın HTML'i, canlı hâliyle |
| Console | Konsol | JavaScript mesajları, hatalar ve kod yazılan satır |
| Network | Ağ | Sayfanın bütün istekleri ve yanıtları |
| Sources | Kaynaklar | Sayfanın dosyaları |
Elements: canlı HTML

Elements sayfanın HTML'ini ağaç olarak gösterir. Ağaçta bir satırın üstüne gelince sayfada o parça boyanır: görüntüde <h1> seçili, başlık mavi, çevresindeki boşluk turuncu. Tersi için sol üstteki ok simgesine, sonra sayfada bir parçaya tıkla. Sağdaki Styles seçili parçanın CSS kurallarını, geldikleri yerle (stil.css:7) gösterir.
Şunu dene: <h1> satırındaki yazıya çift tıkla, başka bir şey yaz ve Enter'a bas; sayfa anında değişir. F5'e basınca eski yazı geri gelir. Elements'teki değişiklik yalnız tarayıcının bellekteki kopyasındadır; dosyana da sunucuya da bir şey gitmez.
Ağacın sonundaki <!-- Code injected by live-server --> yorumunu ve <script>'i sen yazmadın: Live Server sayfayı gönderirken ekliyor, kaydettiğinde sayfayı yenileyen kod bu. Sayfayı npx serve ile açarsan görünmez.
Console: mesajlar ve hatalar

Console'da üç tür satır görürsün:
- Senin mesajların: sağlarında geldikleri dosya ve satır yazar (
uygulama.js:7); tıklarsan o satıra gidersin. - Araçların mesajları:
Live reload enabled.Live Server'ın "otomatik yenileme açık" demesi. Sayfayı yenileyince bir daha görünmeyebilir. - Hatalar: kırmızı satırlar. Buradaki zararsız: tarayıcı sekmedeki küçük simgeyi (favicon) kendiliğinden istedi, sende
favicon.icoyok,404geldi. Sağ üstteki kırmızı1hata sayısı.
En alttaki > işaretinin yanına JavaScript yazıp Enter'a basabilirsin: 2 + 3 yaz, 5 döner. Sayfan "çalışmıyor" gibi görünüyorsa ilk bakacağın yer burası.
Network: bütün istekler

Network yalnız geliştirici araçları açıkken olan istekleri kaydeder; liste boşsa sayfayı yenile (F5). Her satır bir istek. Sütunlar (Türkçesi parantezde):
- Name (Ad) istenen dosya, Status (Durum) durum kodu, Type (Tür) dosyanın türü:
documentsayfanın kendisi. - Initiator (Başlatan) isteği kimin gönderdiğini söyler:
index.html:6<link>satırı,index.html:12<script>satırı,uygulama.js:2defetch. Tarayıcının HTML'de adı geçen her dosyayı ayrıca istediği burada görünür. - Size (Boyut) ve Time (Zaman): gelen veri ve geçen süre.
ws satırı Live Server'ın tarayıcıyla açık tuttuğu bağlantı (101: "protokol değiştiriliyor"); kaydettiğinde "yenile" haberi buradan gelir.
Bir satıra tıklayınca ayrıntısı açılır: Headers (Başlıklar) HTTP bölümünde gördüğün parçaları, Response (Yanıt) sunucunun gönderdiği metni gösterir. Bunu bu sitede de dene: F12, Network, F5, en üstteki satır, Headers.

ders18 olur.General (Genel) bölümünde Request URL (İstek URL'si), Request Method (İstek yöntemi) ve Status Code (Durum kodu) var. Remote Address (Uzak adres) 76.76.21.21:443: nslookup'ta bulduğun numara ve https'nin kapısı. Aşağıda :method, :path gibi iki noktalı başlık adları görürsen şaşırma; tarayıcın bu siteyle HTTP'nin yeni sürümü HTTP/2'yi konuşuyor.
Uncaught ReferenceError: takm is not definedNe zaman çıkar? Sayfadaki JavaScript'te bir adı yanlış yazınca: Node'dan tanıdığın hata, bu kez Console'da. Şu satırda takim yerine takm yazılmış:
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log("Sayfa yüklendi")console.log("Takımda " + takm.length + " şampiyon var")Sayfa yüklendiC:\kod\web-ilk\uygulama.js:3console.log("Takımda " + takm.length + " şampiyon var") ^ ReferenceError: takm is not defined at Object.<anonymous> (C:\kod\web-ilk\uygulama.js:3:26) ... Node.js v24.20.0Yukarıdaki, Node'un terminale yazdığı. Tarayıcıda aynı dosya Console'a şunu yazar:
Sayfa yüklendiUncaught ReferenceError: takm is not defined at uygulama.js:3:26Uncaught "yakalanmadı" demek: hatayı bir try/catch yakalamadı (Ders 13). Sayfa kapanmaz, çizilmiş hâliyle durur; ama o dosyada hatadan sonraki satırlar çalışmaz. Sayfan yarım çalışıyor gibiyse önce Console'a bak.
Nasıl düzelir? Sağdaki uygulama.js:3 bağlantısına tıkla; Sources sekmesi dosyayı o satırda açar. Adı tanımladığın hâliyle yaz.
Refused to apply style from '…' because its MIME type ('text/html') is not a supported stylesheet MIME typeNe zaman çıkar? <link>'teki dosya adını yanlış yazınca (stil.ccs). Sayfa stilsiz, düz siyah beyaz görünür.
<link rel="stylesheet" href="stil.ccs">Refused to apply style from 'http://127.0.0.1:5500/stil.ccs' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.Neden? Mesaj yanıltıcı: asıl sorun "MIME türü" değil, dosyanın bulunamaması. Network'e bak: stil.ccs satırı kırmızı, durumu 404. Live Server "böyle bir dosya yok" diyen küçük bir HTML sayfası (Cannot GET /stil.ccs) gönderdi; tarayıcı stil dosyası beklerken HTML gelince onu uygulamadı.
MIME türü, Content-Type başlığındaki text/html, text/css gibi tür adlarıdır. JavaScript dosyasının adını yanlış yazarsan kardeşini görürsün: Refused to execute script from '…' because its MIME type ('text/html') is not executable.
Nasıl düzelir? Network'teki kırmızı satırın adını klasöründeki dosya adıyla karşılaştır; href ya da src'deki yazımı düzelt.
Sık hatalar
Bu derste karşılaşabileceğin öteki hatalar; hepsi hata rehberinde de var.
hoÅŸ geldinNe zaman çıkar? <meta charset="utf-8"> satırı yoksa ve sunucu da kodlamayı söylemiyorsa. Tarayıcı tahmin eder ve eski bir Batı ya da Türkçe kodlama seçer: UTF-8'de iki bayt tutan her Türkçe harf iki garip işarete dönüşür, sekmedeki başlık da İlk sayfam olur.

meta satırı olmayan ilk sayfa, kodlamasını söylemeyen bir sunucudan gelince (gerçek ekran görüntüsü).Bu hatayı her zaman göremezsin: çift tıklayınca Chrome UTF-8 olduğunu kendisi anlar; Live Server charset=UTF-8, serve de charset=utf-8 der (büyük ya da küçük harf fark etmez). Ama kodlamayı söylemeyen bir sunucuda harfler böyle bozulur; Ders 27'de kendi sunucunu yazarken bunu yaşayacaksın.
Nasıl düzelir? <head>'in ilk satırı <meta charset="utf-8"> olsun; tahmine bırakma. Dosyanın kendisi de UTF-8 kaydedilmiş olmalı: VS Code'un durum çubuğunda UTF-8 yazdığına bak.
Ne zaman çıkar? Dosyayı değiştirip kaydetmeden tarayıcıyı yenileyince. Tarayıcı da sunucu da diskteki dosyayı okur, VS Code'da kaydetmediğin hâli bilmez; Live Server da yalnız kaydedince yeniler.
<body> <h1>Sihirdar Vadisi'ne tekrar hoş geldin</h1>Nasıl düzelir? Sekmedeki ● işaretine bak ve Ctrl+S ile kaydet; Ders 0'daki File → Auto Save bu sorunu neredeyse bitirir. Kaydettiğin hâlde değişmiyorsa sonraki karta bak: belki başka bir dosyaya bakıyorsun.
Ne zaman çıkar? Bilgisayarında aynı adlı iki dosya varsa (indirilenler klasöründe bir index.html, C:\kod\web-ilk'te bir tane) ya da sunucuyu yanlış klasörde başlatınca. Örneğin npx serve'ü C:\kod'da çalıştırırsan sayfan yerine klasörlerin listesi gelir:

Nasıl düzelir? Adres çubuğunu oku: file:/// ile açtıysan tam yol orada yazar, gerçekten C:/kod/web-ilk/index.html mi? Sunucu kullanıyorsan terminalin istemine bak; PS C:\kod> değil PS C:\kod\web-ilk> olmalı. Ctrl+C ile durdur, cd web-ilk ile klasöre gir, sunucuyu yeniden başlat.
index.html.txtNe zaman çıkar? Dosyayı Dosya Gezgini'nde Yeni → Metin Belgesi (New → Text Document) ile oluşturup adını index.html yapınca. Uzantılar gizliyse gerçek adı index.html.txt olur: Ders 0'daki uzantı tuzağı. Çift tıklayınca tarayıcı yerine Not Defteri açılır. Go Live'a basarsan Live Server açık dosyayı sayfa saymaz; tarayıcıyı http://127.0.0.1:5500/ adresiyle açar ve sayfan yerine klasördeki dosyaları listeler:

Listede dosyanın gerçek adı görünüyor. Ona tıklarsan sayfa değil, kodun kendisi düz yazı olarak gelir. http://127.0.0.1:5500/index.html adresini elle açarsan Cannot GET /index.html yazan bir sayfa gelir: sunucuda o adda dosya yok. Terminalde ls de gerçeği söyler:
PS C:\kod\web-ilk> ls Directory: C:\kod\web-ilk Mode LastWriteTime Length Name---- ------------- ------ -----a---- 11.10.2026 21:11 384 index.html.txt-a---- 11.10.2026 21:11 124 stil.css-a---- 11.10.2026 21:11 147 uygulama.jsNasıl düzelir? VS Code'un dosya listesi adın tamamını gösterir: dosyaya sağ tıkla, Rename ile adını index.html yap. Dosya Gezgini'nde uzantıların görünür olduğundan emin ol.
Görevler
Görevleri C:\kod\web-ilk ve C:\kod\ogren\ders18.js üzerinde yap. Önce kendin dene, takılırsan ipuçlarını sırayla aç. Çözüme en son bak.
Adresi parçala
Aşağıdaki adresi önce kâğıt üzerinde parçalarına ayır: protokol, alan adı, port, yol, sorgu, parça. Sonra cevabını ders18.js'te new URL ile denetle.
https://magaza.example.com:8443/esyalar/kilic?renk=kirmizi&sayfa=2#yorumlarBitirince iki sınır durumunu dene: yol ve port yazılmamış https://xdd.baby ile http://127.0.0.1:5500/index.html. Bunların pathname ve port değerleri ne olur?
İpucu 1
Alanların adları: protocol, hostname, port, pathname, search, hash. Her birini ayrı bir console.log ile yazdır.
İpucu 2
Sorguda iki çift var; & onları ayırır. Sunucuya gitmeyen tek parçayı da işaretlemeyi unutma.
Çözümü göster
const adres = new URL("https://magaza.example.com:8443/esyalar/kilic?renk=kirmizi&sayfa=2#yorumlar")console.log(adres.protocol)console.log(adres.hostname)console.log(adres.port)console.log(adres.pathname)console.log(adres.search)console.log(adres.hash)https:magaza.example.com8443/esyalar/kilic?renk=kirmizi&sayfa=2#yorumlarSınır durumları:
const kisa = new URL("https://xdd.baby")console.log(kisa.pathname)console.log(kisa.port === "")const yerel = new URL("http://127.0.0.1:5500/index.html")console.log(yerel.pathname, yerel.port)/true/index.html 5500Yol yazılmasa da / olur: ana sayfa istenir. port boş metindir, çünkü https'nin varsayılan kapısı 443 adreste yazılmaz. Port yazılınca da alan onu metin olarak verir ("5500"; console.log tırnaksız yazar). #yorumlar sunucuya gitmez; sorgunun iki çifti renk=kirmizi ve sayfa=2.
DNS dedektifi
nslookup ile üç adı sorgula: github.com, www.github.com ve bilerek yanlış yazılmış githb.cmo. Sonra şu soruları cevapla: www'lu ve www'suz ad aynı yere mi çıkıyor? Yanlış adda nslookup ne diyor? O yanlış adı tarayıcıda başıyla birlikte (https://githb.cmo) açarsan hangi hata sayfası gelir?
İpucu 1
Her ad için ayrı bir nslookup komutu yaz. Cevap, Non-authoritative answer: satırından sonra gelir.
İpucu 2
Aliases "takma adlar" demek: sorduğun ad başka bir adın takma adıysa orada yazar.
Çözümü göster
Bu ders yazılırken alınan cevaplar (IP adresleri zamanla ve yere göre değişebilir):
PS C:\kod> nslookup github.comServer: dns.googleAddress: 2001:4860:4860::8888 Non-authoritative answer:Name: github.comAddress: 140.82.121.4 PS C:\kod> nslookup www.github.comServer: dns.googleAddress: 2001:4860:4860::8888 Non-authoritative answer:Name: github.comAddress: 140.82.121.3Aliases: www.github.com PS C:\kod> nslookup githb.cmoServer: dns.googleAddress: 2001:4860:4860::8888 *** dns.google can't find githb.cmo: Non-existent domainwww.github.com,github.com'un takma adıdır (Aliases); ikisi aynı siteye çıkar. Büyük siteler birden çok sunucu kullandığı için numaranın son hanesi sorgudan sorguya değişebilir.- Yanlış adda
Non-existent domain: "böyle bir alan adı yok". - Tarayıcıda DNS hata kartındaki
Bu siteye ulaşılamıyor(This site can’t be reached) sayfası veERR_NAME_NOT_RESOLVEDkodu gelir.
İkinci sayfa: oyuncu profili
web-ilk klasöründe profil.html adında ikinci bir sayfa yaz. Sekmede "Oyuncu profili" yazsın; sayfada oyuncu adın ana başlık olsun, altında iki paragraf: ana rolün ve en sevdiğin şampiyon. Sayfa stil.css'i kullansın. Live Server açıkken onu http://127.0.0.1:5500/profil.html adresinden aç.
Sonra iki deneme yap ve sonuçlarını açıkla:
<meta charset="utf-8">satırını sil ve kaydet. Türkçe harfler bozuldu mu?- Adres çubuğunda
profil.htmlyerineProfil.htmlyaz. Sayfa açıldı mı?
İpucu 1
İskeleti bir kez daha elle yaz. Değişecek yerler <title>, <h1> ve paragraflar; <script> satırına bu sayfada gerek yok.
İpucu 2
Birinci deneme için Network'te profil.html'e tıkla ve Headers'taki Content-Type satırını oku.
Çözümü göster
<!doctype html><html lang="tr"><head> <meta charset="utf-8"> <title>Oyuncu profili</title> <link rel="stylesheet" href="stil.css"></head><body> <h1>Deniz</h1> <p>Ana rolüm: orta koridor.</p> <p>En sevdiğim şampiyon: Ahri.</p></body></html>- Live Server'da harfler bozulmaz, çünkü Live Server
Content-Typebaşlığındacharset=UTF-8diyerek kodlamayı zaten söylüyor. Yine de satırı geri koy: kodlamayı söylemeyen bir sunucuda aynı sayfahoÅŸgibi bozulur. - Açılır, çünkü Windows dosya adlarında büyük-küçük harf ayırmaz. Sitelerin çoğunun çalıştığı Linux sunucular ise ayırır; orada
Profil.htmladresi404verir. Dosya adlarını ve bağlantıları hep küçük harfle yaz.
Bozuk sayfayı onar
Bu görevde sayfayı sen bozacaksın; asıl iş, bozulmayı geliştirici araçlarında okumak. İleride bir sayfa bozulduğunda sebebini bilmeyeceksin, elinde yalnız bu ekranlar olacak. Live Server açıkken iki dosyada birer satırı aşağıdaki gibi değiştir: index.html stil dosyasını olmayan bir css klasöründe arasın, uygulama.js de olmayan bir JSON dosyasını istesin.
<link rel="stylesheet" href="css/stil.css"> const yanit = await fetch("takimlar.json")Kaydetmeden önce tahmin et: Network'te hangi satırlar kırmızı olacak, durumları ne olacak? Console'da Sayfa yüklendi yine yazılacak mı? Sonra kaydet, tahminini geliştirici araçlarıyla denetle ve iki satırı onar.
İpucu 1
Network sekmesini aç ve sayfayı yenile (F5). Kırmızı satırların Status ve Initiator sütunlarını oku: hangi dosya bulunamadı, isteği kim gönderdi?
İpucu 2
Name sütunu yalnız dosyanın adını gösterir, klasörünü göstermez. Tam adres için satıra tıklayıp Headers'taki Request URL'ye ya da Console'daki Refused to… mesajında tırnak içindeki adrese bak.
İpucu 3
SyntaxError: Unexpected token '<' mesajını Ders 15'ten tanıyorsun: fetch 404'te hata fırlatmaz; yanit.json() gelen HTML hata sayfasını JSON sanıp çevirmeye çalışır.
Çözümü göster
Network'te iki kırmızı satır var (tanıdığın favicon.ico da üçüncüsü olabilir):
| Name | Status | Type | Initiator |
|---|---|---|---|
stil.css | 404 | stylesheet | index.html:6 |
takimlar.json | 404 | fetch | uygulama.js:2 |
Sayfa stilsizdir. Console'da şu satırlar durur (Live Server'ın Live reload enabled. satırı ve favicon satırı da araya karışabilir):
Refused to apply style from 'http://127.0.0.1:5500/css/stil.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.Sayfa yüklendiGET http://127.0.0.1:5500/takimlar.json 404 (Not Found)Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON- Stil: Name sütununda
stil.cssyazsa da adrescss/stil.css; tarayıcı dosyayı olmayan bir klasörde aradı. Düzeltmehref="stil.css". (Ya da gerçekten bircssklasörü açıpstil.css'i içine taşı; büyük projelerde dosyalar böyle klasörlere ayrılır.) - JSON:
Sayfa yüklendigeldi, yaniuygulama.jsçalışıyor; sorunfetch'te. Sunucu404ile "böyle bir dosya yok" diyen bir HTML sayfası gönderdi,fetchhata fırlatmadı,yanit.json()bu HTML'i JSON sanıp daha ilk işarette (<) takıldı. Düzeltmefetch("takim.json"). Ders 15'tekiyanit.okdenetimini ekleseydin mesaj doğrudanİstek başarısız: 404derdi.
Kaydedince Live Server sayfayı yeniler; renkler ve Takımda 5 şampiyon var, ilki Ahri satırı geri gelir. Sınır denemesi: yalnız birini düzeltip yenile. Öteki hata tek başına kalır, çünkü stil dosyası ile JSON birbirinden bağımsız istenir.
Sunucunun gözünden
npx serve ile web-ilk klasörünü yayınla. Tarayıcının önbelleği boş başlasın diye yeni bir gizli pencere aç (Ctrl+Shift+N; Edge'de adı InPrivate) ve şu dört adresi orada sırayla aç. Her birinden önce terminalde hangi GET satırlarının çıkacağını ve hangi durum kodlarının geleceğini tahmin et, sonra terminale bak:
http://localhost:3000http://localhost:3000/takim.jsonhttp://localhost:3000/yok.htmlhttp://localhost:3000/?sekme=ozet#gorevler
İpucu 1
İlk adreste tarayıcı HTML'de adı geçen her dosya için ayrı istek gönderir; fetch de bir istektir.
İpucu 2
İkinci adresteki dosyayı tarayıcı az önce fetch ile almıştı. Değişmemiş dosya için hangi kod geliyordu?
İpucu 3
serve adreslerden .html'i siler. Dördüncü adreste hangi parça sunucuya hiç gitmez?
Çözümü göster
Bu ders yazılırken terminalde, çerçevenin altında beliren kayıtlar (tarih, saat ve süreler sende farklı olur):
HTTP 11.10.2026 21:04:49 ::1 GET / HTTP 11.10.2026 21:04:49 ::1 Returned 200 in 21 ms HTTP 11.10.2026 21:04:49 ::1 GET /stil.css HTTP 11.10.2026 21:04:49 ::1 GET /uygulama.js HTTP 11.10.2026 21:04:49 ::1 Returned 200 in 3 ms HTTP 11.10.2026 21:04:49 ::1 Returned 200 in 2 ms HTTP 11.10.2026 21:04:49 ::1 GET /takim.json HTTP 11.10.2026 21:04:49 ::1 Returned 200 in 2 ms HTTP 11.10.2026 21:04:49 ::1 GET /favicon.ico HTTP 11.10.2026 21:04:49 ::1 Returned 404 in 6 ms HTTP 11.10.2026 21:04:51 ::1 GET /takim.json HTTP 11.10.2026 21:04:51 ::1 Returned 304 in 2 ms HTTP 11.10.2026 21:04:53 ::1 GET /yok.html HTTP 11.10.2026 21:04:53 ::1 Returned 301 in 1 ms HTTP 11.10.2026 21:04:53 ::1 GET /yok HTTP 11.10.2026 21:04:53 ::1 Returned 404 in 2 ms HTTP 11.10.2026 21:04:55 ::1 GET /?sekme=ozet HTTP 11.10.2026 21:04:55 ::1 Returned 200 in 8 ms HTTP 11.10.2026 21:04:55 ::1 GET /stil.css HTTP 11.10.2026 21:04:55 ::1 Returned 304 in 1 ms HTTP 11.10.2026 21:04:55 ::1 GET /uygulama.js HTTP 11.10.2026 21:04:55 ::1 Returned 304 in 1 ms HTTP 11.10.2026 21:04:55 ::1 GET /takim.json HTTP 11.10.2026 21:04:55 ::1 Returned 304 in 2 ms- Dört istek, dört
200:/(sunucuindex.html'i gönderdi),stil.css,uygulama.jsve sayfadakifetch'in istediğitakim.json. Bir defavicon.icoisteği404aldı. takim.jsoniçin304: tarayıcının elinde aynı dosya vardı; sunucu "değişmedi, elindekini kullan" dedi ve dosyayı yeniden göndermedi.yok.htmliçin önce301: serve.html'i silip tarayıcıyı/yokadresine gönderdi. Orada da dosya olmadığı için404geldi; tarayıcıda404 The requested path could not be foundyazar.- Sunucu
GET /?sekme=ozetgördü: sorgu gitti,#gorevlergitmedi, çünkü parça yalnız tarayıcıda yaşar. Sunucu sorguyu dikkate almadan yineindex.html'i gönderdi (200), sayfanın dosyaları için de304geldi.
Geliştirici araçlarında Disable cache işaretliyse 304 yerine hep 200 görürsün: tarayıcı elindeki kopyayı hiç sormadan dosyaları baştan ister.
Kendini sına
Soru 1
Adres çubuğuna https://xdd.baby/ders18 yazıp Enter'a bastın. Şu adımları doğru sıraya diz.
- (a) Sunucu
200ve HTML gönderir. - (b) Tarayıcı
GET /ders18isteğini gönderir. - (c)
xdd.baby'nin IP adresi bulunur. - (d) Tarayıcı CSS ve JS için yeni istekler gönderir.
- (e)
76.76.21.21adresine bağlantı açılır.
Cevabı göster
c, e, b, a, d. Önce ad numaraya çevrilir (DNS), sonra o numaraya bağlanılır, istek gider ve yanıt gelir; tarayıcı HTML'de adı geçen dosyaları ayrıca ister.
Soru 2
https://xdd.baby/ders18?tema=acik#gorevler adresinde yol, sorgu ve parça hangisi? Hangisi sunucuya gitmez?
Cevabı göster
Yol /ders18, sorgu ?tema=acik, parça #gorevler. Parça sunucuya gönderilmez; tarayıcı onu sayfanın içinde o adlı yere kaydırmak için kullanır.
Soru 3
Hangisi HTML'in, hangisi CSS'in, hangisi JavaScript'in işi?
- Başlık altın sarısı olsun.
- Sayfada bir başlık ve iki paragraf olsun.
- Düğmeye basınca altın 50 artsın.
- Zemin koyu lacivert olsun.
Cevabı göster
1 CSS, 2 HTML, 3 JavaScript, 4 CSS. Kural: "ne var?" sorusunun cevabı HTML, "nasıl görünüyor?" CSS, "ne olunca ne yapıyor?" JavaScript.
Soru 4
Sayfayı çift tıklayıp açtın, fetch("takim.json") çalışmıyor; aynı kod Live Server'da çalışıyor. Neden?
Cevabı göster
Çift tıklayınca sayfa file:// ile diskten açılır; tarayıcı güvenlik için böyle sayfaların fetch ile dosya okumasına izin vermez (blocked by CORS policy). Live Server sayfayı http:// ile sunar, istekler gerçek sitedeki gibi HTTP ile gider.
Soru 5
Elements sekmesinde başlığı değiştirdin, sayfa değişti. F5'e basınca eski hâli geri geldi. Neden? Kalıcı değişiklik için ne yapmalısın?
Cevabı göster
Elements tarayıcının bellekteki kopyasını gösterir; oradaki değişiklik dosyana da sunucuya da gitmez. Yenileyince tarayıcı sayfayı yeniden ister ve diskteki değişmemiş dosya gelir. Kalıcı değişiklik için dosyayı VS Code'da düzenleyip kaydet.
Soru 6
Data Dragon'dan sürümleri çeken bir sayfa çalışmıyor; Console'da şunlar var. Sorun ne? Sunucu bir durum kodu gönderdi mi?
GET https://ddragon.leagueoflegends.cmo/api/versions.json net::ERR_NAME_NOT_RESOLVEDUncaught (in promise) TypeError: Failed to fetch at surumleriYukle (uygulama.js:2:25) at uygulama.js:7:1Cevabı göster
Alan adı yanlış yazılmış: .com yerine .cmo. ERR_NAME_NOT_RESOLVED "ad çözülemedi" demek: DNS bu ada bir numara bulamadı, istek hiçbir sunucuya ulaşmadı. Bu yüzden durum kodu da yok; satırda 404 gibi bir sayı değil, tarayıcının kendi hata kodu var. fetch'in Promise'i reddedildi ve onu kimse yakalamadı (Uncaught (in promise)). Ders 15'te Node aynı adreste TypeError: fetch failed ve altında getaddrinfo ENOTFOUND demişti: aynı DNS hatası.
Kayıt noktası
web-ilk yeni bir proje klasörü; Git'in onu tanıması için orada bir kez git init gerekiyor.
Bir sonraki derste HTML'i derinlemesine öğreneceksin: başlıklar, bağlantılar, resimler, listeler, tablolar ve form elemanlarıyla anlamlı bir sayfa iskeleti kuracaksın.