前端静态资源的动态访问

静态资源打包规则

Vite脚手架在打包代码的时候,会把源代码里对于静态资源的访问路径转换为打包后静态资源文件的路径。主要的区别是文件指纹,即打包后的文件会带上一个hash值,用于区分不同版本的文件。

文件指纹的作用
当前端项目更新之后,重新打包、部署,由于文件指纹的存在,客户端检测到文件名不同,则会下载新版的文件。如果没有文件指纹,且新旧版文件名一致,客户端会读缓存,而不能及时地拿到新版文件。

动态访问静态资源
动态访问静态资源通常导致读取不到文件,因为源代码中使用的路径是src,而打包之后静态资源带上了文件指纹,代码中的路径却没有随之改变。

如下情景属于对静态资源的动态访问,也就是说使用了插值语法,而变量值只有在代码执行中才被确定。

  1. css中的background-image: url();使用v-bind动态地绑定一张图片的路径;
  2. template中节点的style,在background-image:url();使用插值语法;
  3. img节点的src属性使用动态绑定传递图片路径。

 解决方案

一.直接导入

将所有可能用到的图片都直接导入,使用即可。

import img2 from '@/src/images/2.jpg';
二.将静态资存放在public目录中

存储在public目录的静态资源文件会原封不动地被打包到dist文件夹中,不用担心文件名发生变化,在源代码中直接使用绝对路径访问静态资源即可

三.动态导入 
const path = ref('')
const handleChange = (val) => {  
  import(`./assets/${val}.jpg`).then(res=>{
    path.value = res.default
  })
}

//使用async await
 const res = await import(`./assets/${val}.jpg`);
 console.log(res);
 四.URL构造函数

使用计算属性computed实现

const url = computed(()=>{
    const obj = new URL(`./assets/${imgName.value}.jpg`, import.meta.url);
    
    return obj.pathname;
});


<div :style="{backgroundImage: url(url)}"></div>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值