- มีข้อจำกัดว่าใน HTML เพียงอย่างเดียว ไม่มีฟีเจอร์
include สำหรับนำองค์ประกอบเดียวกันไปใช้ซ้ำในหลายหน้าได้โดยตรง
- แม้ว่า CSS จะเรียก CSS ได้ และ JavaScript จะเรียก JS ได้ แต่ HTML กลับไม่สามารถดึง HTML เข้ามาได้ จึงกลายเป็นคำถามที่น่าสงสัย
- เพื่อแก้ปัญหานี้ จึงมีการใช้ JavaScript, ภาษาเทมเพลต และ static site generator หลากหลายแบบ
- ปัญหาด้านประสิทธิภาพ ความปลอดภัย ความล่าช้าในการเรนเดอร์ และการ include แบบวนซ้ำ เป็นอุปสรรคสำคัญต่อการเพิ่มฟีเจอร์นี้
- นักพัฒนาจำนวนมากต้องการ ฟีเจอร์ include แบบ declarative ที่เป็น native ของ HTML แต่จนถึงตอนนี้ก็ยังไม่ถูกรวมเข้าไปในมาตรฐานเว็บ
คำถามว่าทำไม HTML ถึงไม่มีฟีเจอร์ Include
การตั้งประเด็น
- ในหลายหน้าอย่าง
index.html, about.html, contact.html มีความไม่สะดวกจากการต้องแทรก header ที่ใช้ร่วมกัน ซ้ำ ๆ
- นักพัฒนาต้องการ นำ header ที่นิยามไว้ครั้งเดียวกลับมาใช้ซ้ำโดยไม่เกิดความซ้ำซ้อน
วิธีทดแทนที่มีอยู่แล้ว
- ใช้ fetch API ของ JavaScript เพื่อโหลด HTML ภายนอกแล้วแทรกลงใน DOM
- มีทางออกอย่าง Server Side Includes (SSI),
include ของ PHP, static site generator และภาษาเทมเพลต
- องค์ประกอบ HTML อย่าง
<iframe> และ <object> ก็พอใช้ได้เช่นกัน แต่ ไม่เหมาะสมเพราะมีปัญหาเรื่องการเข้าถึง ประสิทธิภาพ และการแยกสไตล์
- สุดท้ายแล้ว ตัว HTML เองก็ยังไม่มีไวยากรณ์ include แบบง่าย ๆ
ทำไม HTML ถึงไม่มีฟีเจอร์นี้?
- CSS และ JS ต่างก็มีไวยากรณ์อย่าง
@import หรือ import ของตัวเอง แต่ HTML ไม่มีสิ่งนั้น
- มาตรฐานเว็บโดยทั่วไปมักรับเอาฟีเจอร์ที่นักพัฒนาใช้กันมากเข้ามา แต่ HTML include กลับไม่เป็นเช่นนั้น
- เหตุผลที่ถูกหยิบยกขึ้นมามีดังนี้:
- อาจรบกวนการทำงานของ preload scanner
- อาจเกิด ปัญหา layout shift หรืออาการกะพริบเมื่อโหลดแบบอะซิงโครนัส
- มี ความซับซ้อนในการจัดการ include แบบซ้อนกันหรือแบบวนซ้ำ
- อาจมี แรงต้านจากการเพิ่มปริมาณทราฟฟิกของเว็บโฮสติ้ง
- มี ประเด็นด้านความปลอดภัย (CORS, CSP ฯลฯ) และ ความขัดแย้งด้านจังหวะเวลาของ document loading event
- หรืออาจเป็นเพียงเพราะ ลำดับความสำคัญต่ำและยังไม่มีข้อเสนอที่ชัดเจน
การถกเถียงที่เกี่ยวข้อง
- มีการถกเถียงกันอย่างคึกคักใน GitHub WHATWG issue thread #2791
- ในอดีต Chrome เคยมี HTML Imports อยู่ช่วงหนึ่ง แต่ภายหลังถูกยกเลิกเพราะ เบราว์เซอร์อื่นไม่รองรับ
- มีการแชร์แนวทางทางเลือก เช่น HTMX, Web Components, XSLT, SSI เป็นต้น
สรุปปฏิกิริยาจากชุมชน
- การพัฒนาของ HTML ยังคงรักษาแนวคิดแบบ เน้น static markup และยังมีปรัชญาที่ ตัดความสามารถเชิงตรรกะออกไป อย่างชัดเจน
- แม้หลายคนต้องการฟีเจอร์นี้ แต่ส่วนใหญ่เป็น นักพัฒนาอิสระที่ส่งเสียงได้ยากในกระบวนการทำมาตรฐาน
- ก็มีการวิเคราะห์ด้วยว่า หากยังแก้ปัญหาเชิงออกแบบที่ซับซ้อนอย่าง ประสิทธิภาพ ความปลอดภัย การเรนเดอร์ และการป้องกันการวนซ้ำ ไม่ได้ ก็ยากที่จะนำมาใช้จริง
- นักพัฒนาบางคนมองว่า ฟีเจอร์นี้หายไปเพียงเพราะแนวคิดที่ว่า HTML ควรรับผิดชอบแค่ “ผลลัพธ์” เท่านั้น
บทสรุป
- จนถึงตอนนี้ HTML ก็ยัง ไม่มีฟีเจอร์ include แบบแท้ ๆ และยังต้องพึ่งเครื่องมือหรือภาษาภายนอกในการทดแทน
- อย่างไรก็ตาม นักพัฒนาจำนวนมากก็ยังคาดหวัง โครงสร้างการนำกลับมาใช้ซ้ำที่เรียบง่ายบนพื้นฐานของ HTML
1 ความคิดเห็น
ความคิดเห็นบน Hacker News