4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TypeScriptに文字列として記述したHTMLをVSCodeでフォーマットしたい

Last updated at Posted at 2021-07-08

Chrome拡張開発をしています。JestでテストするためにサンプルページのHTMLのテキストが欲しくなりました。もちろんフォーマットしておきたい。

いくつか方法はあると思います。

  • htmlファイルを書いてPrettierでフォーマットする(読み込みには以下が必要)
    • html-loaderインストール
    • WebPack設定
    • declare module '*.html';で型定義
  • lit-html, typescript-lit-html-plugin のnpmインストールとlit-htmlのVSCodeプラグインを使う
  • lit-htmlのVSCodeプラグインを騙して文字列にフォーマットをかける

最初に考えたのはhtmlファイルを書いてPrettierでフォーマットです。

でも、テンプレートリテラルを使って書くならHTML構造の使い回しが出来るのでテストケースの作成が捗りそうですね。

調べていると lit というライブラリーを発見し、Usage通りにやってみることにしました。
テキストとして記述しているのにフォーマットも働くのでいい感じです!
スクリーンショット 2021-07-09 2.26.45.png

いざnpm run testを実行! → 失敗!!
調べてみると Issue になっていました。
Unexpected token error in tests

なるほどね〜設定が細かくなるのはいやだな〜。。
このlit-htmlというライブラリーはいろいろ機能があるようなのですが、私は今のところ使わないんです。

TypeScriptに文字列として記述したHTMLをVSCodeでフォーマットしたいだけ。

ということで本題です。いい感じの方法を見つけました。

TypeScriptに文字列として記述したHTMLをVSCodeでフォーマットしたい

lit-html, typescript-lit-html-pluginをインストールしなくても、lit-htmlのVSCodeプラグインがあれば以下のようなフォーマットのコードをちゃんと整形してくれます。
スクリーンショット 2021-07-09 2.40.04.png

ちなみに、String.raw, styled.div, gqlといった関数で使われているテクニックはTagged Template Literalsというらしいです。

私のケースだとhtmlという名前の関数が、単純に文字列を返すものであればいいんですよね。

調べて作ってみました。どうぞ使ってください。

export const html = (literals: TemplateStringsArray, ...placeholders: string[]): string => {
  let result = "";
  placeholders.forEach((placeholder, i) => {
    result += literals[i];
    result += placeholder;
  });
  result += literals[literals.length - 1];
  return result;
};

こんな感じでテンプレートリテラルの書き方も出来ます。
スクリーンショット 2021-07-09 2.51.30.png

これで快適ですね!

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?