- HTMLだけでは、同じ要素を複数ページに含めるための
include 機能がない
- CSSはCSSを、JavaScriptはJSを読み込めるのに、HTMLはHTMLを取り込めないのはなぜかという疑問
- この問題を解決するために、さまざまな JavaScript、テンプレート言語、静的サイトジェネレーター などが使われている
- パフォーマンス、セキュリティ、レンダリング遅延、循環インクルードなどの複雑な問題 が導入の障壁になっている
- 多くの開発者がHTMLに 純粋な宣言的 include 機能 を望んでいるが、まだWeb標準には反映されていない
HTMLにInclude機能がない理由への疑問
問題提起
index.html、about.html、contact.html など複数のページで 共通ヘッダー を繰り返し挿入しなければならない不便さがある
- 開発者は 重複なく、一度定義したヘッダーを再利用 したいと考えている
すでに存在する代替手段
- JavaScriptの fetch API で外部HTMLを読み込み、DOMに挿入する方法
- サーバーサイドインクルード(SSI)、PHPの
include、静的サイトジェネレーター、テンプレート言語などが解決策として存在する
<iframe> や <object> のようなHTML要素も使えるが、アクセシビリティ、パフォーマンス、スタイル分離の問題 により不適切
- 結局のところ HTML自体にはシンプルなインクルード構文がない
なぜHTMLにはこの機能がないのか?
- CSSとJSにはそれぞれ
@import や import 構文があるが、HTMLには存在しない
- Web標準は一般に開発者がよく使う機能を取り込んできたが、HTMLインクルードはそうならなかった
- 挙げられている理由:
- プリロードスキャナー の動作を妨げる可能性
- 非同期読み込み時のレイアウトシフトやちらつきの問題
- ネストまたは循環インクルード処理の複雑さ
- Webホスティングのトラフィック増加への反発
- セキュリティ上の問題(CORS、CSPなど) と ドキュメント読み込みイベントのタイミング衝突
- あるいは単に 優先度が低く、明確な提案がなかっただけかもしれない
関連する議論
- GitHubのWHATWG issueスレッド #2791 で活発に議論されている
- かつてChromeには HTML Imports が存在したが、他ブラウザーでサポートされなかったこともあり 廃止された
- HTMX、Web Components、XSLT、SSI などの代替アプローチも共有されている
コミュニティの反応まとめ
- HTMLの進化が 静的マークアップ中心 のまま維持され、ロジック的な機能を排除 するという思想がなお強い
- この機能を望む人は多いが、標準化プロセスで声を上げにくい個人開発者 が大半
- パフォーマンス、セキュリティ、レンダリング処理、循環防止など の複雑な設計課題を解決しない限り導入は難しいという分析もある
- ある開発者は、単に HTMLは「結果」だけを担うべきだという考え方 のためにインクルード機能が欠けていると見ている
結論
- HTMLには現在も 純粋な include 機能は存在せず、さまざまな外部ツールや言語で代替する必要がある
- それでも多くの開発者は依然として シンプルなHTMLベースの再利用構造 を期待している
1件のコメント
Hacker Newsの意見