- Kebutuhan untuk menghindari pengulangan header yang sama di banyak halaman adalah hal mendasar, tetapi HTML tidak memiliki tag include native untuk menanganinya secara langsung
- Para pengembang selama ini menyelesaikan masalah yang sama lewat cara-cara tidak langsung seperti JavaScript
fetch, direktif server, generator situs statis, bahasa template, bahasa backend, dan Web Components <iframe>adalah cara yang paling dekat dengan HTML murni, tetapi tidak cocok untuk tujuan ini dari sisi performa, aksesibilitas, dan kegunaan, serta terasa canggung secara keseluruhan- CSS bisa mengimpor CSS dan JavaScript bisa mengimpor JavaScript, tetapi HTML tidak bisa mengimpor HTML, sehingga konsistensi platform web tampak terganggu
- Dampak pada preload scanner, layout yang bergeser karena pemuatan asinkron, include bertingkat dan sirkular, bertambahnya request, pembatasan domain, serta kemungkinan rendahnya permintaan tetap menjadi hambatan standardisasi
Kebutuhan dasar untuk menggunakan kembali potongan HTML yang berulang
- Masalah ini terlihat jelas saat harus menaruh header yang sama di tiga halaman:
index.html,about.html, dancontact.html - Daripada menyalin kode yang sama tiga kali, terasa wajar untuk membuat header sekali lalu meng-include-nya di banyak halaman
- Jika jumlah halaman bertambah menjadi ribuan, ini bukan lagi sekadar soal kenyamanan, melainkan masalah pencegahan duplikasi kode
Beragam solusi yang sudah ada
- Cara mengambil dan menyisipkan potongan HTML sebenarnya sudah dimungkinkan di banyak alat dan lapisan
- JavaScript bisa mengambil HTML dengan
fetchlalu menyisipkannya denganinsertAdjacentElement - Ada juga Server Side Includes, direktif server web yang sudah lama ada
- Ini bisa ditangani lewat fitur generator situs statis seperti Jekyll include
- Task runner seperti gulp-include juga dapat digunakan
- Bahasa template seperti Handlebars partials umumnya menyediakan fitur include
- Bahasa backend seperti PHP juga bisa menghasilkan HTML secara dinamis, misalnya dengan
include - Ada pula pendekatan Web Component yang khusus untuk include
- JavaScript bisa mengambil HTML dengan
<iframe>secara teknis adalah cara untuk mengambil HTML lain hanya dengan HTML murni, tetapi untuk tujuan ini memiliki masalah besar dalam performa, aksesibilitas, dan kegunaan- Ada juga pilihan untuk sama sekali tidak memakai include dan mengandalkan fitur find/replace yang kuat
Justru tidak ada di HTML itu sendiri
- Semua cara di atas tetap bukan pendekatan “mengambil HTML dengan satu tag HTML lalu menaruhnya di lokasi ini”
- Seperti
<img>yang mengambil gambar dan menaruhnya di posisi tersebut, HTML tidak memiliki tag deklaratif langsung untuk “ambil HTML ini dan masukkan ke sini” - Di ShopTalk Show, pertanyaan yang sama juga dibahas bersama Jake Archibald dan Dave Rupert
Titik yang terasa bertentangan dengan arus platform web
- Standar web dan browser sering menyerap hal-hal yang sebelumnya terus-menerus diselesaikan pengembang menjadi fitur platform
- Untuk alur yang sebelumnya mengandalkan JavaScript pihak ketiga dalam menangani tanggal, kini ada Temporal
- Untuk kebutuhan transisi halaman yang dulu banyak ditangani framework, kini ada View Transition API
- Untuk area library yang dipakai demi menempatkan elemen dengan aman, kini ada CSS anchor positioning
- Dalam situasi ketika hampir semua situs web membutuhkan penggunaan ulang potongan HTML dan masing-masing memakai alat nonstandar yang berbeda, ketiadaan HTML include tampak seperti kekosongan yang tidak biasa
Mengapa HTML include sulit menjadi standar
- Dari sudut pandang browser dan ekosistem, HTML include membawa berbagai beban
- Bisa merusak preload scanner dan berdampak buruk pada performa web
- Jika harus bersifat asinkron, pengalaman layar bisa terasa bergeser atau meloncat saat memuat
- Bisa menambah kompleksitas yang merusak kesederhanaan atau kemurnian HTML
- Penanganan include bertingkat dan include sirkular bisa menjadi sulit
- Penyedia web hosting bisa menentangnya karena jumlah request meningkat
- Berbeda dari gambar, CSS, dan JavaScript, HTML mungkin memerlukan pembatasan yang lebih ketat saat diambil dari domain lain
- Bisa saja ada masalah lain yang tidak tercantum di daftar ini
- Bisa juga sebenarnya permintaan untuk fitur ini tidak sebesar yang dibayangkan
- Alih-alih jawaban pasti, ini lebih merupakan penelusuran alasan tentang mengapa HTML tidak bisa meng-include HTML secara langsung
1 komentar
Pendapat di Hacker News
Secara historis, HTML adalah aplikasi dari SGML, dan SGML mendukung include
Kita bisa mendefinisikan “entity” baru, dan jika membuat entity “system”, nantinya bisa dirujuk lalu disubstitusikan. SGML itu kompleks, sehingga ada beberapa upaya untuk menyederhanakan HTML, dan dalam prosesnya fitur ini juga hilang
Tag tersebut tampaknya menyertakan atau meng-embed halaman HTML lain. Halaman HTML yang di-embed: https://www.w3schools.com/tags/tag_object.asp
https://en.wikipedia.org/wiki/Billion_laughs_attack
Ini adalah lubang kelinci yang saya masuki pada akhir 90-an, dan sampai sekarang belum keluar
Saya dulu webmaster situs web Analog Science Fiction, dan karena harus membuat begitu banyak halaman statis dengan header dan sidebar yang sama, rasanya hampir gila. Setelah mencari-cari, saya menemukan server-side include Apache, dan bahkan sebelum mengenal istilah DRY, saya sudah bisa membuatnya DRY. Ada yang bilang iframe sudah cukup, tetapi sebenarnya tidak. iframe tidak melebar/menyesuaikan tinggi mengikuti ukuran konten, dan solusi sisi server membutuhkan server. Saya tidak mengerti mengapa tidak boleh ada cara sederhana di sisi klien, dan ini pertanyaan yang layak dipertimbangkan sekarang ketika banyak kekesalan dalam pengembangan web sedang diperbaiki
Saat mulai membuat “web stuff” bersama teman pada pertengahan 90-an, konsep DRY terasa alami begitu saja. ISP dial-up waktu itu tidak memblokir penggunaan
.htaccessdi ruang web pengguna, jadi kami bisa mengaktifkan server-side include, dan belakangan juga menemukan cara mengaktifkan CGI. Saya bahkan menulis web shell sederhana dengan Perl untuk menjelajahi boks web serverIni adalah library kecil berukuran 10KB yang menambahkan kemampuan inti semacam import dinamis untuk HTML statis ke HTML
https://caniuse.com/iframe-seamless
Hal yang selalu mengganggu dari frame adalah frame bertindak terlalu pintar. Saat klik kanan lalu refresh, saya tidak ingin hanya HTML frame itu saja yang dimuat ulang. Saya mengerti niatnya untuk melakukan cache terpisah, tetapi frame dan cache seharusnya menyelesaikan masalah yang berbeda; ketika keduanya dicampur, hasilnya keduanya jadi serba tanggung. Menurut saya HTML include harus berperilaku sebodoh mungkin. Cukup tempelkan teks include di lokasi include, lalu browser menerima teks hasilnya. Jika ingin men-cache navigasi yang sama di semua halaman secara terpisah, tambahkan atribut cache dan selesaikan masalah itu secara independen. Mungkin orang bisa meyakinkan saya bahwa include perlu melakukan lebih banyak hal, tetapi perilaku bodoh adalah fitur, bukan bug
Usulan fitur ini disebut HTML Imports, dan dibuat sebagai bagian dari pekerjaan Web Components
Ada deskripsi “HTML Imports are a way to include and reuse HTML documents in other HTML documents”, dan dokumen rencananya ada di https://www.w3.org/TR/html-imports/
Namun alasan-alasan seperti ini nyaris seperti bukan alasan, karena sebenarnya tidak menjelaskan apa pun. Sulit dipercaya bahwa permintaannya rendah, padahal fitur ini terus diminta selama 20 tahun dan ada berbagai implementasi shim yang dibuat dengan script, mesin backend, dan lain-lain. Penolakan vendor juga tidak menjelaskan mengapa mereka sampai menolak hingga membalikkan implementasi yang sudah ada. “Dampak keamanan” juga terasa aneh, karena dengan tag script kita sudah bisa mengambil HTML lintas origin lalu melakukan
document.write(). Saya penasaran mengapa script yang melakukandocument.write()dianggap baik-baik saja, sementara tag HTML yang melakukan hal yang sama menjadi masalah besar. Saya memahami kekhawatiran keamanan bahwa orang bisa secara instan menggandakan halaman utama Google, tetapi itu tampaknya mudah diselesaikan dengan CORS[1] https://frontendmasters.com/blog/seeking-an-answer-why-cant-...
HTML seharusnya diimpor dan ditampilkan pada posisi tertentu dalam dokumen, tetapi HTML Imports tidak bisa melakukan itu tanpa JavaScript. Untuk detailnya, lihat https://github.com/whatwg/html/issues/2791#issuecomment-3112...
Seingat saya, setelah import, template harus diinstansiasi dengan JavaScript, dan bukan sekadar satu tag sederhana
Netscape 4 memiliki fitur ini sebagai inflow layer
https://web.archive.org/web/19970630074729fw_/http://develop...
https://web.archive.org/web/19970630094813fw_/http://develop...
SRCcukup sering menyebabkan crash, dan fiturnya juga segera dihapusSaya ingat pernah mencobanya di versi beta, tetapi di versi rilis resmi sudah menghilang
Nama fitur ini adalah transklusi (transclusion)
https://en.wikipedia.org/wiki/Transclusion
Ini merupakan bagian dari Project Xanadu, dan awalnya dianggap sebagai fitur penting dalam hiperteks. Khususnya MediaWiki memakai transklusi secara luas, dan kadang wiki terasa seperti bentuk hiperteks yang paling murni
https://en.wikipedia.org/wiki/Federated_Wiki
Namun tidak benar-benar populer
Di Xanadu, hanya sebagian kutipan dari satu dokumen yang bisa ditransclude ke dokumen lain. Untuk melakukan ini di HTML, perlu ada jawaban terkait CSS. Dalam situasi tertentu, bisa diputuskan dan diselesaikan atribut mana yang harus konsisten antara dokumen host, dokumen guest, dan guest yang disematkan di dalam host, tetapi dalam kasus umum ini tidak jelas. Jika memakai pendekatan tag sederhana, dokumen guest harus dirancang agar hidup di dalam lingkungan CSS yang sudah disediakan host. Jawaban sederhana lainnya adalah Shadow DOM, yang pada umumnya memungkinkan guest menerapkan gayanya sendiri tanpa memengaruhi dokumen lainnya. Dalam kasus ini pun, menurut saya host masih bisa memasukkan sebagian style untuk menyesuaikan guest
Saya rasa inilah yang dulu ingin dilakukan oleh frameset yang sebenarnya. Maksud saya frameset era HTML 4, bukan iframe
Setidaknya ekspansi ukuran otomatis berjalan baik, dan pengguna juga bisa menyesuaikannya ke ukuran yang diinginkan. Ada banyak kritik terhadap frame [1], tetapi frame berhasil dipakai di tempat-tempat yang berguna seperti dokumentasi Java API [2]. Menurut saya pada akhirnya ia menghilang karena terlalu kurang fleksibel bagi desainer. Untuk halaman informasi memang cukup, tetapi scrollbar yang kaku dan pembagian layar yang terbatas tidak mampu memenuhi kebutuhan desainer. Sekarang frameset apa adanya kemungkinan tidak akan bekerja baik di mobile, jadi sudah terlalu terlambat untuk menghidupkannya kembali
[1] <https://www.nngroup.com/articles/why-frames-suck-most-of-the...> - Menarik bahwa banyak bagian dari tulisan ini sekarang tidak lagi berlaku, dan semua masalah yang ditunjukkan pada frame kini ada di web masa kini dalam bentuk yang lebih berantakan
[2] <https://www.eeng.dcu.ie/~ee553/ee402notes/html/figures/JavaD...>
Karena deep link tidak mungkin dilakukan, orang yang masuk lewat bookmark, Google, atau mesin pencari sebelumnya akan mendarat di halaman tanpa navigasi, dan meskipun dicoba diakali dengan JavaScript, itu tidak menghasilkan pengalaman yang baik
Fitur “include” dianggap sebagai sesuatu yang diproses di sisi server, yaitu di luar browser web
HTML berada di sisi klien, dan pada dasarnya bukan bahasa pemrograman, melainkan sintaks markup. Seperti yang dikatakan dalam tulisan itu, masalah ini sudah terselesaikan. Hal pertama yang ditemui mahasiswa desain web saat belajar PHP adalah include, dan di kebanyakan CMS, include menjadi template partial yang dijelaskan di bagian awal dokumen. Tidak ada kebutuhan khusus untuk membuat include bisa dilakukan hanya dengan HTML. HTML adalah format presentasi, dan tanpa CSS serta JS ia tidak melakukan hal yang menarik
Pada kenyataannya, HTML sudah memiliki versi yang lebih buruk, yaitu frames dan iframes. Padanan sisi klien dari server-side include secara alami cocok dengan hal-hal yang dilakukan orang dengan HTML
Mungkin ini bisa dikodekan dengan custom element, dan saya justru akan terkejut jika tidak ada repositori serupa di GitHub
Ada juga konten yang sudah dimuat secara asinkron, seperti gambar atau konten di bagian bawah layar. Pernyataan “HTML bukan bahasa pemrograman melainkan sintaks markup” lebih mirip flamebait, dan HTML adalah bahasa deklaratif yang ditafsirkan oleh tiap engine browser
Jika yang dimaksud adalah styling, presentasi ditangani oleh CSS
Ada dua pilihan. Pertama, memprosesnya saat parsing HTML, yaitu sebelum DOM dibuat, tetapi ini tidak ideal karena memerlukan request sinkron ke server untuk include. Kedua, setelah DOM dibuat, elemen tertentu muncul di DOM, potongannya dimuat secara asinkron, lalu elemen DOM itu diganti dengan potongan eksternal; namun ini melemahkan mekanisme validasi struktur DOM yang ada. Meski begitu, engine Sciter mengimplementasikannya dengan strategi pertama. HTML Sciter biasanya berasal dari resource aplikasi lokal atau sistem file, sehingga biaya request potongan tambahan dapat diabaikan
https://docs.sciter.com/docs/HTML/html-include
HTML include memiliki berbagai masalah seperti yang dikatakan orang lain
Jika
main.htmlmenyertakanchild/include1.html, dan di dalamchild/include1.htmlada tautansrc="include2.html", ke mana pengguna harus pergi saat mengkliknya? Jika menujuinclude2.html, sesuai namanya itu kemungkinan halaman untuk include sehingga bagian lainnya hilang; jika menujumain.html, bagaimana menentukan bahwa kali ini yang harus dipakai adalahinclude2.html, bukaninclude1.html? Sebaliknya,article1.html,article2.html,article3.htmlmasing-masing bisa dibuat menyertakanheader.html,footer.html,navi.html, tetapi jika begitu, untuk mengubah struktur semua artikel secara global, semua artikel harus dimodifikasi. Jika ingin menambahkancomments.htmlke semua artikel, pada akhirnya Anda ingin membuat halaman lagi dengan template, dan pada titik itu browser include tidak lagi diperlukan. Masalah lain juga muncul, seperti header perlu mengetahui judul atau footer perlu mengetahui tautan sebelumnya/berikutnya; dibutuhkan cara untuk saling mengirim informasi antar-include, dan akhirnya kembali lagi ke pembuatan halaman. Jika dipikirkan, HTML include kemungkinan besar praktis tidak berguna untuk sebagian besar penggunaanDi sini ada dua use case berbeda yang tercampur. Yang satu adalah penggunaan ulang potongan, dan yang lain adalah pulau mandiri yang dapat di-embed. Yang terakhir sudah ditangani oleh iframe, jadi yang perlu diselesaikan hanya yang pertama
include2.htmlkehilangan bagian lainnya juga berlaku sama untuk include lainJika pengguna mengklik tautan
src="include.css", hasilnya akan kacau. Untuk data statis, gambar, CSS, dan konten HTML statis, ini mungkin baik-baik sajaAda isu terbuka terkait hal ini di WHATWG. Ini juga disebutkan di bagian komentar artikel blog
Client side include feature for HTML
https://github.com/whatwg/html/issues/2791
HTML pernah memiliki include, lalu popularitasnya hilang
Istilah “include” yang sebenarnya adalah fitur XML, dan itulah yang diinginkan tulisan tersebut. HTML punya pendekatan lain yang muncul sebelum XML, yaitu frames. Karena frames melakukan jauh lebih banyak hal daripada XML include, HTML tidak mendapatkan fitur itu secara terpisah. Frames kehilangan popularitas karena berbagai masalah seperti penyalahgunaan, keamanan, dan aksesibilitas
Saya masih suka menggunakannya sesekali, tetapi diperlukan tahap kompilasi yang mengevaluasinya sebelum diserahkan ke pengguna atau browser