Vue 图片引用方式详解:静态资源与动态路径访问

ops/2025/2/6 11:28:03/

目录

  • 前言
  • 1. 引用 public/ 目录
  • 2. assets/ 目录
  • 3. 远程服务器
  • 4. Vue Router 动态访问
  • 5. 总结
  • 6. 扩展(图片不显示)

前言

🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF

在 Vue 开发中,图片的引用方式主要取决于图片存放的位置,常见的存放方式包括:

  1. 存放在 public/ 目录
  2. 存放在 assets/ 目录
  3. 存放在远程服务器
  4. 动态拼接图片路径

本文将详细分析这些方式的区别,并提供完整的代码示例和注释

public__19">1. 引用 public/ 目录

public/ 目录下的文件会被 Vue 直接映射到项目的根路径 /,无需 Webpack 处理,适用于:

  1. 不会被打包处理的静态资源
  2. 图片 URL 确定,不依赖 Webpack 解析

✅ 正确写法

<template><div><!-- 直接从 public 目录访问图片 --><img src="/manufacturing.png" alt="Manufacturing Image" /></div>
</template>

❌ 错误写法

<template><div><!-- public 目录不需要 public/ 前缀 --><img src="/public/manufacturing.png" alt="Error Image" /></div>
</template>

说明: public/ 目录的内容会被 Vue 直接映射到根路径 /,所以访问 /public/xxx.png 是错误的

截图如下:

在这里插入图片描述

2. assets/ 目录

适用场景
assets/ 目录下的图片会被 Vue 通过 Webpack 进行打包,适用于:

  1. 存放在 src/assets/ 目录
  2. 需要 Webpack 处理,如哈希命名
  3. 图片路径动态变化

✅ 使用 import 方式

<script setup>
import imageUrl from '@/assets/images/manufacturing.png'
</script><template><div><img :src="imageUrl" alt="Manufacturing Image" /></div>
</template>

说明:
import 方式会将图片路径解析为 Webpack 处理的 URL
适用于静态导入,但不适用于动态路径拼接

✅ 使用 new URL() 方式

<script setup>
const imageSrc = new URL('@/assets/images/manufacturing.png', import.meta.url).href
</script><template><div><img :src="imageSrc" alt="Manufacturing Image" /></div>
</template>

说明:
new URL() 适用于 assets 目录,支持动态路径处理

3. 远程服务器

适用场景

  1. 图片存放在 CDN 或外部服务器
  2. 不需要 Webpack 处理
<template><div><img src="https://example.com/images/manufacturing.png" alt="Remote Image" /></div>
</template>

说明:
直接使用绝对 URL 访问远程图片,无需 Vue 处理

4. Vue Router 动态访问

图片名称与路由路径相关联,可以使用 computed 计算属性自动生成图片路径

