İLE %100 UYUMLU: Güvenli E-Posta Hosting Hizmetimizi 1 AY ÜCRETSİZ Deneyin! HEMEN OLUŞTURUN
İçindekiler
İnternetin ilk yıllarında web sayfaları, sadece metinlerin ve resimlerin alt alta dizildiği, kullanıcının sadece okuyup geçebildiği statik belgelerden ibaretti. Bir web sitesinde bir butona tıkladığınızda arka plan renginin değişmesi, sayfa yenilenmeden yeni verilerin ekrana gelmesi veya bir açılır menünün pürüzsüzce aşağı kayması gibi dinamik etkileşimler söz konusu değildi. Çünkü HTML (Hiper Metin İşaretleme Dili) doğası gereği cansız bir iskelettir; sayfanın sadece neye benzeyeceğini tanımlar, nasıl davranacağını değil.
İşte tam bu noktada, o cansız HTML iskeletine sinir sistemi döşeyerek onu hareketli, etkileşimli ve “canlı” bir yazılıma dönüştüren teknolojik standart devreye girer: DOM (Document Object Model – Belge Nesne Modeli).
DOM, bir web sayfasının tarayıcı (Google Chrome, Safari, Firefox vb.) tarafından yüklendiği anda oluşturulan mantıksal, hiyerarşik ve nesne yönelimli (Object-Oriented) bir haritasıdır. İnternet dünyasının en yanlış anlaşılan kavramlarından biri olan DOM; aslında bir programlama dili veya bir yazılım kütüphanesi (Örneğin jQuery veya React) değildir. O, W3C (Dünya Çapında Ağ Birliği) tarafından belirlenen evrensel bir “API” (Uygulama Programlama Arayüzü) standardıdır.
Bu derinlemesine rehberde; DOM’un bir ağaç gibi dallanan o karmaşık yapısını, HTML ile arasındaki o ince ama kritik farkı, JavaScript’in bu yapıyı nasıl manipüle ettiğini, “Reflow” ve “Repaint” gibi performans darboğazlarını ve modern webin kaderini değiştiren “Virtual DOM” (Sanal DOM) devrimini tüm mimari detaylarıyla inceliyoruz.
Tarayıcınıza bir web adresi yazıp “Enter” tuşuna bastığınızda, tarayıcı karşıdaki sunucudan saf bir HTML metin dosyası indirir. Tarayıcının işleme motoru (Rendering Engine), bu metin dosyasını satır satır okumaya (Parsing) başlar. Okuduğu her bir HTML etiketini (Tag), bellekte karşılığı olan bir “Nesneye” (Object) dönüştürür. Bu nesnelerin birbirleriyle olan ebeveyn-çocuk (Parent-Child) ilişkisine göre dizildiği bu yapıya DOM Ağacı (DOM Tree) denir.
DOM ağacının en tepesinde her zaman görünmez bir kök bulunur: Document (Belge) nesnesi. Bu kökten aşağıya doğru dallar uzanır:
Document
<html>
<head>
<body>
<p>
<img>
<a>
Ağacın bu kusursuz yapısı, programlama dillerinin sayfanın herhangi bir noktasına yolunu kaybetmeden ulaşabilmesini sağlar. Bir butona ulaşmak isteyen kod, ağacın kökünden girer, dalları takip eder ve o butonu bir nesne olarak avucunun içine alır.
Web geliştirmeye yeni başlayanların en sık düştüğü kavramsal hata, yazdıkları HTML kaynak kodunun doğrudan DOM olduğunu sanmalarıdır. Oysa kaynak kodu ile DOM arasında çok büyük farklılıklar olabilir.
SEO (Arama Motoru Optimizasyonu) uzmanı olarak çalışan Berrin, bir web sitesinin indeksleme sorunlarını incelerken bu kritik farkla yüzleşir. Berrin, web sayfasında sağ tıklayıp “Sayfa Kaynağını Görüntüle” (View Page Source) dediğinde sunucudan gelen saf HTML kodunu görür. Ancak “İncele” (Inspect Element) seçeneğine tıkladığında karşısına çıkan yapı (Elements sekmesi), kaynağın birebir aynısı değildir.
Neden mi? Çünkü DOM, tarayıcının hataları düzelterek ve JavaScript’in müdahalelerini hesaba katarak oluşturduğu “Canlı” bir yapıdır. Örneğin; kaynak kodunu yazan yazılımcı bir tablo (<table>) oluştururken içine <tbody> etiketini koymayı unutmuş olabilir. Tarayıcı bu bozuk HTML’i okuduğunda, DOM ağacını inşa ederken eksik olan <tbody> etiketini otomatik olarak kendisi ekler. Veya sayfa yüklendikten hemen sonra çalışan bir JavaScript kodu, sayfadaki bir başlığı silmiş olabilir. Kaynak kodda o başlık hala dururken, DOM ağacında (yani ekranda) o başlık artık yoktur. Kısacası HTML inşaatın planı (Blueprint), DOM ise inşaatın o anki fiziksel halidir.
<table>
<tbody>
DOM’un varoluş amacı, HTML nesnelerini bir programlama dilinin anlayabileceği, değiştirebileceği ve dinleyebileceği bir formata sokmaktır. Bu programlama dili ezici bir çoğunlukla JavaScript‘tir.
Frontend (Ön Yüz) geliştiricisi Alp, kullanıcılarına “Karanlık Mod” (Dark Mode) deneyimi sunmak istemektedir. Alp’in yazdığı statik HTML’in, bir butona tıklandığında sayfanın rengini siyah yapma yeteneği yoktur. Alp, JavaScript kullanarak DOM API’sine bağlanır ve şu büyülü adımları izler:
document.getElementById('tema-butonu')
buton.addEventListener('click', ...)
document.body.style.backgroundColor = 'black';
Alp’in yazdığı bu üç satırlık kod, HTML dokümanını yeniden sunucudan yüklemeye gerek kalmadan, sadece bellekteki DOM ağacını anlık olarak değiştirerek ekranın saniyeler içinde karanlık moda geçmesini sağlar. Kullanıcı etkileşimi, animasyonlar, form doğrulamaları ve dinamik veri listelemelerinin tamamı, JavaScript’in DOM ağacı üzerindeki bu diktatörlüğünün (Manipulation) bir sonucudur.
DOM üzerindeki işlemler, modern yazılım mimarilerinde en çok kaynak (İşlemci ve RAM) tüketen süreçlerdir. DOM’u değiştirmek aslında sanıldığı kadar “ucuz” bir işlem değildir.
Kıdemli sistem mimarı Cevdet, e-ticaret sitesine gelen 5.000 adet ürünü ekranda listeleyecek bir kod yazmaktadır. Eğer Cevdet bir döngü (Loop) kurup, her bir ürün için DOM’a doğrudan müdahale ederek (appendChild) eleman eklerse, tarayıcı 5.000 kez çökme noktasına gelir. Çünkü DOM ağacında fiziksel bir boyut veya konum değişikliği yapıldığında, tarayıcı tüm sayfanın matematiksel ölçülerini baştan hesaplamak zorundadır. Buna “Reflow” (Yeniden Akış) denir. Sadece renk değişimi yapıldığında ise piksellerin yeniden çizilmesine “Repaint” (Yeniden Boyama) denir.
appendChild
Cevdet, performansı korumak için her döngüde gerçek DOM’a dokunmak yerine, hafızada sanal bir kutu olan DocumentFragment oluşturur. Tüm 5.000 ürünü önce bu sanal kutuya (DOM’un dışında) ekler. Son olarak bu kutuyu tek bir hamlede gerçek DOM’a yerleştirir. Tarayıcı 5.000 kez değil, sadece 1 kez “Reflow” hesaplaması yapar. Uygulamanın hızı milisaniyeler seviyesine düşer. DOM’a ne kadar az dokunursanız, uygulamanız o kadar hızlı çalışır.
DOM mimarisindeki bir diğer kritik yapı, olayların (Events) yayılma mantığıdır. İç içe geçmiş üç tane kutu (Div) hayal edin. En içteki kutuya tıkladığınızda, aslında mantıksal olarak dışındaki kutuya da, onun dışındakine de ve en nihayetinde tüm belgeye (Document) de tıklamış olursunuz.
DOM, bu tıklama olayını bir su damlasının gölete düşmesi gibi yönetir. Tıklama anında olay önce en dıştan (Root) hedefe doğru iner, buna Capturing (Yakalama) denir. Hedefe ulaştıktan sonra ise baloncuklar çıkararak yukarıya, ebeveynlerine doğru geri döner, buna da Bubbling (Baloncuklanma) denir.
Bu mimari, yüzlerce butona tek tek olay dinleyicisi (Listener) atamak yerine, tüm butonların ebeveyni olan kapsayıcı tek bir div’e olay dinleyicisi atayarak (Event Delegation) sistem belleğini devasa oranda rahatlatmamıza olanak tanır.
Standart (Gerçek) DOM’un sürekli güncellenmesinin performansı ne kadar kötü etkilediğinden bahsetmiştik. 2013 yılı civarında, karmaşıklaşan web uygulamalarının bu hız problemine çözüm bulmak amacıyla Facebook mühendisleri bir devrime imza attı ve React kütüphanesiyle birlikte Virtual DOM (Sanal DOM) kavramını hayatımıza soktu. (Bugün Vue.js gibi birçok modern kütüphane de bu mantığı kullanmaktadır).
React geliştiricisi olan Didem, anlık mesajlaşma panosu (Chat uygulaması) kodlamaktadır. Ekranda aynı anda yüzlerce mesaj vardır ve saniyede onlarca yeni mesaj gelmektedir. Eğer Didem bunu klasik JavaScript ile yapsaydı, her yeni mesajda DOM ağacı sarsılacak ve tarayıcı yorulacaktı. Ancak React’ın Sanal DOM mimarisi süreci şöyle yönetir:
Sanal DOM, gerçek DOM ile aramızda çalışan ultra zeki bir menajer gibidir. Bizi yorucu hesaplamalardan kurtarır ve günümüzün Tek Sayfa Uygulamalarının (Single Page Applications – SPA) masaüstü programları kadar hızlı çalışmasını sağlar.
Web geliştirme ekosisteminde; sunucuların, veritabanlarının, API’lerin ve karmaşık algoritmaların tek bir nihai amacı vardır: Son kullanıcının ekranında anlamlı ve pürüzsüz bir deneyim yaratmak. Bu devasa veri akışının ekrana, yani piksellere yansıdığı ve elle tutulur hale geldiği yer DOM (Document Object Model)‘dir.
DOM’un çalışma mantığını, hiyerarşik ağaç yapısını, düğümlerin (Nodes) birbiriyle olan iletişimini ve tarayıcının ekranı nasıl çizdiğini (Reflow/Repaint) kavramak; sizi sadece kod yazan birinden çıkarıp, yazdığı kodun donanım ve tarayıcı üzerinde nasıl bir fiziksel yük oluşturduğunu bilen profesyonel bir mimara (Software Architect) dönüştürür. İster düz Vanilla JavaScript kullanın, ister React veya Vue gibi en modern Sanal DOM kütüphaneleriyle çalışın; arka planda dönen sihrin kaynağı daima W3C’nin yıllar önce kurguladığı bu muazzam nesne modelidir. İnternetin nasıl “canlandığını” anlamak, DOM’u anlamakla başlar.