VuePressでFont AwesomeとTailwind CSSを使うときの注意点
このサイトで使用しているテーマには Font Awesome のアイコンを使用しているのですが、Tailwind CSS と同時に有効化した際にスタイルが消えてしまったので対処法を残しておきます。
# 問題:本番で Font Awesome のスタイルが消える
VuePress では.vuepress/enhanceApp.js
にて fontawesome-vue のパッケージを読み込むことで Font Awesome のアイコンを使用できます。
// .vuepress/enhanceApp.js
任意の Vue コンポーネント内で以下のように使用できて、
<!-- components/hoge.vue -->
<template>
<faIcon :icon="flag" />
</template>
2
3
4
これが以下のような感じのsvg
タグに展開されます。
生じた問題は、svg
タグへの展開は行われるものの、svg-inline--fa
やfa-w-16
などのクラスへのスタイルが当たっておらず、アイコンが親要素いっぱいまで拡大してしまうというものです。
また、ローカルの dev server での実行では問題ないものの、production build した場合に問題が発生していました。
# 原因:Tailwind CSS にパージされる
同時に Tailwind のライブラリを使用していたことが原因でした。
Tailwind は production build 時に使用していないクラスを purge する機能が組み込まれているのですが、どうやらクラスの使用有無の判断が Font Awesome のタグ展開より先のタイミングであり、そちらのスタイルはパージされてしまっていたようです。
# 対処:Font Awesome のスタイルを直接読み込む
Font Awesome の CSS を手動で読み込み、パージ対象外のフラグをつける という手法で対処しました。
まず、node_modules/@fontawesome/style.css
を VuePress の.vuepress/styles/
ディレクトリへコピーします。後のため、拡張子を.styl
に変更します(styl
ファイルには通常の CSS の形式でも書けるため問題はありません)。ここでは名前をfontawesome-core.styl
としました。
❯ cp node_modules/@fortawesome/fontawesome-svg-core/styles.css blog/.vuepress/theme/styles/fontawesome-core.styl
コピーしたファイルの先頭と末尾にignore
を追加します。
これを.vuepress/styles/index.styl
から読み込みます。なお Tailwind CSS の初期化宣言よりも後にすると所望の動作をしませんでした。
@require './fontawesome-core'
@tailwind base
@tailwind components
@tailwind utilities; /* styles... */
2
3
4
5
これでアイコンが表示されるようになりました。
これは Font Awesome のスタイルをパージ対象から外しているわけなので、当然ながら、副作用として、ビルド結果の CSS のサイズが大きくなります。
サイズを気にする場合、もとの CSS ファイル全体をコピーしてくるのではなく、使用しているクラスのみを抽出するべきですが、今回はそこまで神経質にならなくても良いかと考え、全体をコピーする手法を取りました。
# 参考
今回の対処の参考にしたサイト。
Font Awesome 公式。現在 v5 だが v6 が alpha として出ている。バージョンアップたのしみ。
Tailwind CSS 公式。今年中には v3 が出るらしい。バージョンアップたのしみ。