<template><div><img :src="imageSrc" alt="Dynamic Page Image" /></div>
</template><script setup>
import { useRoute } from 'vue-router'
import { computed } from 'vue'const route = useRoute()// 计算 public 目录下的图片路径
const imageSrc = computed(() => {const sanitizedPath = route.path.replace(/^\//, '') // 移除开头的 `/`return `/${sanitizedPath}.png` // 访问 public 目录
})
</script>

假设 public 目录结构如下:

public/
├── home.png
├── about.png
├── contact.png

访问 /home 时,图片路径为:

<img src="/home.png" />

动态路由的方式有所差异:

<template><div><img :src="imageSrc" alt="Dynamic Page Image" /></div>
</template><script setup>
import { useRoute } from 'vue-router'
import { computed } from 'vue'const route = useRoute()// 计算 public 目录下的图片路径
const imageSrc = computed(() => {const sanitizedPath = route.path.replace(/^\//, '') // 移除开头的 `/`const lastSegment = sanitizedPath.split('/').pop() // 获取最后的路径部分return `/${lastSegment}.png` // 访问 public 目录
})
</script>

截图如下:

在这里插入图片描述

5. 总结

总的来说:

存放位置适用场景访问方式代码示例
public/直接访问,无需 Webpack 处理/filename.png<img src="/manufacturing.png" />
assets/需要 Webpack 处理import 或 new URL()import img from '@/assets/image.png'
远程服务器图片在外部服务器/CDN绝对 URL<img src="https://example.com/image.png" />
动态路由根据 Vue Router动态生成图片路径computed 计算属性 :src=“computedPath”

最佳实践:

  1. public/ 目录适用于静态资源,直接使用 /filename.png 访问
  2. assets/ 目录适用于 Webpack 处理,使用 import 或 new URL()
  3. 外部图片直接使用绝对 URL
  4. 动态图片路径可结合 Vue Router 计算生成

6. 扩展(图片不显示)

图片无法显示通常是路径错误、资源未正确加载或 Webpack/Vite 处理导致的问题

图片不显示的常见原因
在 Vue 3 + Vite(或 Webpack)项目中,图片可能无法显示的常见原因包括:

  1. 路径错误:引用 public/ 目录时仍加 public/ 前缀
  2. 资源未正确加载:如 src/assets/ 目录下的图片未被 Webpack 处理
  3. 动态路径问题:使用 computed 计算属性拼接路径时错误
  4. Webpack 处理方式:assets/ 目录下的图片会被 Webpack 处理,不能直接访问
  5. 图片格式或大小问题:浏览器不支持的图片格式或图片损坏

路径错误这个要点此处着重分析下
详细分析下为何要放在public等路径下!

public/ 目录的映射机制
在 Vue 项目结构中:

my-project/
├── public/
│   ├── manufacturing.png
│   ├── images/
│   │   ├── factory.png
├── src/
│   ├── views/
│   │   ├── Industry.vue
│   ├── assets/
│   │   ├── example.png
│   ├── App.vue

public/manufacturing.png 在构建后会被 Vue 直接映射到:/manufacturing.png
public/images/factory.png 在构建后会变成:/images/factory.png
src/assets/example.png 则会被 Webpack 处理,并生成动态路径(如 /assets/example.abcdef.png)

如何证明 public/ 目录直接映射到根路径 /?
可以打开 http://localhost:5173/manufacturing.png,如果 manufacturing.png 直接显示,则说明它已经被映射到根目录 /,而不需要 /public/manufacturing.png

对比 public/ 和 src/assets/

存放目录是否被 Webpack 处理访问方式适用场景
public//filename.png
src/assets/import 或 new URL()

✅ 使用 public/ 目录

<template><div><img src="/manufacturing.png" alt="Manufacturing Image" /></div>
</template>

✅ 使用 src/assets/ 目录

<script setup>
import imgUrl from '@/assets/example.png'
</script><template><div><img :src="imgUrl" alt="Example Image" /></div>
</template>

http://www.ppmy.cn/ops/156139.html

相关文章

后端【代码审查】C语言。

在后端开发中&#xff0c;你是如何进行代码审查的&#xff1f; 在后端开发中&#xff0c;进行代码审查是一项非常重要的质量保证活动。它不仅有助于发现潜在的问题和错误&#xff0c;还能促进团队成员之间的知识共享和技术水平提升。以下是我在进行代码审查时遵循的一些步骤和最…

4 前端前置技术(上):AJAX技术、Axios技术(前端发送请求)

文章目录 前言一、Ajax技术&#xff08;从服务端获取数据&#xff0c;发送各种请求&#xff09;0 接口文档管理&#xff1a;使用apipost等接口测试软件创建接口便于前端后端分离测试1 基本概念2 原生Ajax使用示例&#xff08;几年前的早期用法&#xff09; 二、 Axios技术(对原…

Matplotlib 高级图表绘制与交互式可视化(mpld3)

我们先重新回忆一下它的主要作用: 一、Matplotlib 简介 Matplotlib 是 Python 中一个非常强大的可视化库,广泛用于数据可视化、科学计算和工程领域。它提供了丰富的绘图功能,可以生成各种静态、动态和交互式的图表。以下是 Matplotlib 的主要功能及其详细讲解。 二、基本…

(十一)机器人系统的仿真——建造机器人模型

前言 对于ROS新手而言&#xff0c;可能会有疑问:学习机器人操作系统&#xff0c;实体机器人是必须的吗&#xff1f;答案是否定的&#xff0c;机器人一般价格不菲&#xff0c;为了降低机器人学习、调试成本&#xff0c;在ROS中提供了系统的机器人仿真实现&#xff0c;通过仿真&…

Leetcode::922. 按奇偶排序数组 II

给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返回 任何满足上述条件的…

电商用户画像数据可视化分析

电商用户画像数据可视化分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&am…

【漫话机器学习系列】077.范数惩罚是如何起作用的(How Norm Penalties Work)

范数惩罚的作用与原理 范数惩罚&#xff08;Norm Penalty&#xff09; 是一种常用于机器学习模型中的正则化技术&#xff0c;它的主要目的是控制模型复杂度&#xff0c;防止过拟合。通过对模型的参数进行惩罚&#xff08;即在损失函数中加入惩罚项&#xff09;&#xff0c;使得…

git 指定ssh key

在git clone操作中指定SSH密钥&#xff0c;可以通过以下几种方法实现&#xff1a; 1 使用–config选项在克隆时指定密钥 当你克隆一个git仓库时&#xff0c;可以直接在命令中指定要使用的ssh密钥。这种方法适用于一次性操作&#xff0c;不需要修改全局或仓库级别的配置 git …