CRXJS Vite PluginでTailwind CSSを使う注意点
Chrome拡張機能のフレームワークCRXJS Vite PluginとTailwind CSSを組み合わせて使うと、Tailwindの部分だけHMRが効きません。
たとえば、
「class="bg-red-50"
をclass="bg-cyan-900"
に変えて保存したけど自動で反映されない……!」
となります。
対策としてViteのバージョンを下げるという手もありますが、さまざまな制約を受けるため賢明とはいえません。
リポジトリのIssue #671を漁っていたところ、Viteの設定を追加すれば解決できると判明しました。
本記事では、Issueにコメントされていた設定を改変した解決策を解説します。
しくみ
Tailwind CSSに関係するCSSファイルのタイプスタンプを更新することで、HMRを発火させます。これをViteのプラグインとして設定してあげればOKです。
プラグインのコード
まずはプラグインのコードをお見せします。今回はプロジェクトファイル直下にvite-plugin-touch-global-css.ts
という名前で作りました。
先に全体を載せ、次の項目から小分けで解説します。
タイムスタンプの更新
touchFile
がファイルのタイムスタンプを更新する関数です。
プラグインのオプション
プラグインのオプションは2つあります。
cssFilePath
は次のようなTailwind CSSのディレクティブを書いたファイルを指定します。
プラグインのオプションwatchMatch
は「保存したらHMRを発火させたいパスの正規表現」にしました。
元のIssueはディレクトリではなくファイルのリストを扱っていましたが、筆者は変更しました。これで「src
ディレクトリ以下のファイル」のように指定できます。
プラグインとして返す
最後のtouchGlobalCSSPlugin
が実際にプラグインとして呼ばれるコードです。
ファイルを監視して、変更ファイルが「watchMatch
で指定したパス」とマッチしたらcssFilePath
のタイムスタンプを更新します。
Viteプラグインの書き方をもっと詳しく知りたい方は公式ドキュメントを読みましょう。
vite.config.ts
後はvite.config.tsでプラグインを使うように書き換えるだけです。次の例ではReactを使っていますが、他の場合でもやり方自体は同じです。
ファイルの監視はsrc
ディレクトリ以下を対象にしました。
他の対応も列挙
Issueには他の方法も挙がっていましたので一応紹介します。筆者としては上記のTouchプラグインでの対応を推奨します。
Viteのバージョンを落とす
Viteを3まで落として使う方法があります。ただ他のViteのプラグインの関係でバージョンを落とすのが大変面倒くさくなってしまうケースが多いです。
Tailwindのsafelistを活用する
Tailwind CSSの設定のsafelist
に書いたクラスは、実際にそのクラスを使っていないくてもCSSに含まれます。このしくみをdevelopmentモードのときだけ活用する解決方法です。
ただこれだとすべてのクラスを含んでしまうため、次のようによく使う特定のクラスのみsafelistに突っ込む方法もあります。
最近はChrome拡張機能のフレームワークとしてwxtやextension.jsもありますが、まだまだCRXJS Vite Pluginも現役ですね。
本当は本体のコードを読んでPull Requestを送るのが一番ですが、メンテナンスが止まっているっぽいので「CRXJS x Tailwind民」はしばらくこの対応だけで落ち着きそうです。
ちなみに筆者は、この対応で初めてViteのプラグインを書きました。意外と短いコードだけでも書けるんですね。