You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuetify中v-img用require加载缺失资源导致应用崩溃怎么解决?

问题根本原因

require是webpack/vite等打包工具的编译期静态语法,不是运行时API。如果传入的路径不存在,打包阶段就会直接抛出错误终止编译,根本不会进入代码运行阶段。你之前尝试的或运算符、try-catch、placeholder插槽都是运行时逻辑,自然无法触发。

可行解决方案

方案1:使用public目录静态资源(最简便)

把所有图片资源放到项目根目录的public文件夹下,不需要用require包裹路径,直接写字符串路径即可。打包工具不会处理public下的资源,资源不存在只会触发运行时加载错误,不会导致编译崩溃,配合v-img的error插槽就能实现兜底。

<!-- 图片存放在 public/some-folder/my-img.png -->
<v-img src="/some-folder/my-img.png">
  <template v-slot:placeholder>
    <!-- 加载中占位组件 -->
  </template>
  <template v-slot:error>
    <!-- 加载失败兜底组件 -->
  </template>
</v-img>

如果不需要对图片做编译期压缩、hash重命名等处理,优先选择该方案。

方案2:预生成静态资源映射表

如果图片必须放在src目录下走打包编译逻辑,提前把所有可能用到的图片导入生成固定映射表,运行时根据key取值,不存在就返回兜底图。

// 提前导入所有需要用到的图片
const imageMap = {
  'my-img.png': require('@/some-folder/my-img.png'),
  'img-2.png': require('@/some-folder/img-2.png'),
  // 兜底默认图
  'default': require('@/assets/default-img.png')
}

export default {
  methods: {
    getImage(imgName) {
      return imageMap[imgName] || imageMap.default
    }
  }
}
<v-img :src="getImage('my-img.png')" />

所有require路径都是编译期固定的,不会出现路径找不到的编译错误。

方案3:批量导入生成映射表

如果图片数量较多手动写映射麻烦,可以用require.context批量导入自动生成映射表:

// 批量读取@/some-folder下所有png文件生成映射
const imageContext = require.context('@/some-folder/', false, /\.png$/)
const imageMap = {}
imageContext.keys().forEach(key => {
  const fileName = key.replace('./', '')
  imageMap[fileName] = imageContext(key)
})
const defaultImg = require('@/assets/default-img.png')

export default {
  methods: {
    getImage(imgName) {
      return imageMap[imgName] || defaultImg
    }
  }
}

内容的提问来源于stack exchange,提问作者passionateLearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:45:05