当前位置: 首页 > news >正文

vite静态资源处理,处理vite项目中src和url路径问题

将资源引入为 URL

服务时引入一个静态资源会返回解析后的公共路径:

// imgUrl的绝对路径为/img.png
import imgUrl from './img.png'
document.getElementById('hero-img').src = imgUrl

例如,imgUrl 在开发时会是 /img.png,在生产构建后会是 /assets/img.2d8efhg.png

行为类似于 Webpack 的 file-loader。区别在于导入既可以使用绝对公共路径(基于开发期间的项目根路径),也可以使用相对路径。

  • url() 在 CSS 中的引用也以同样的方式处理。
  • 如果 Vite 使用了 Vue 插件,Vue SFC 模板中的资源引用都将自动转换为导入。

new URL(url, import.meta.url)

import.meta.url 是一个 ESM 的原生功能,会暴露当前模块的 URL。将它与原生的 URL 构造器 组合使用,在一个 JavaScript 模块中,通过相对路径我们就能得到一个被完整解析的静态资源 URL:

const imgUrl = new URL('./img.png', import.meta.url).hrefdocument.getElementById('hero-img').src = imgUrl

这在现代浏览器中能够原生使用 - 实际上,Vite 并不需要在开发阶段处理这些代码!

在生产构建时,Vite 才会进行必要的转换保证 URL 在打包和资源哈希后仍指向正确的地址。

实例

1.引入图片

开发环境

import myImg from '../assets/img/login-bg.jpg';
console.log(myImg); // /src/assets/img/login-bg.jpgconst imgUrl = new URL('../assets/img/login-bg.jpg', import.meta.url).href;
console.log(imgUrl); // http://localhost:8087/src/assets/img/login-bg.jpg'

生产环境

import myImg from '../assets/img/login-bg.jpg';
console.log(myImg); // /assets/login-bg-OCgX7bcw.jpgconst imgUrl = new URL('../assets/img/login-bg.jpg', import.meta.url).href;
console.log(imgUrl); // http://localhost:8080/assets/login-bg-OCgX7bcw.jpg'

开发环境和生产环境下图片均为公共路径。

2.为img元素添加src

vue模板中:

<img ref="myImg" src="../assets/img/login-bg.jpg"> // 相对路径
<img ref="myImg" src="/src/assets/img/login-bg.jpg"> // 绝对路径
<img ref="myImg" :src="myImg"> // 公共路径
<img ref="myImg" :src="imgUrl"> // 公共路径

以上四种方式在开发和生产环境下都可以正常工作,因为Vue SFC 模板中的资源引用都将自动转换为导入,所以最终用的是解析后的公共路径。

非vue模板中:

myImg.value.src = '../assets/img/login-bg.jpg';  // dev和product都不可以
myImg.value.src = '/src/assets/img/login-bg.jpg'; // dev下可以,product下不可以
myImg.value.src = myImg; // 可以
myImg.value.src = imgUrl; // 可以

这种写法不会触发解析。

第一种使用相对路径即使在dev环境下也不行。

第二种在product环境下因为打包后dist目录不同于开发环境目录,所以不行。

只有第三种和第四种方式在开发和生产环境下才能正常工作。

3.在css中使用url

css中

.login-footer{background-image: url(../assets/img/login-bg.jpg);background-image: url(/src/assets/img/login-bg.jpg);
}

两种方式在开发和生产环境下都可以正常工作,因为url()在 CSS 中的引用也以同样的方式处理,所以最终用的是解析后的公共路径。

vue模板中通过v-bind:style绑定css

<div class="login-footer" style="width: 50px; height: 50px;":style="`background-image: url(../assets/img/login-bg.jpg)`"   // dev和product都不可以:style="`background-image: url(/src/assets/img/login-bg.jpg)`" // dev下可以,product下不可以:style="`background-image: url(${myImg})`"  // 可以:style="`background-image: url(${imgUrl})`" // 可以
></div>

这种写法不会触发解析,所以结果跟上面非vue模板中为img元素添加src情况一致。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • DedeCMS-V5.7.82-UTF8织梦
  • 复现一下最近学习的漏洞(sqlab 1-10)
  • 速盾:爬虫攻击和cc攻击的区别是什么?
  • Git在日常项目中的实用技巧
  • 汉诺塔(C++)
  • 2024华数杯数学建模A题完整论文讲解(含每一问python代码+结果+可视化图)
  • 总线学习4--UART
  • pom.xml和.m2的setting的区别?
  • 【秋招笔试】24-07-27-OPPO-秋招笔试题(后端卷)
  • ES相关介绍与扫盲
  • 【C语言】C语言期末突击/考研--详解一维数组与字符数组
  • 罗杰斯的逆势投资:破而后立
  • 如何选择合适的气膜生产厂家—轻空间
  • 动态规划.
  • (四)软件性能测试
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • JavaScript服务器推送技术之 WebSocket
  • k个最大的数及变种小结
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux gpio口使用方法
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • WebSocket使用
  • 百度小程序遇到的问题
  • 简单基于spring的redis配置(单机和集群模式)
  • 异步
  • MyCAT水平分库
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​queue --- 一个同步的队列类​
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​决定德拉瓦州地区版图的关键历史事件
  • $.ajax,axios,fetch三种ajax请求的区别
  • (0)Nginx 功能特性
  • (160)时序收敛--->(10)时序收敛十
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (NSDate) 时间 (time )比较
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (二)pulsar安装在独立的docker中,python测试
  • (二)测试工具
  • (二十四)Flask之flask-session组件
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (十二)Flink Table API
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • **PHP分步表单提交思路(分页表单提交)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net8.0与halcon编程环境构建
  • @ConfigurationProperties注解对数据的自动封装
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [ACTF2020 新生赛]Include