前言
我现在遇到了一个问题,就是在Vue里面动态渲染图片的src属性的时候,如果直接传递一个字符串路径的话,图片加载不出来,但是如果先用import引入那个路径,再把引入的变量传给src,就能正常显示。为什么会这样呢?
这是我的img标签,imgPath.background就是我传递给img的值
这是图片路径
我的出错方案是将'@/assets/inquiry/portalPharmacist/finger.png'直接赋值给了img标签,这导致了失败
那么改如何解决呢?
解决方案
解决方案
- 通过import引入的finger赋值给imgPath.background,然后img就可以正常显示了
- 静态资源放在
public
目录,然后直接使用绝对路径,此时路径不会经过Webpack处理,直接指向public
目录。
有些小伙伴会好奇,这是为什么?明明我已经给路径交给了src,可是为什么就是不显示
那么我们就来彻底搞懂他!
原因
了解问题的原理,我们要从一下原理开始
构建工具的资源处理机制
-
Webpack/Vite的静态分析:打包工具(如Webpack或Vite)在构建阶段会扫描代码中的静态资源引用(如
import
或require
)。这些引用会被处理成最终部署路径(如添加哈希、压缩文件名等)。 -
动态绑定的字符串路径:如果路径是通过字符串动态绑定的(如
:src="imgPath"
,且imgPath
是一个字符串),打包工具无法在构建阶段确定该路径对应的具体文件,因此不会处理这些资源,导致路径未被替换为正确的输出路径。
所以就会导致,如果你打开F12查看img的src时就会发现,它的src是’@/assets/inquiry/portalPharmacist/finger.png‘,这就意味着,打包工具并没有将你的路径识别为一个资源引用,而是将其当作字符串直接显示。
静态路径与动态路径的区别
可能还有小伙伴好奇,为什么我直接方在src里面的静态路径就可以正常显示呢?
这是因为:
Vue模板编译器会自动将静态路径转换,触发打包工具处理,生成正确的资源路径。
而这里传的 imgPath.background ,是一个字符串,打包工具无法识别是资源引用,就无法触发打包工具的处理啦!
总结
通过import
或require
引入路径时,打包工具会处理资源并返回最终路径;直接使用动态字符串路径时,打包工具无法识别资源,导致路径未处理。理解构建工具的资源处理机制,选择显式引入或使用public
目录,可解决动态图片加载问题。
如有遗漏,欢迎各位小伙伴评论区补充