vue中动态引入本地静态资源(URL)

一、webpack

require

webpack或者vue-cli构建的vue程序,可以使用require解决:

ruby 复制代码
// 假设图片在/assets/images下
<img :src="require(`@/assets/images/${xxx}.png`)">

require仅支持在webpack环境中使用,vite中无法支持

二、vite

vite 官方默认的配置,如果资源文件在assets文件夹打包后会把图片名加上hash值,但是直接通过 :src="imgSrc"方式引入并不会在打包的时候解析,导致开发环境可以正常引入,打包后却不能显示的问题.可以将资源放在public目录下,打包时会被完整的复制到目标目录的根目录下:

目录默认是/public,但是可以通过publickDir选项来配置

arduino 复制代码
请注意:
    1.引入public中的资源应该永远使用跟绝对路径,例如'public/icon.png'应在源码中引用为'/icon.png'
    2.public中的资源不应被js文件引用

第一种方式(适用于处理单个链接的资源文件)

javascript 复制代码
import homeIcon from '@/assets/mdcImgs/home/home_icon.png' 

<img :src="homeIcon" />

第二种方式(适用于处理多个链接的资源文件)

推荐,这种方式传入的变量可以动态传入文件路径!!

静态资源处理 | Vite 官方中文文档

(1) new URL(url, import.meta.url)

./src为例

arduino 复制代码
const url = new URL('./src', import.meta.url)
console.log('url', url)

这里面的href值即为当前图片地址
但官网也明确指明:

在生产构建时,Vite 才会进行必要的转换保证 URL 在打包和资源哈希后仍指向正确的地址。然而,这个 URL 字符串必须是静态的,这样才好分析。否则代码将被原样保留、因而在 build.target 不支持 import.meta.url 时会导致运行时错误。

arduino 复制代码
// Vite 不会转换这个
const imgUrl = new URL(imagePath, import.meta.url).href

即打包构建时,图片并不会如期进行打包,从而在加载时无法显示,出现 404 问题

也就是说,构建时还必须要保证是静态字符串

(2) import.meta.glob

./src/assets/images/*为例

arduino 复制代码
const modules = import.meta.glob('../../assets/images/*.png')
console.log('modules', modules)

可以看出所有模块都是异步模块,如果有同步加载的需求,可以显式指定第二个参数:

arduino 复制代码
const modules = import.meta.glob('../../assets/images/*.png',{ eager: true })

于此,可以通过封装来处理所有图片加载问题:

typescript 复制代码
const getImageUrl = (name: string) => {
    const modules = import.meta.glob('../../assets/images/*.png', { eager: true })
    const src = `../../assets/images/${name}.png`
    return (modules[src] as { default: string }).default
}

需要注意的是, src =../../assets/images/ n a m e . p n g ' 中是不支持路劲别名即 ' s r c = ' @ / a s s e t s / i m a g e s / {name}.png`中是不支持路劲别名即`src = `@/assets/images/ name.png'中是不支持路劲别名即'src= '@/assets/images/{name}.png的,必须为绝对路径或者相对路径 import.meta.glob`也支持多个匹配模式化:

arduino 复制代码
const modules = import.meta.glob(['./dir/*.js', './another/*.js'])
补充:如果是背景图片引入的方式(一定要使用相对路径,不然,开发环境正常,生产环境路径错误)
css 复制代码
.imgText {
  background-image: url('../../assets/images/1462466500644.jpg');
}
相关推荐
NiceCloud喜云1 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
wordbaby1 小时前
React Native + RNOH:跨页面数据回传的最佳实践与避坑指南
前端·react native
丷丩1 小时前
MapLibre GL JS第22课:查看本地GeoJSON
前端·javascript·map·mapbox·maplibre gl js
Front思2 小时前
AI前端工程师需要具备能力+
前端·人工智能·ai
ZC跨境爬虫4 小时前
跟着 MDN 学CSS day_29:(掌握文本与字体样式的核心艺术)
前端·css·ui·html·tensorflow
李子琪。5 小时前
网络空间安全深度实战:CSRF 漏洞原理剖析与基于 Token 的纵深防御体系构建(全栈实验报告)
前端·安全·csrf
冰暮流星5 小时前
javascript之history对象介绍
前端·笔记
IT_陈寒6 小时前
Vite热更新失灵?你可能漏了这个配置
前端·人工智能·后端
丷丩6 小时前
MapLibre GL JS第19课:实时更新要素
前端·javascript·gis·map·mapbox·maplibre gl js
Mr.Daozhi6 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具