Vuetify + Nuxt.js + @mdi/js で最小限のアイコンをバンドルする
執筆中ですが、ヒントになればと思い公開しています。
概要
Nuxt SSR + Vuetify の構成でロードがおそすぎる状況を改善するための一つの手段として、Material Design Icon の読み込みを、Vuetify 公式を参考に導入してみたが、
わかりにくいところがあったので備忘録も兼ねて記述します。
基本的な使い方の補足
基本的な使い方は公式の以下を参照のこと。
@mdi/js
のインストールは公式のまま実行
その後の追記する記述が Nuxt
の場合少し違う。
まず、 src/plugins/vuetify.js
は作成する必要はなく、
代わりに nuxt.config.js
の buildModules
にて、
'@nuxtjs/vuetify' のオプションとして以下を追加する。
buildModules: [
// https://go.nuxtjs.dev/vuetify
[
'@nuxtjs/vuetify',
{
customVariables: ['~/assets/scss/vuetify/variables/_index.scss'],
optionsPath: '~/configs/vuetify.js',
treeShake: true,
defaultAssets: {
font: {
family: 'Noto Sans JP',
},
icons: 'mdiSvg', // ← ここを追加
},
},
],
・・・
]
公式の src/plugins/vuetify.js
の記述例では、
export default new Vuetify({
icons: {
iconfont: 'mdiSvg',
},
})
↑このように書かれているので、初め nuxt.config.js
にも icons: { 省略 }
と記述されていた。
しかし、@nuxt.js/vuetify
の README
を読むと、
icons
オプションは Vuetify
の icons.iconfont
をオーバライドすると書いてあったので、先述のように変更するとうまく行った。
nuxt-community/vuetify-module: Vuetify Module for Nuxt.js
また、上記ドキュメントのテーブルには icons
に指定できる値として、 mdiSvg
はないが、
それはおそらくデフォルトではないということだと思う。
@mdi/js
をインストールしていれば、先述のように指定できる。
Vuetify
が必要とするデフォルトのアイコンは読み込まれる
重要: ここまでで Vuetify
のデフォルトのコンポーネントで使用されているアイコンたち。
例えば、v-expansion-panel
のキャレット(シェブロン)や v-navigation-drawer
のハンバーガーアイコンなど。
どのアイコンがデフォルトで読み込まれるかは以下の Vuetify
のソースコードを確認のこと
vuetify/mdi-svg.ts at master · vuetifyjs/vuetify
なので、Vuetify
デフォルトのアイコンに対してわざわざ slot
を使ったりして、
個別で読み込んだアイコンを差し込んで上げる必要はない。
v-icon
などでアイコンを使う部分に関しては、個別に import
が必要
それ以外に自分で その方法は、以下のように公式どおりです。
<!-- Vue Component -->
<template>
<v-icon>{{ svgPath }}</v-icon>
</template>
<script>
import { mdiAccount } from '@mdi/js'
export default {
data: () => ({
svgPath: mdiAccount
}),
}
</script>
アイコンが多い場合個別に読み込むのが非常にめんどくさいのでその解消方法
以下執筆中
Discussion