首页 > 其他分享 >web前端之vue动态访问静态资源、静态资源的动态访问、打包、public、import、URL、Vite

web前端之vue动态访问静态资源、静态资源的动态访问、打包、public、import、URL、Vite

时间:2024-05-28 20:00:17浏览次数:19  
标签:文件 静态 路径 URL 访问 import 动态 打包

MENU


静态资源与打包规则

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


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


动态访问静态资源

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


如下情景属于对静态资源的动态访问,也就是说使用了插值语法,而变量值只有在代码执行中才被确定。
1、css中的background-image: url();使用v-bind动态地绑定一张图片的路径;
2、template中节点的style,在background-image:url();使用插值语法;
3、img节点的src属性使用动态绑定传递图片路径。


直接导入

import img1 from './assets/1.jpg';
import img2 from './assets/2.jpg';

const imgName = ref('');

function handleChange(val){
    if(val === 1) {
        imgName.value = img1;
    } else if(val === 2) {
		imgName.value = img2;
    }
}

将所有可能用到的图片都导入,并配合if语句实现动态切换。
缺点是代码臃肿,难以维护。


将静态资存放在public目录中

存储在public目录的静态资源文件会原封不动地被打包到dist文件夹中,不用担心文件名发生变化,在源代码中直接使用绝对路径访问静态资源即可:/assets/1.jpg。
缺点是失去了文件指纹带来的好处,后期如果静态资源被替换了,但是文件名没变,客户端仍读取缓存,无法及时获取最新版的静态资源。


动态导入

const imgName = ref('');
const url = ref('');

watchEffect(async () => {
    const module = await import('./assets/${imgName.value}.jpg');
    
    console.log(module);
});

Vite脚手架在静态分析代码的时候,读取到动态导入import(),且内部是模板字符串,只有一部分内容是动态的,那么Vite会自动将符合./assets/*.jpg路径格式的静态资源全部进行打包。
在打包的时候,不仅会打包所有符合情况的静态资源,还会打包出对应的.js文件。import()语句实际上是导入.js文件,而.js文件又默认导出打包后的静态资源文件路径。


asseset1
asseset2


缺点是打包结果多出许多.js文件和异步导入。


URL构造函数

使用计算属性computed和URL。

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

URL传入两个参数:文件路径和基准路径。
返回URL实例对象的pathname属性,即是打包后的文件路径。

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

原理
单文件组件在进行打包的时候,会分析内容。


img元素和url函数
1、<img>标签的src属性;
2、css的background-image属性的url()函数;
如果是静态的,则会进行路径转换。


import()和new URL()
只能是某一个部分是动态,通常是模板字符串。这种情况下会把指定文件夹下面的指定格式的文件全部打包,并进行路径转换。import()会生成额外的.js文件,new URL()不会。


结束语

以上的方法中,使用URL的方法最优。
支持动态导入;
保留文件指纹;
不会产生额外的.js文件;
同步代码。


实践与坑

待更新…


附文

待更新…

标签:文件,静态,路径,URL,访问,import,动态,打包
From: https://blog.csdn.net/weixin_51157081/article/details/119682011

相关文章

  • 利用信息量集实现互斥访问
    进程A用来生成信号集,并将其初值设为1(运行顺序为进程A->B->C)/**@Author:[email protected]*@Date:2024-05-0817:20:41*@LastEditors:[email protected]*@LastEditTime:2024-05-2818:47:38*/#include<stdio.h>#include<stdlib.h>#include<sys/......
  • 静态删除两项,双重过滤
    addToRight(){constselectList=this.$refs.tableLeft.$refs.table.getCheckboxRecords(true)if(selectList&&selectList.length>0){constunselectList=this.leftList.filter(item=>{return!selectList.some(......
  • 数据展示动态(跑分)显示
    1.页面显示(强烈推荐)<template#header><avue-data-tabs:option="dataOptions":data="tabData"style="width:75%;"></avue-data-tabs></template>2.具体代码阿和方法实现2.1官方推荐代码<template>&......
  • 日期选择器:年 月 日 动态切换显示
    1.组件样式部分(elementUI)实现<el-row><el-col:span="10"><el-button-group><el-button:class="{'is-active':selectedButton==='year'}"@click="changeToYe......
  • 解决 IIS Express 启动错误:“拒绝访问”问题
    报错StartingIISExpress...stderr:FailedtoregisterURL"http://localhost:8378/"forsite"app-3344e220-8b03-465c-8df1-3c41981352a1"application"/".Errordescription:拒绝访问。(0x80070005)Unabletostartiisexpress.拒绝......
  • Nginx(openresty) 通过lua结合Web前端 实现图片,文件,视频等静态资源 访问权限验证,进行
    1本文系统环境:安装openresty(nginx),可参考:test@ubuntuserver:~$cat/etc/os-releasePRETTY_NAME="Ubuntu24.04LTS"NAME="Ubuntu"VERSION_ID="24.04"VERSION="24.04LTS(NobleNumbat)"VERSION_CODENAME=nobleID=ubuntuID_LIK......
  • vue3 动态组件
    <template><divclass="max_box"><a-tabsv-model:activeKey="activeKey"@change="callback"><a-tab-pane:tab="item.tab"v-for="iteminstate.list":key="i......
  • 如何在本地修改Hosts文件设置域名访问?
    网站在未上线的时候,我们一般会在本地搭建Web环境并安装WordPress来设计页面、测试插件、数据备份、网站搬家。为了能够在本地通过域名访问网站,就需要在修改hosts文件来绑定域名,方法如下:windows系统修改hosts文件步骤1:打开hosts文件,路径如下所示;找到hosts文件,选择使用记事本打开......
  • Linux网站访问控制
    环境:操作系统:centos7(linux)试验系统:win7(client)目的:实现在客户机win7访问网站www.jd.com访问到的是centos的虚拟网站GW开启路由转发以及网络地址转换模式GW开启路由转发grep-v"#"/etc/sysctl.confGW开启网络地址转换模式touchstrat.sh创建strat.sh文件......
  • IP地址证如何实现HTTPS访问?(内网IP、公网IP)
    不能提供域名只能提供IP地址也可以通过部署特定的SSL证书来实现HTTPS访问,这一特定的SSL证书就是IP地址证书。市面上常见的SSL证书多为以域名申请的,以IP地址来申请的SSL证书相对较少见。下面是IP地址证书的申请方法和流程:1选择证书品牌选择能支持公网和内网IP申请SSL证......