[Astro] アイコンを表示する
AstroはSSRでしか使用しないので、SSRを前提とする。
設定はこんな感じ。
export default defineConfig({
// SSR type configuration
output: 'server',
adapter: node({
mode: 'standalone'
}),
server: { port: 3000, host: true },
...
});
astro-icon
パッケージを追加すると
import icon from "astro-icon";
export default defineConfig({
...
integrations: [icon()],
});
import { Icon } from 'astro-icon/components';
---
<Icon name="mdi:account" />
でアイコンが表示できるらしい。でない。
アイコンリソースが必要のようだ。
@iconify-json/mdi
パッケージを追加する。⇒ アイコン出た。
SSRの場合はアイコンリソースがすべて読み込まれてしまうようだ。
ここのアイコンが使える。
必要なアイコンのリソースだけを読み込むように制限を加える。
export default defineConfig({
...
integrations: [
// icon(), // [A]
// icon({ // [B]
// include: {
// mdi: ["*"],
// },
// },
icon({ // [C]
include: {
mdi: ["account"]
},
}),
],
});
Aパターン、Bパターンはファイルサイズは同じ。
Cパターンでは大幅にサイズが小さくなる。(2863KB → 5KB)
しかし使用するアイコンをすべて列挙するのは現実的ではない。
自動的に.astro/icon.d.ts
にアイコンの型定義ファイルが追加された。
VueやReactコンポーネントでアイコンを表示するには、@iconify/vue
、@iconify/react
パッケージを使用する。
Vue、Reactとも以下の書式で表示するがアイコンの表示が遅延する。
import { Icon } from '@iconify/vue'
あるいは
import { Icon } from '@iconify/react'
<Icon icon="mdi:home" />
unplugin-icons
パッケージでViteに処理を加える。
import react from '@astrojs/react'
import vue from "@astrojs/vue"
import Icons from 'unplugin-icons/vite'
export default defineConfig({
...
integrations: [react(), vue()],
vite: {
plugins: [Icons()]
}
})
アイコンの取得方法は1つずつ取得する方法に変わる。Vueでは遅延が止まった。
import CheckFill from "~icons/ph/check-fill"
<CheckFill color="red" width="500" height="500" />
Reactでは
Cannot read properties of null (reading 'useCallback')
のエラーが出る。
@iconify-json/ph
でアイコンリソースは追加する必要あり。
ここは参考になった。
あるアイコンセットを使用するには、アイコンリソースを読み込む必要がある。
astro-icon
とunplugin-icons
パッケージを使用して以下のように設定する。
アイコンセットは指定する必要がある。
@iconify-json/xxx
形式のパッケージのアイコンリソースを読み込んでおき、includeセクションに記述する。
import icon from 'astro-icon'
import Icons from 'unplugin-icons/vite'
export default defineConfig({
...
integrations: [
...
icon({
include: {
mdi: ['*']
}
})
],
vite: {
plugins: [Icons()]
}
})
これでAstroファイルでもVue、Reactコンポーネントでも表示可能になる。
アイコンの表示が遅れるのは、クライアント側の処理でアイコンが追加されているから。