- Chỉ với HTML thì không có tính năng
include để đưa cùng một phần tử vào nhiều trang*
- CSS có thể gọi CSS, JavaScript có thể gọi JS, nhưng HTML lại không thể nhập HTML, điều này khiến nhiều người thắc mắc
- Để giải quyết vấn đề này, người ta sử dụng nhiều JavaScript, ngôn ngữ mẫu và trình tạo trang tĩnh khác nhau
- Hiệu năng, bảo mật, độ trễ khi render, include vòng lặp cùng nhiều vấn đề phức tạp khác là rào cản cho việc đưa tính năng này vào
- Nhiều lập trình viên muốn HTML có một tính năng include thuần khai báo, nhưng điều đó vẫn chưa được đưa vào tiêu chuẩn web
Thắc mắc về việc HTML không có tính năng Include
Vấn đề được đặt ra
- Trong nhiều trang như
index.html, about.html, contact.html, việc lặp đi lặp lại phần header dùng chung là khá bất tiện
- Lập trình viên muốn tái sử dụng header đã định nghĩa một lần mà không bị trùng lặp
Những cách thay thế đã tồn tại
- Dùng fetch API của JavaScript để tải HTML bên ngoài rồi chèn vào DOM
- Server Side Include (SSI),
include của PHP, trình tạo trang tĩnh và các ngôn ngữ mẫu đều là những cách giải quyết hiện có
- Các phần tử HTML như
<iframe> và <object> cũng có thể dùng, nhưng không phù hợp vì khả năng truy cập, hiệu năng và vấn đề cô lập style
- Rốt cuộc, bản thân HTML không có cú pháp include đơn giản
Vì sao HTML không có tính năng này?
- CSS và JS lần lượt có cú pháp
@import hoặc import, nhưng HTML thì không
- Tiêu chuẩn web nói chung thường tiếp nhận các tính năng được lập trình viên dùng nhiều, nhưng HTML include thì lại chưa
- Những lý do được nêu ra gồm:
- Có thể cản trở cách hoạt động của preload scanner
- Dịch chuyển layout/nhấp nháy giao diện khi tải bất đồng bộ
- Độ phức tạp khi xử lý include lồng nhau hoặc include vòng lặp
- Sự phản đối liên quan đến việc tăng lưu lượng web hosting
- Các vấn đề bảo mật (CORS, CSP, v.v.) và xung đột về thời điểm của các sự kiện tải tài liệu
- Hoặc đơn giản là mức ưu tiên thấp và chưa có đề xuất đủ rõ ràng
Thảo luận liên quan
- Đang có thảo luận sôi nổi trong issue WHATWG trên GitHub #2791
- Trước đây Chrome từng có HTML Imports, nhưng sau đó bị loại bỏ do các trình duyệt khác không hỗ trợ
- Các cách tiếp cận thay thế như HTMX, Web Components, XSLT, SSI cũng được chia sẻ
Tóm tắt phản ứng của cộng đồng
- Việc HTML phát triển theo hướng markup tĩnh và loại trừ các chức năng mang tính logic vẫn là một triết lý khá mạnh
- Nhiều người muốn tính năng này, nhưng phần lớn là lập trình viên cá nhân khó lên tiếng trong quá trình tiêu chuẩn hóa
- Cũng có phân tích cho rằng nếu không giải quyết được các bài toán hiệu năng, bảo mật, xử lý render, ngăn vòng lặp thì rất khó đưa vào
- Có người cho rằng tính năng include bị thiếu đơn giản vì quan niệm rằng HTML chỉ nên đảm nhiệm “kết quả”
Kết luận
- Cho đến nay, HTML vẫn chưa có tính năng include thuần túy, và người dùng phải thay thế bằng nhiều công cụ hay ngôn ngữ bên ngoài
- Tuy vậy, nhiều lập trình viên vẫn kỳ vọng vào một cấu trúc tái sử dụng đơn giản dựa trên HTML
1 bình luận
Ý kiến Hacker News
iframelà đủ, thìiframekhông tự co giãn theo nội dung. Các giải pháp server-side thì cần có máy chủ. Tại sao lại không có một cách đơn giản ở phía client? Tôi nghĩ đó là một câu hỏi hợp lýiframe) từ lâu đã được thiết kế để thực hiện kiểu chức năng này. Ít nhất thì nó tự mở rộng khá tốt và người dùng có thể thay đổi kích thướcmain.htmlnhúngchild/include1.html, vàchild/include1.htmlcó liên kếtsrc="include2.html", thì khi người dùng bấm vào liên kết đó họ nên đi tới đâu? Nếu đi tớiinclude2.html, thì trang đó sẽ thiếu tất cả những phần khác. Nếu đi tớimain.html, thì làm sao chỉ định rằng lần này dùnginclude2.htmlchứ không phảiinclude1.html?article1.html,article2.html,article3.htmlv.v. có thể mỗi trang đều nhúngheader.html,footer.html,navi.html. Nhưng nếu muốn thêmcomments.htmlvào mọi bài viết thì bạn vẫn phải sửa tất cả các bài, và cuối cùng lại quay về việc tạo bài dựa trên template, khiến trình duyệt không cần hỗ trợ include nữa