📝

PrettierでHTMLの空要素に"/"が入る(VS Code使用)

2023/01/08に公開

Prettierを使ってHTMLをフォーマットすると空要素の最後に"/"が入る。

<meta charset="UTF-8">
<img src="xxx.jpg" alt="xxx">

が次に書くように、”/”が追加されてしまう。

<meta charset="UTF-8" />
<img src="xxx.jpg" alt="xxx" />

なぜHTMLの空要素の最後に"/"が入るのか?

Prettierのissue "Add an option to prefer void tags over self closing tags. #5246"
ざっと読んだところこの仕様の理由は

  • XML(XHTML)との互換性
  • 読みやすさ
    などであり、設定で変更することはできない。

また別のissue"The formatting of self-closing tags in HTML5 #5641"によると、HTMLのフォーマッティングの開発時にそう決まったからだそう。
そして、オプションの理念ページには

Prettier has a few options because of history. But we won’t add more of them.

ざっくり訳すと「オプションの追加は現在受け付けていない」とのことで、この件に関わる仕様が変わる可能性は低いと思う。
詳しくはオプションの理念ページを読んでほしい。

とはいえ、issue#5246はまだcloseになっていないので、今後大きな動きがあれば変更されるかもしれない。

対応

VS CodeのHTMLフォーマッタをVSCodeのフォーマッタに切り替えることで対応できる。
(つまり、Prettierを使うのを諦める😥)
次に示す例では、VS Codeのsettings.jsonのHTMLのフォーマッタを"esbenp.prettier-vscode"(Prettier)から"vscode.html-language-features"(VS Code標準)に修正する。

settings.js
// 修正前
 "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  }

// 修正後
"[html]": {
    "editor.defaultFormatter": "vscode.html-language-features"
  }

Discussion