Font Awesome 6をAstroで使う
に投稿 (更新日: )
このサイトをNext.jsからAstroに置き換えた際に、Font Awesomeを導入したので、その手順をメモとして残しておきます。
インストールするもの
Using a Package Manager | Font Awesome Docsを参考に、必須パッケージである@fortawesome/fontawesome-svg-core
と、使用したいアイコンのパッケージをインストールします。
# 必須
npm install --save @fortawesome/fontawesome-svg-core
# 一つ以上選ぶ
npm install --save @fortawesome/free-solid-svg-icons
npm install --save @fortawesome/free-regular-svg-icons
npm install --save @fortawesome/free-brands-svg-icons
共通レイアウトにスタイルを追加する
Font Awesomeを使用するページでは、@fortawesome/fontawesome-svg-core
に含まれるstyles.css
をインポートする必要があります。
これを追加し忘れると、SVGアイコンに割り当てられるクラスに対してスタイルが当たらず、レイアウトシフト発生の原因になったりするため必ず追加しましょう。
---
import '@fortawesome/fontawesome-svg-core/styles.css'
---
<!doctype html>
<html lang="ja">
<head>
<title>Example Project</title>
</head>
<body>
<slot />
</body>
</html>
アイコンを使用する
icon(iconDefinition, params)
というアイコンをSVGでレンダリングしてくれる関数があるので、それを使用してset:html
ディレクティブにレンダリングされたSVGを渡してあげれば、アイコンを挿入することができます。
---
import { icon } from '@fortawesome/fontawesome-svg-core'
import { faStar } from '@fortawesome/free-solid-svg-icons'
const starIcon = icon(faStar)
---
<Fragment set:html={starIcon.icon.html} />
コンポーネント化しよう
使用する箇所で毎回上のようにやっても構いませんが、面倒くさいのでFontAwesomeIcon.astro
という名前で新しくコンポーネントを作って、使い回しできるようにしておくと便利です。
加えて、共通レイアウトにスタイルを追加せずとも、コンポーネントにインポート文を追加することで使用するページのみにスタイルを追加できるので、おすすめです。
---
import '@fortawesome/fontawesome-svg-core/styles.css'
import { icon, type IconLookup, type IconName, type IconParams } from '@fortawesome/fontawesome-svg-core'
interface Props {
icon: IconName | IconLookup
params?: IconParams
}
const { html } = icon(Astro.props.icon, Astro.props.params)
---
<Fragment set:html={html} />
使用例は以下の通りです。
---
import FontAwesomeIcon from '@/components/FontAwesomeIcon.astro'
import { faStar } from '@fortawesome/free-solid-svg-icons'
---
<FontAwesomeIcon icon={faStar} />
Reactを併用している場合
@fortawesome/react-fontawesome
を使用してReactでFont Awesomeのアイコンを使う場合、autoAddCss
を無効にしないと、既に挿入したimport '@fortawesome/fontawesome-svg-core/styles.css'
の内容と重複したスタイルが挿入されてしまいます。
これを防ぐため、FontAwesomeIcon
コンポーネントをラップしてautoAddCss
を無効にする処理を入れて、使い回すようにすることをオススメします。
import type { FontAwesomeIconProps } from '@fortawesome/react-fontawesome'
import { config as fontAwesomeConfig } from '@fortawesome/fontawesome-svg-core'
import { FontAwesomeIcon as FontAwesomeIconOriginal } from '@fortawesome/react-fontawesome'
import '@fortawesome/fontawesome-svg-core/styles.css'
fontAwesomeConfig.autoAddCss = false
const FontAwesomeIcon: React.FC<FontAwesomeIconProps> = (props) => {
return <FontAwesomeIconOriginal {...props} />
}
export default FontAwesomeIcon