vue中如何使用动态本地图片?

时间:2021-01-15 20:28:12

标签: javascript vue.js webpack vuejs2

我正在尝试根据选定的选项显示动态图像(使用下面显示的模板),但是当我部署应用程序时,我认为 Webpack 会更改图像文件名。如何防止这种重命名?

<select v-model="geturl">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
<div v-if="geturl">
    <img
        :src="require(`@/assets/images/${geturl}.jpg`)"
        style="height:250px; width:250px; object-fit:cover;">
</div>

如果我在开发模式下更改选项,我可以看到图像;但是当我部署应用程序时,图像文件名会转换为 1.zxc123.jpg

Folder structure

3 个答案:

答案 0 :(得分:3)

写入输出目录的图像由 file-loader(通过 url-loader)处理。 Vue CLI 使用 filename template 配置 file-loader

'img/[name].[hash:8].[ext]'

在您的 Vue project config 中,从文件名模板中删除 .[hash:8] 以禁用资产哈希:

// vue.config.js
module.exports = {
  chainWebpack: config => {
    config.module
      .rule('images')
        .use('url-loader')
          .loader('url-loader')
          .tap(options => {
            // file-loader is the fallback loader
            options.fallback.options.name = 'img/[name].[ext]'
            return options                             ?
          })
  }
}

答案 1 :(得分:3)

您可以通过简单地将图像移动到 public 文件夹并使用组件中的绝对路径导入图像来防止重命名。

然后你可以使用like..

<img :src="`${geturl}.jpg`">



或者,如果您想更好地控制 base_url,那么您可以执行以下操作..

在 public/index.html 中,您需要在链接前加上 <%= BASE_URL %> 前缀:

<link rel="icon" href="<%= BASE_URL %>favicon.ico">

在模板中,您需要首先将基本 URL 传递给您的组件:

data () {
  return {
    publicPath: process.env.BASE_URL
  }
}

那么:

<img :src="`${publicPath}${geturl}.jpg`">

答案 2 :(得分:0)

图片应该放在public/images(需要创建图片)目录下,因为webpack不会编译。 vue2 放在 static/images 目录下。如果你不想这样做,那么你需要导入图片,因为这样你就可以在 webpack 编译后得到正确的图片路径。

示例:

...
  data: {imgs: [require('../assets/images/1.png'),require('../assets/images/1.png')]}
...