3.

HTMLコメントの書き方|<!-- -->・入れ子の罠・条件付きコメント

編集
この記事の要点
  • HTML のコメントは <!----> で囲んだ部分
  • コメントはブラウザの画面には表示されないが、HTML ソースには残るため秘密情報を書いてはいけない
  • 入れ子は不可。コメント内に -- を含めると意図しない終端になり HTML が崩れる
  • IE 専用の条件付きコメント<!--[if IE]>)はモダンブラウザでは無視され、IE 廃止により役目を終えた
  • コメントはSEO に影響しないが、過剰なコメントはファイル容量を増やすため本番では minify するのが一般的

HTML コメントとは

コメントは HTML ソース上のメモ書きで、ブラウザの表示には現れません<!-- で始まり、--> で終わります。コード内の説明や、一時的に無効化したい部分を残しておくのに使います。

基本構文

<!-- これは 1 行のコメント -->

<!--
  複数行のコメントもOK。
  ブラウザ上には表示されません。
-->

<p>本文</p>
<!-- TODO: 後でリンクを直す -->
<a href="#">テキスト</a>

ブラウザでの扱い

場所コメントは見えるか
ブラウザの描画画面見えない
「ページのソースを表示」(Ctrl+U)見える
デベロッパーツールの Elements パネル見える
検索エンジンのインデックスクロールされるが、ランキング要素にはほぼ無関係

重要: コメントはユーザーに見える可能性があるため、API キー / パスワード / 内部 URL などを書いてはいけません。よく <!-- TODO: パスワードを後で本番のものに差し替え --> のような書き方で漏洩する事例があります。

入れ子の罠 — HTML コメントは入れ子にできない

HTML のコメントは入れ子にできません。コメント内に -- が含まれるとそこで終端と見なされ、表示が崩れます。

<!-- 外側のコメント
  <!-- 内側のコメント -->
  ここ以降は意図せず本文扱いになる!
-->

大きなブロックを一時的に無効化したいときは外側に <script type="text/x-suspend"> を巻くか、HTML を別ファイルに退避させるなど別の手段を使うのが安全です。

条件付きコメント(過去の話)

IE 10 までは条件付きコメントという独自仕様で、IE のバージョン別に HTML を切り替えられました。

<!--[if IE 8]>
  <link rel="stylesheet" href="ie8.css">
<![endif]-->

<!--[if !IE]><!-->
  <link rel="stylesheet" href="modern.css">
<!--<![endif]-->

これは IE の独自拡張。IE 11 から条件付きコメントは廃止され、現在は IE 自体がサポート切れのため、ほぼレガシーコードでしか見ない記法になりました。新規コードでは使う必要はありません。

SEO とコメント

検索エンジンはコメント内のテキストをランキング要素として扱いません。ただしクローラーはコメントを読み取ってログに残すため、内部システムの URL や開発メモが漏洩しないようにしましょう。本番デプロイ時に minify ツール(HTMLMinifier 等)でコメントを除去するのがプロフェッショナルな実装パターンです。

JavaScript / CSS のコメントとの違い

言語1 行コメント複数行コメント
HTMLなし<!-- ... -->
CSSなし/* ... */
JavaScript// .../* ... */

<style><script> タグの内部では、その言語のコメント記法を使うのが正しい書き方です。

<style>
  /* CSS のコメントはここ */
  .x { color: red; }
</style>

<script>
  // JS の 1 行コメント
  /* JS の複数行コメント */
  console.log('hi');
</script>

実践: ブロックの無効化

テスト中に一部のマークアップを一時的に消したい場合、コメントで囲むのが手軽です。

<!--
<div class="banner">
  <p>キャンペーン中!</p>
</div>
-->

ただしコメント化したコードを長期間残すのはアンチパターン。Git で履歴管理してから消す方が、ソース全体が読みやすくなります。

セキュリティに関する注意点

HTML コメントはブラウザ画面に出ないだけで、HTTP レスポンスには含まれて送信されている点が見落とされがちです。実際に過去に発生した情報漏洩事例:

  • 本番デプロイ時にデバッグ用 API キーをコメントに残したまま公開してしまい、悪用された
  • 「TODO: 後で本番DBに繋ぐ」のコメントから内部 DB ホスト名が漏洩
  • 古いプロモーションコードをコメントアウトして残していたら、ソース表示で発見されて利用された

これらを防ぐためにも、本番ビルドではコメントを minify ツールで除去するのが標準的な運用です。Webpack / Vite / Next.js などのモダンビルドツールは既定でコメント除去が有効になっていることが多いですが、サーバサイドレンダリングの HTML 文字列内のコメントは別途対応が必要です。

テンプレートエンジンのコメントとの違い

EJS / Blade / Twig などのテンプレートエンジンには、サーバ側でのみ消えるコメントがあります。これらは出力 HTML にも残らないため、機密情報を書いても漏洩しません(ただしソースコードに残ることは要注意)。

{# Twig: 出力されないコメント。安全 #}
<!-- HTML コメント: ブラウザのソースに残る -->

FAQ

Q: コメントの中に HTML タグを書ける?
A: 書けます。タグはコメント内では単なるテキストとして扱われます。ただし -- が含まれているとそこで終端扱いになる点に注意。

Q: コメントは何文字まで書ける?
A: HTML 仕様には文字数制限はありません。ただしファイルサイズが増えてダウンロードが遅くなるので、本番では minify するべきです。

Q: ブラウザに表示しないだけで通信されるのでは?
A: その通りです。コメントもサーバから送信される HTML の一部。「画面に出ないから安心」ではなく、ソースは誰でも見られる前提で書きましょう。

関連

  • HTML — ハイパーテキストマークアップ言語
  • DOCTYPE 宣言 — ドキュメントタイプの宣言
  • script 要素 — JavaScript を埋め込む
  • style 要素 — CSS を埋め込む
  • HTML minify — コメントや空白を削減して軽量化
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 全体構造
  2. DOCTYPE宣言
  3. コメント

最近更新/作成されたページ