Vue-3 中动态导入图像

Nim*_*ker 2 javascript webpack vue.js vue-cli vuejs3

我正在尝试显示动态导入的图像,但它无法处理错误

“找不到模块”

这是我的组件

<template>
      <div class="footer">
        <div v-for="footerItem in getters" :key="footerItem.id">
          <img :src="methods.requireImage(footerItem.icon)" alt="">
        </div>
      </div>
    </template>

<script lang="ts">
import { defineComponent } from 'vue'
import { useStore } from '@/store'
import { requireImage } from '@/modules/images'

export default defineComponent({
  name: 'Footer',
  setup () {
    const store = useStore()
    const methods = {
      requireImage
    }

    return {
      getters: store.getters.getFooterItems,
      methods
    }
  }
})
</script>
Run Code Online (Sandbox Code Playgroud)

这是模块

export const requireImage = async (link: string) => {
  // return require(link)
  const image = await import(link)
  return image
  // const images = require.context('../assets', false)
  // return images('color-circle.svg')
}
Run Code Online (Sandbox Code Playgroud)

注释掉的代码不起作用

Dan*_*Dan 5

如果您将完整路径传递给require变量,Webpack 将无法加载图像。这大致是因为它是一个构建时工具,并且路径是在运行时创建的。如果您至少对部分路径进行硬编码,那就足够了:

export const requireImage = link => {
  return require(`@/assets/${link}`);
}
Run Code Online (Sandbox Code Playgroud)

注意:删除不必要的async,否则返回值将是一个承诺

您的变量footerItem.icon应该只包含文件名color-circle.svg,因为某些路径在对require. 完成后,您可以根据需要使用模板中的方法:

<img :src="methods.requireImage(footerItem.icon)" alt="">
Run Code Online (Sandbox Code Playgroud)

请注意,目前您的包装方法是不必要的,因为您可以从以下位置获得相同的结果:

<img :src="require(`@/assets/${footerItem.icon}`)">
Run Code Online (Sandbox Code Playgroud)