vite+vue3打包后图片不显示,封装图片引入方式

在webpack工程,可以直接使用require引入图片,但是vite是无法直接使用require的,webpack能支持require是因为对它进行了处理。我们可以使用import,不过如果图片过多,对比require方式则略为繁琐和不便。

以下这种方式是常见的引入图片方式。但是如果图片多,就显得代码重复。且既代码也必须置于js开始处,无法传参,灵活性不够。

import tabBarIcon1 from '@/assets/images/icon/icon-calendar.svg'
import tabBarActiveIcon1 from '@/assets/images/icon/icon-calendar-active.svg'
import tabBarIcon2 from '@/assets/images/icon/icon-pending.svg'
import tabBarActiveIcon2 from '@/assets/images/icon/icon-pending-active.svg'
import tabBarIcon3 from '@/assets/images/icon/icon-column.svg'
import tabBarActiveIcon3 from '@/assets/images/icon/icon-column-active.svg'

有没有更好的方案引入图片呢?不妨试试new URL()。使用方式可参考vite官方文档-静态资源处理

下面介绍结合new URL()使用函数封装引入、样式背景引入。

项目架构

|-- public                          静态资源文件夹,不经过vite处理
|    |-- images                     图片资源
|       |-- icon                    图标
|         |-- icon-offline.svg      离线图标
|-- src                             源代码
|    |-- api                        后端api存放目录
|    |-- assets                     静态资源目录,会被打包处理
|       |-- images                  图片资源
|         |-- card-bg.svg           卡片背景图
|    |-- components                 组件目录
|    |-- ...                        其他
|-- package.json                    项目依赖描述文件
|-- vite.config                     项目配置文件
|-- ...                             其他

图片引入演示demo

<template>
  <h1 align="center">图片引入演示</h1>
  <!-- 公共方法获取public图片 -->
  <img height="100" :src="getPublicAssetsFile('icon/icon-offline.svg')" alt="" srcset="" />
  <!-- 公共方法获取图片 -->
  <img height="100" :src="getAssetsFile('card-bg.svg')" alt="" srcset="" />
  <!-- 背景图片 -->
  <div class="icon-offline">icon-offline</div>
  <div class="card-bg">card-bg</div>
</template>

<script setup lang="ts">
const PROJECT_DIR = '/mobile' // 这里需要根据项目配置修改,如部署在服务区根目录则不需要配置

/**
 * 获取公共资源文件路径
 * @param imgName 图片名称
 * @returns 返回图片文件的URL路径
 */
function getPublicAssetsFile(imgName: string): string {
  return new URL(PROJECT_DIR + '/images/' + imgName, import.meta.url).href
}
/**
 * 获取资源文件路径
 * @param imgName 图片名称
 * @returns 资源文件路径
 */
function getAssetsFile(imgName: string): string {
  return new URL('@/assets/images/' + imgName, import.meta.url).href
}
</script>

<style lang="less" scoped>
.icon-offline {
  height: 100px;
  background: url('/images/icon/icon-offline.svg');
}
.card-bg {
  height: 100px;
  background: url('@/assets/images/card-bg.svg');
}
</style>

错误示例

<template>
  <div class="card-bg">card-bg</div>
</template>

<style lang="less" scoped>
.card-bg {
  height: 100px;
  background: url('src/assets/images/card-bg.svg'); // 背景图片在开发运行时可以显示,打包后没有src目录,将无法显示
}
</style>

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注