Vue3在img标签中绑定数据模型中的url图片无法显示问题

背景介绍

html 复制代码
<script setup>
const teachers = [
  {
    name: '马云 Jack Ma',
    company: '阿里巴巴 alibaba.com',
    description: '马云,男,汉族,中共党员,1964年9月10日生于浙江省杭州市,祖籍浙江省嵊州市谷来镇。',
    imageUrl: '@/assets/teacher/1.jpg'
  },
  {
    name: '马化腾 Pony',
    company: '腾讯 tencent.com',
    description: '马化腾,汉族,1971年10月29日生于广东省东方县八所港,广东省汕头市潮南区人。',
    imageUrl: '@/assets/teacher/2.jpg'
  },
  {
    name: '刘强东 Richard Liu',
    company: '京东 jd.com',
    description: '刘强东,男,汉族,1973年3月10日生(另一说法:1974年2月14日),江苏宿迁人,祖籍湖南湘潭。',
    imageUrl: '@/assets/teacher/3.jpg'
  }
];
</script>

<template>
   <div class="body">
    <div class="card" v-for="(teacher, index) in teachers" :key="index">
      <div class="photo">
        <img :src="teacher.imageUrl" alt="Teacher Photo">
      </div>
      <h1>{
  
  { teacher.name }}</h1>
      <h2>{
  
  { teacher.company }}</h2>
      <p>{
  
  { teacher.description }}</p>
      <a href="#">了解更多</a>
    </div>
  </div>

</template>

这是一个用于任务介绍的卡片效果,先用 静态资源进行测试,但是图片无法显示,目前的效果如下:

图片无法正常显示,经查阅资料得知在现代前端开发中,特别是使用 Vue.js 或其他基于模块化的框架时,路径需要通过import或new URL()等方式解析,以确保在不同环境下的兼容性。

为什么imageUrl: '@/assets/teacher/1.jpg'图片不生效?

这种写法直接使用了相对路径或别名路径(@ 通常在 Vue 项目中是 src 目录的别名),但在某些情况下可能无法正确解析,原因如下:

(1) 静态资源的处理方式

在开发环境中,Webpack 或其他构建工具会处理静态资源文件。例如,@/assets/teacher/2.jpg 会被解析为 src/assets/teacher/2.jpg,但在生产环境中,这些资源文件可能会被重新打包和命名(例如,添加哈希值以避免缓存问题),导致路径发生变化。

(2) 模块解析问题

如果你在代码中直接使用 @/assets/teacher/2.jpg,Webpack 可能会将其视为模块路径,而不是静态资源路径。如果该路径没有正确配置为静态资源路径,Webpack 可能无法正确解析。

(3) 运行时路径问题

在某些运行时环境中,直接使用相对路径可能无法正确解析到资源文件,尤其是当页面路径较深或使用了动态路由时。

imageUrl: new URL('@/assets/teacher/3.jpg', import.meta.url).href 的优势

这种写法通过 new URLimport.meta.url 动态解析路径,确保路径的正确性:

(1) 动态解析路径

import.meta.url 提供了当前模块的完整 URL,new URL 可以基于这个 URL 和相对路径动态解析出正确的资源路径。这种方式可以避免路径解析错误,尤其是在动态路由或嵌套路由中。

(2) 兼容性

在某些情况下,直接使用相对路径可能会因浏览器或运行环境的差异而失败,而 new URL 的方式更加通用和可靠。

(3) 生产环境优化

在生产环境中,静态资源可能会被重新打包和命名,使用 new URL 可以确保路径始终正确,即使资源路径发生变化。

正确写法

html 复制代码
<script setup>
const teachers = [
  {
    name: '马云 Jack Ma',
    company: '阿里巴巴 alibaba.com',
    description: '马云,男,汉族,中共党员,1964年9月10日生于浙江省杭州市,祖籍浙江省嵊州市谷来镇。',
    imageUrl: new URL('@/assets/teacher/1.jpg', import.meta.url).href
  },
  {
    name: '马化腾 Pony',
    company: '腾讯 tencent.com',
    description: '马化腾,汉族,1971年10月29日生于广东省东方县八所港,广东省汕头市潮南区人。',
    imageUrl: new URL('@/assets/teacher/2.jpg', import.meta.url).href
  },
  {
    name: '刘强东 Richard Liu',
    company: '京东 jd.com',
    description: '刘强东,男,汉族,1973年3月10日生(另一说法:1974年2月14日),江苏宿迁人,祖籍湖南湘潭。',
    imageUrl: new URL('@/assets/teacher/3.jpg', import.meta.url).href
  }
];
</script>

图片正常显示

相关推荐
徐小夕1 小时前
JitWord Office预览引擎:如何用Vue3+Node.js打造丝滑的PDF/Excel/PPT嵌入方案
前端·vue.js·github
晴殇i1 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
孟陬2 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
BER_c2 小时前
前端权限校验最佳实践:一个健壮的柯里化工具函数
前端·javascript
兆子龙2 小时前
别再用 useState / data 管 Tabs 的 activeKey 了:和 URL 绑定才香
前端·架构
sudo_jin2 小时前
前端包管理器演进史:为什么 npm 之后,Yarn 和 pnpm 成了新宠?
前端·npm
敲敲敲敲暴你脑袋2 小时前
写个添加注释的vscode插件
javascript·typescript·visual studio code
叁两3 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
golang学习记3 小时前
GitLens 十大神技:彻底改变你在 VS Code 中的 Git 工作流
前端·后端·visual studio code
SuperEugene3 小时前
后台权限与菜单渲染:基于路由和后端返回的几种实现方式
前端·javascript·vue.js