2 puan yazan GN⁺ 2025-05-05 | 1 yorum | WhatsApp'ta paylaş
  • Yalnızca HTML ile aynı öğeyi birden fazla sayfaya eklemeyi sağlayan bir include özelliği yok
  • CSS CSS'i, JavaScript ise JS'i çağırabiliyorken, HTML'in HTML'i içeri alamaması soru işareti yaratıyor
  • Bu sorunu çözmek için çeşitli JavaScript çözümleri, şablon dilleri ve statik site üreticileri kullanılıyor
  • Performans, güvenlik, render gecikmesi ve döngüsel ekleme gibi karmaşık sorunlar bu özelliğin önündeki engeller olarak görülüyor
  • Birçok geliştirici HTML'de saf, bildirimsel bir include özelliği istese de, bu hâlâ web standartlarına yansımış değil

HTML'de Include Özelliğinin Olmamasının Nedeni Üzerine Soru

Sorunun ortaya konması

  • index.html, about.html, contact.html gibi birden fazla sayfada ortak bir header'ı tekrar tekrar eklemek zahmetli
  • Geliştiriciler tekrar oluşturmadan, bir kez tanımlanan header'ı yeniden kullanmak istiyor

Zaten var olan alternatif yöntemler

  • JavaScript fetch API'si ile harici HTML'i alıp DOM'a ekleme yöntemi
  • Server Side Include (SSI), PHP'nin include yapısı, statik site üreticileri ve şablon dilleri çözüm olarak mevcut
  • <iframe> ve <object> gibi HTML öğeleri de kullanılabilir, ancak erişilebilirlik, performans ve stil izolasyonu sorunları nedeniyle uygun değiller
  • Sonuç olarak HTML'in kendi içinde basit bir include sözdizimi yok

HTML'de neden bu özellik yok?

  • CSS ve JS için sırasıyla @import ve import sözdizimi varken HTML için böyle bir şey yok
  • Web standartları genelde geliştiricilerin çok kullandığı özellikleri zamanla benimsemiştir, ancak HTML include bunun bir örneği olamadı
  • Gündeme getirilen olası nedenler:
    • Preload scanner çalışmasını bozma ihtimali
    • Asenkron yüklemede layout kayması / titreme sorunları
    • İç içe veya döngüsel include işlemlerini yönetmenin karmaşıklığı
    • Web hosting trafiğinin artmasına yönelik itirazlar
    • Güvenlik sorunları (CORS, CSP vb.) ile belge yükleme olaylarının zamanlamasında çakışmalar
    • Ya da basitçe önceliğinin düşük olması ve net bir önerinin ortaya konmamış olması

İlgili tartışmalar

  • GitHub'daki WHATWG tartışma başlığında #2791 konu aktif biçimde ele alınıyor
  • Geçmişte Chrome'da bir dönem HTML Imports vardı, ancak diğer tarayıcıların destek vermemesiyle birlikte kaldırıldı
  • HTMX, Web Components, XSLT, SSI gibi alternatif yaklaşımlar da paylaşılıyor

Topluluk tepkilerinin özeti

  • HTML'in gelişimi statik işaretleme merkezli kaldığı için, mantıksal özellikleri dışarıda bırakan yaklaşım hâlâ güçlü
  • Pek çok kişi bu özelliği istese de, standartlaşma sürecinde sesini duyurması zor olan bireysel geliştiriciler çoğunluğu oluşturuyor
  • Performans, güvenlik, render işleme, döngü önleme gibi karmaşık tasarım sorunları çözülmeden bu özelliğin gelmesinin zor olduğu da düşünülüyor
  • Bazı geliştiricilere göre bunun nedeni, HTML'in sadece "sonuçtan" sorumlu olması gerektiği anlayışı

Sonuç

  • HTML'de hâlâ saf bir include özelliği yok ve bunun için farklı harici araçlara ve dillere başvurmak gerekiyor
  • Buna rağmen birçok geliştirici hâlâ basit, HTML tabanlı bir yeniden kullanım yapısı bekliyor

