などの疑問や悩みを解決してまいります。
Vite(プロジェクトの開発を高速化してくれるビルドツール)にはalias(エイリアス)と言われる便利な機能があります。
このaliasを使用することで、相対パスをaliasで設定することができます。
import TheWelcome from '../components/TheWelcome.vue'
// 相対パスの記述を省略することができる
import TheWelcome from '@/components/TheWelcome.vue'
今回はこのaliasの設定方法について解説していきたいと思います。
Viteとは
Viteについては別記事にて解説しています。
導入方法もこちらに解説がありますのでぜひ参考にしてください。
-
【Vue.js】Viteの解説を交えながら、Viteプロジェクトを作成する方法も解説します。
続きを見る
Viteのalias paths(エイリアスパス)オプション
Vite のオプションにあるalias paths(エイリアスパス)を利用することで、プロジェクト内のファイルパスやディレクトリパスを相対パスにすることなく、別名で参照することができるようになります。
VueやReactなどのプロジェクトファイルを見てみたときに「@」の記号がパスに含まれているのを見たことがありませんか?
これはエイリアスパスを設定しており、そのファイルまでのパスを「@」で省略ができるように設定しています。
alias pathsの設定方法
Viteの設定ファイルであるvite.config.jsに以下のようにresolve.alias
を定義します。
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
}
})
import { fileURLToPath, URL } from 'node:url'
の記述は、Node.jsの標準モジュールであるurlを利用しています。
エイリアスパスを設定しているコードは以下になります。
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
}
resolve.alias
については公式サイトにも解説があります。
このようにresolve.alias
を設定することによって以下のように相対パスを省略した書き方ができるようになります。
import TheWelcome from '../components/TheWelcome.vue'
// 相対パスの記述を省略することができる
import TheWelcome from '@/components/TheWelcome.vue'
Vuetifyのコンポーネントで画像を参照するには
これまでViteのエイリアスパスの設定方法について解説しましたが、このままではVue.jsのUIライブラリであるVuetifyのコンポーネントで画像を参照することができません。
例えばVuetifyのv-carousel
コンポーネントタグ内で使用する画像にエイリアスパスを使用して、src
属性から画像を参照しようとすると画像が表示されません。
<template>
<p>↓ v-imgタグの画像が表示されます ↓</p>
<v-img :width="300" src="@/assets/logo.png"></v-img>
<p>↓ v-carouselタグの画像が表示されます ↓</p>
<v-carousel>
<v-carousel-item
:width="500"
src="@/assets/logo.png"
cover
></v-carousel-item>
<v-carousel-item
:width="500"
src="@/assets/logo.png"
cover
></v-carousel-item>
<v-carousel-item
:width="500"
src="@/assets/logo.png"
cover
></v-carousel-item>
</v-carousel>
</template>
参考
v-img
コンポーネントタグは画像が表示される理由については、調べても参考になる記事が見つけられませんでした…。
ちなみにchatGPTでは、「v-img
コンポーネントが設定をしなくても画像が表示されるのは、Vuetifyの仕様によるものです。Vuetifyはv-img
コンポーネントのために特別な処理を行っているため、v-img
のsrc
属性はエイリアスパスを正しく解決するようになっています。」という回答がありました。
上記画像を見てもらうとv-carousel
コンポーネントタグ内で指定している画像だけが表示されていないのが分かります。
原因
検証ツールでコードを確認すると、パスがコンパイルされずに記述したエイリアスパスがそのままsrc
属性に表示されています。
対応方法
なぜコンパイルされないかといいますと、Viteはパスの変換対象のタグや属性がデフォルトで設定されているからです。
デフォルトは以下の設定になっており、Vuetifyのコンポーネントタグでもエイリアスパスを使用するためには設定を追記する必要があります。
// Viteのデフォルトの設定
{
video: ['src', 'poster'],
source: ['src'],
img: ['src'],
image: ['xlink:href', 'href'],
use: ['xlink:href', 'href']
}
設定を追加する場合は以下のコードになります。
template.transformAssetUrls
オプションです。export default defineConfig({
plugins: [
vue({
template: {
transformAssetUrls: {
tags: {
"v-img": ["src"], // 表示されない場合は追加
"v-carousel-item": ["src"], // 追加
video: ["src", "poster"],
source: ["src"],
img: ["src"],
image: ["xlink:href", "href"],
use: ["xlink:href", "href"],
},
},
},
}),
...以下省略
このように記述して再度確認していただくとv-carousel-item
コンポーネントタグ内の画像が表示されたかと思います。
本記事のまとめ
ここまで読んでいただきありがとうございました。本記事のまとめです。
ポイント
- alias paths(エイリアスパス)を利用することで、プロジェクト内のファイルパスやディレクトリパスを相対パスにすることなく、別名で参照することができる
- vite.config.jsに
resolve.alias
を定義する - Viteはパスの変換対象のタグや属性がデフォルトで設定
されている