Vite 不支持 require?五种高效替代方案带你玩转 Vue 3 图片导入

55 阅读3分钟

在 Vue 3 项目中,当使用 Vite 作为构建工具时,由于 Vite 不支持 require 语法,以下是几种替代方法实现图片导入:


1. 使用 <img> 标签的静态路径

适用场景:直接引用静态图片路径(无需动态处理)。

方法

  • public 目录引入

    • 将图片放在 public 目录下,使用绝对路径(以 / 开头):
      <template>
        <img src="/images/logo.png" alt="Logo" />
      </template>
      
    • 注意public 目录中的文件不会被构建工具处理,直接复制到输出目录,路径始终为 / 开头。
  • src/assets 引入

    • 使用路径别名 @/(需配置 vite.config.js 中的 resolve.alias):
      <template>
        <img src="@/assets/logo.png" alt="Logo" />
      </template>
      
    • 注意:Vite 默认支持 @ 别名指向 src 目录,无需额外配置。

2. 使用 import 语句引入

适用场景:需要将图片作为模块导入(例如动态绑定或 TypeScript 类型检查)。

方法

<script setup>
import logo from '@/assets/logo.png';
</script>

<template>
  <img :src="logo" alt="Logo" />
</template>
  • 批量导入:使用 import.meta.glob 动态导入多个图片:
    <script setup>
    const images = import.meta.glob('@/assets/images/*.png');
    const imageList = Object.values(images).map((img) => img());
    </script>
    
    • import.meta.glob 返回一个对象,键是路径,值是动态导入函数,需通过 .map 转换为 Promise 数组。

3. 使用 new URL() 动态生成路径

适用场景:动态拼接图片路径(如根据变量生成路径)。

方法

<script setup>
import { ref } from 'vue';

const imageName = 'logo.png';
const imagePath = new URL(`@/assets/${imageName}`, import.meta.url).href;
</script>

<template>
  <img :src="imagePath" alt="Dynamic Image" />
</template>
  • 原理new URL() 可以解析模块的相对路径,确保路径在构建后正确。
  • 注意:路径需以 ./../ 开头,或使用 @/ 别名,但需通过 import.meta.url 正确解析。

4. 在 CSS 中使用 background-image

适用场景:设置背景图片。

方法

<template>
  <div class="background"></div>
</template>

<style scoped>
.background {
  width: 200px;
  height: 200px;
  background-image: url('@/assets/logo.png');
  background-size: cover;
}
</style>
  • 路径解析:CSS 中的 @/ 别名会被 Vite 正确处理,无需额外配置。

5. 相对路径直接引用

适用场景:图片与组件在同一目录或子目录。

<template>
  <img src="../assets/logo.png" alt="Relative Path" />
</template>
  • 注意:路径需相对于当前组件文件的位置,容易出错,建议使用 @/ 别名。

方法对比与选择建议

方法适用场景优点注意事项
<img> 静态路径简单静态图片引用简单直观公共目录路径需绝对,assets 需配置别名
import 模块化导入需要模块化管理图片(如 TypeScript、动态绑定)类型安全,支持构建工具优化每个图片需单独导入,不适合大量图片
import.meta.glob批量导入图片集合(如图库、动态加载)灵活批量处理需处理异步导入结果
new URL() 动态路径动态生成路径(如根据变量拼接)路径在构建后保持正确需结合 import.meta.url 使用
CSS background-image设置背景图适合背景图,支持别名路径路径需正确配置

常见问题解答

Q:为什么直接拼接 @/assets/xxx 在生产环境会失败?

  • A@ 是 Vite 的路径别名,仅在 importnew URL() 中被解析。在字符串中直接使用 @/assets/xxx 会被视为普通字符串,需通过 new URL() 转换为绝对路径。

Q:如何处理大量图片的动态导入?

  • A:使用 import.meta.glob 批量导入,结合 Promise.allasync/await 处理异步加载。

Q:public 目录和 assets 目录的区别?

  • public:文件直接复制到输出目录,路径以 / 开头,无需构建工具处理。
  • assets:文件会被构建工具处理(如压缩、哈希命名),需通过 @/assets/ 路径引用。

通过以上方法,可以灵活应对 Vue 3 + Vite 项目中图片导入的各种需求。根据具体场景选择合适的方式,确保开发效率与生产环境的兼容性。