1 yorum

 
GN⁺ 2025-05-05
Hacker News görüşü
  • HTML tarihsel olarak SGML'nin bir uygulamasıydı ve SGML bir include özelliğini destekliyordu. Yeni bir "entity" tanımlayıp bir "system" entity oluşturabiliyor, ardından buna başvurup yerine koydurabiliyordunuz
    • SGML'nin karmaşıklığı nedeniyle HTML'yi basitleştirmeye yönelik çeşitli çabalar oldu ve bu süreçte bu tür özellikler kaldırıldı
  • 90'ların sonlarında bu sorunu çözmeye çalışıyordum. Analog Science Fiction web sitesinin web yöneticisi olarak, aynı header ve sidebar'a sahip çok sayıda statik sayfa hazırlıyordum. Sonra Apache server-side include özelliğini keşfettim. Bu, DRY ilkesini öğrenmeden önce bunu sürdürülebilir kılma yöntemimdi
    • Bu sorun tekrar tekrar farklı şekillerde çözüldü. iframe'in yeterli olduğunu söyleyenlere karşı, iframe içerikle birlikte genişlemiyor. Server-side çözümler bir sunucu gerektiriyor. Neden basit bir client-side yöntem yok? Bunun geçerli bir soru olduğunu düşünüyorum
  • HTML Imports diye bir özellik önerisi vardı. Bu, Web Components'ın bir parçası olarak ortaya çıktı
    • HTML Imports, bir HTML belgesini başka bir HTML belgesine dahil etme ve yeniden kullanma yöntemiydi
    • Google, önerilen spesifikasyonu Blink'te uyguladı, ancak diğer şirketler çeşitli nedenlerle karşı çıktı. Mozilla, uygulama karmaşıklığı, güvenlik sorunları ve ES6 modülleriyle örtüşme konusunda endişeliydi. Üretici desteği olmayınca öneri resmen durduruldu
  • Netscape 4'te inflow layers adlı bir özellik vardı
    • Bu özelliğin adı transclusion. Project Xanadu'nun bir parçasıydı ve başlangıçta hipermetnin önemli bir özelliği olarak görülüyordu
    • MediaWiki, transclusion'ı yoğun biçimde kullanıyor. Bazen wiki'ler hipermetnin gerçek haliymiş gibi geliyor
  • Uygun bir frameset (iframe değil) uzun zaman önce bu tür bir işlevi yerine getirmek için tasarlanmıştı. En azından otomatik genişleme iyi çalışıyordu ve kullanıcı yeniden boyutlandırabiliyordu
    • Frame'lere yönelik çok eleştiri vardı, ancak Java API belgeleri gibi yararlı şeylerde başarıyla kullanıldılar
    • Sanırım frameset'ler tasarımcılara yeterince esneklik sunmadığı için yaşatılmadı. Bugünün mobil ortamında da muhtemelen iyi çalışmazlardı
  • "Includes" özelliği server-side kabul edilir ve web tarayıcısının dışında işlenir. HTML client-side'dır ve bir programlama dili değil, yalnızca basit bir işaretleme sözdizimidir
    • Bu sorun çözülmüş bir sorun. "Includes" meselesi, her web tasarım öğrencisinin PHP öğrenme yollarından biridir. Çoğu CMS'te "Includes", "template partials" haline gelir ve belgelerde ilk anlatılan şeylerden biridir
    • Sadece HTML ile "Includes" kullanmaya gerek yok. HTML bir sunum biçimidir; CSS ve JS olmadan ilginç bir şey yapmaz
  • HTML include özelliğinde çeşitli sorunlar var
    • main.html, child/include1.html dosyasını dahil ediyorsa ve child/include1.html içinde src="include2.html" bağlantısı varsa, kullanıcı bağlantıya tıkladığında nereye gitmeli? "include2.html"ye giderse o sayfada diğer her şey eksik olur. main.html'ye giderse, bu kez include1.html yerine include2.html'nin kullanılacağı nasıl belirtilecek?
    • Tersine, article1.html, article2.html, article3.html gibi dosyaların her biri header.html, footer.html, navi.html dosyalarını dahil edebilir. Ama tüm makalelere comments.html eklemek isterseniz tüm makaleleri düzenlemeniz gerekir; sonuçta makaleleri bir template'ten üretirsiniz ve tarayıcının include desteğine ihtiyaç kalmaz
    • Header başlığı bilmek isterse ya da footer sonraki/önceki bağlantılarını isterse, bu bilgiyi include'lar arasında aktarmanın bir yolu gerekir; sonunda yine sayfayı üretirsiniz ve include çözüm olmaz
    • HTML include, çoğu kullanım senaryosu için pratikte işe yaramaz olurdu
  • WHATWG'de bu konuyla ilgili açık bir issue var
    • HTML için client-side include özelliği
  • HTML'nin bir include özelliği vardı ama popülerliğini kaybetti
    • Gerçek "include" terimi XML'e ait bir özellik ve makalenin istediği şey de bu. HTML'nin XML'den önce var olan alternatif bir yaklaşımı vardı. Bu yaklaşım frame'lerdi. Frame'ler, XML include'dan daha fazla işlev sağlıyordu; bu yüzden HTML bu özelliği almadı. Frame'ler kötüye kullanım, güvenlik, erişilebilirlik ve çeşitli başka sorunlar nedeniyle popülerliğini yitirdi