assets
の画像を読む際に、template
内のimg
タグに直接記述するのではなく、スクリプト側の変数を利用してsrc
を設定する際、~
などがうまく意図したパスに変換されないことがあります。
例
このようにした場合、上のimg
タグは適切なパスを参照するのに対し、下のタグは~/assets/img/keyboard.jpg
のままになります。
<template> <div> <img src="~/assets/img/keyboard.jpg"> <!-- OK --> <img :src="imgSrc"> <!-- NG --> </div> <template> <script> export default { data: () => { return { imgSrc: '~/assets/img/keyboard.jpg' } } } </script>
解決策
template
内のsrc属性は、vue-loader
でコンパイル時に~/assets/img/keyboard.jpg
->/_nuxt/assets/img/keyboard.jpg
のように適切なパスに変換されるので、スクリプト内で同じような処理を挟む必要があります。
vue-loader
の仕様。
1. requireを使う
export default { data: () => { return { imgSrc: require('~/assets/img/keyboard.jpg') } } }
2. importを使う
import keyboardImage from '~/assets/img/keyboard.jpg' export default { data: () => { return { imgSrc: keyboardImage } } }