前端性能优化-web资源加载优先级
前言
资源加载优先级是指在页面渲染的过程中,浏览器决定加载哪些资源并优先加载它们的一种机制。正确配置资源加载的优先级可以显著改善页面加载性能,确保关键资源优先加载,提高用户感知的加载速度。
Web 资源加载方式
同步加载
同步加载是指浏览器在加载 HTML 页面时,按照资源出现的顺序依次加载和解析,每个资源加载完成后才会继续加载下一个资源。
当浏览器遇到一个资源请求(如<script>
、<link>
、<img>
)时,会立即发送请求并阻塞页面渲染,直到该资源加载完成。这种方式可以确保资源按顺序执行,但也可能导致页面阻塞,特别是对于较大的资源。
异步加载
异步加载是指浏览器在遇到异步资源时,会继续渲染页面而不等待该资源的加载和执行,从而提高页面的加载性能。
通过设置 <script>
标签的 async 或 defer 属性,可以实现脚本的异步加载。异步脚本在下载过程中不会阻塞页面的渲染,但执行时可能会影响到正在进行的渲染。
预加载(Preload)
预加载是一种通过告知浏览器提前加载将来可能会用到的关键资源的机制,以便在需要时能够更快地获取这些资源。预加载通常用于加载与当前页面交互无关但在后续页面中可能会用到的资源,比如异步加载的脚本、字体、图片等
我们可以通过在页面的<head>
部分使用 <link>
元素来指定预加载资源。
<!-- 预加载样式表 -->
<link rel="preload" href="styles.css" as="style" /><!-- 预加载脚本 -->
<link rel="preload" href="script.js" as="script" /><!-- 预加载图片 -->
<link rel="preload" href="image.jpg" as="image" />
适用场景:
- 关键资源优化: 预加载适用于首屏渲染所需的关键资源,如页面的主样式表、主脚本等。通过在页面加载过程中提前加载这些关键资源,可以提高页面加载速度。
- 异步加载的资源: 适用于那些在页面加载时不会立即使用,但在稍后可能会用到的资源。例如,异步加载的脚本、字体或一些后续页面中可能用到的图片。
- 资源依赖关系: 当某个资源依赖于其他资源时,预加载可以确保这些依赖资源在需要时已经被提前加载。
- 关键用户路径优化: 针对一些特定的用户路径,预加载可以确保用户在进行特定操作时所需的资源已经就绪,提高用户体验。
预取(Prefetch)
预取(Prefetch)是一种告知浏览器在空闲时提前获取将来可能会用到的资源的机制,以便在用户导航到相关页面时能够更快地加载这些资源。预取通常用于加载与当前页面无关但在用户即将访问的下一个页面中可能会用到的资源,以提高用户在导航时的加载速度。
我们通过在页面的 部分使用 元素来指定预取资源。
<!-- 预取样式表 -->
<link rel="prefetch" href="styles.css" as="style" /><!-- 预取脚本 -->
<link rel="prefetch" href="script.js" as="script" /><!-- 预取图片 -->
<link rel="prefetch" href="image.jpg" as="image" />
适用场景:
- 下一页面的资源: 预取适用于加载用户即将访问的下一个页面所需的资源。通过在当前页面上提前获取下一个页面可能用到的资源,可以在用户导航时提高加载速度。
一个项目中的具体例子是项目课件详情页需要加载进行课件解析的内容,而且用户大概率会进入到课件解析页,这时候就可以使用预取来提前加载课件解析页的资源,以提高用户在导航时的加载速度。
- 预取用户可能浏览的内容: 预取可以用于加载用户可能浏览的内容,例如懒加载的图像、异步加载的组件等。
预渲染(Prerender)
预渲染是一种在用户尚未点击链接之前提前加载并渲染链接指向的页面的技术。它实际上是在后台构建并渲染下一个页面,以便在用户导航至该页面时可以瞬间呈现。
我们 使用<link>
元素的 rel 属性来指定预渲染。
<!-- 预渲染下一个页面 -->
<link rel="prerender" href="next-page.html" />
适用场景: 预渲染通常适用于对用户体验要求极高的场景,例如单页应用(SPA)中的某个视图或特定的 landing 页面。
Fetch Priority
Fetch Priority(获取优先级)是一种在网络请求时指定资源加载优先级的机制。它允许开发者通过设置优先级,控制浏览器在处理多个请求时哪些资源应该首先被获取和加载。 Fetch Priority 主要用于优化页面加载性能,确保关键资源能够尽快加载,提高用户体验。
在发起网络请求时,可以通过设置请求的 priority 参数来指定资源的优先级。优先级分为 “very-low”、“low”、“medium”、“high”、“very-high” 五个级别。
fetch("example.jpg", { priority: "high" }).then((response) => response.blob()).then((data) => {// 处理获取到的数据});
注意事项
-
兼容性: Fetch Priority 可能不被所有浏览器完全支持,因此在使用时需要注意浏览器的兼容性。
-
网络条件: 实际的资源加载优先级可能受到网络条件的影响,例如在弱网络环境下,即使设置了高优先级,也可能因为网络延迟而无法立即获取资源。
-
合理使用: Fetch Priority 应该根据具体的页面需求合理使用,不宜过度设置,以免产生不必要的网络负担。
总结
资源加载方式 | 适用场景 | 示例代码 |
---|---|---|
同步加载 | 关键脚本、必要资源 | <script src="main.js"></script> |
异步加载 | 非关键脚本、提高性能 | <script async src="analytics.js"></script> |
预加载 (Preload) | 关键资源、异步加载资源、资源依赖关系 | <link rel="preload" href="style.css" as="style"> |
预取 (Prefetch) | 下一个页面的资源、提前加载用户可能浏览的内容 | <link rel="prefetch" href="next-page.html"> |
预渲染 (Prerender) | 对用户体验要求极高的场景 | <link rel="prerender" href="next-page.html"> |
Fetch Priority | 精细化控制资源加载顺序、网络请求优先级 | fetch('example.jpg', { priority: 'high' }) |
本文首发于个人博客前端开发笔记,由于笔者能力有限,文章难免有疏漏之处,欢迎指正
相关文章:
前端性能优化-web资源加载优先级
前言 资源加载优先级是指在页面渲染的过程中,浏览器决定加载哪些资源并优先加载它们的一种机制。正确配置资源加载的优先级可以显著改善页面加载性能,确保关键资源优先加载,提高用户感知的加载速度。 Web 资源加载方式 同步加载 同步加载…...

Docker-数据卷指令
数据卷挂载修改内容...

Elasticsearch VS Typesense! Elasticsearch未来会被其它搜索引擎取代吗?
近期网上流行一批新的搜索引擎,动不动就大言不惭,要跟龙头老大Elasticsearch比,想把Elasticsearch击败。 1. Typesense 太猖狂了,对Elasticsearch极为不敬 如近期炒作很猖狂的Typesense开源搜索引擎,一出来就急着挑战…...

usb摄像头 按钮 静止按钮
usb摄像头 按钮 静止按钮 来分析一个UVC的摄像头的枚举信息 UVC学习:UVC中断端点介绍 https://www.eet-china.com/mp/a269529.html 输入命令lsusb -d 0c45:62f1 -v https://www.miaokee.com/705548.html >Video Class-Specific VS Video Input Header Descrip…...

SAP MM学习笔记 - 豆知识03 - 安全在库和最小安全在库,扩张物料的保管场所的几种方法,定义生产订单的默认入库保管场所,受注票中设定禁止贩卖某个物料
上一章讲了一些MM模块的豆知识。 - MR21 修改物料原价 - MM02 修改基本数量单位/评价Class - MMAM 修改物料类型/评价Class SAP MM学习笔记 - 豆知识02 - MR21 修改物料原价,MM02 修改基本数量单位/评价Class,MMAM 修改物料类型/评价Class-CSDN博客 …...

激光导航AGV叉车那么多,究竟该怎么选?一篇文章讲明白~
AGV叉车 随着经济的快速发展,大部分企业的物料搬运开始脱离人工劳作,取而代之的是以叉车为主的机械化搬运。AGV叉车是工业搬运车辆,是指对成件托盘货物进行装卸、堆垛和短距离运输作业的各种轮式搬运车辆,主要应用于货场、工厂车间…...

redis面试(七)初识lua加锁脚本
redisson redisson如何来进行redis分布式锁实现的源码,基于redis实现各种各样的分布式锁的原理 https://redisson.org/ 这是官网 https://github.com/redisson/redisson/wiki/Table-of-Content 这是官方文档 开始 demo 建一个普通的工程在pom.xml里引入依赖 <…...

企元数智百年营销史的精粹:借鉴历史创造未来商机
随着时代的发展和科技的进步,传统营销方式正在经历前所未有的颠覆和改变。在这个数字化时代,企业需要不断创新,同时借鉴百年营销史的精粹,汲取历史经验,创造未来商机。而"企元数智"作为现代营销的代表&#…...
Java @SpringBootTest注解用法
SpringBootTest 是 Spring Framework 中的一个注解,用于指示 Spring Boot 应用程序的测试类。当你在测试类上使用 SpringBootTest 注解时,Spring Boot 会启动一个 Spring 应用程序上下文,并且加载应用程序的 application.properties 或 appli…...

构建智能招聘平台:人才招聘系统源码开发指南
本篇文章,小编将详细探讨如何基于人才招聘系统源码开发一个智能招聘平台,为企业的人才战略提供支持。 一、智能招聘平台的核心功能 智能招聘平台的核心在于提高招聘效率和匹配度,这需要集成多个关键功能模块: 1.职位发布与管理…...

Docker + Nacos + Spring Cloud Gateway 实现简单的动态路由配置修改和动态路由发现
1.环境准备 1.1 拉取Nacos Docker镜像 从Docker Hub拉取Nacos镜像: docker pull nacos/nacos-server:v2.4.01.2 生成密钥 你可以使用命令行工具生成一个不少于32位的密钥。以下是使用 OpenSSL 生成 32 字节密钥的示例: openssl rand -base64 321.3 …...

Linux中多线程压缩软件 | Mingz
原文链接:Linux中多线程压缩软件 本期教程 软件网址: https://github.com/hewm2008/MingZ安装: git clone https://github.com/hewm2008/MingZ.git cd MingZ make cd bin ./mingz -h使用源码安装: 若是你的git无法使用安装&am…...

【JavaEE精炼宝库】网络原理基础——UDP详解
文章目录 一、应用层二、传输层2.1 端口号:2.2 UDP 协议:2.2.1 UDP 协议端格式:2.2.2 UDP 存在的问题: 2.3 UDP 特点:2.4 基于 UDP 的应用层协议: 一、应用层 我们 Java 程序员在日常开发中,最…...
【回眸】周中WLB-个人
生活 计划 苏州or杭州or舟山 负负得正 烟火 鲜芋仙 办上海银行的银行卡 申请表材料准备好 个人博客提现签约变现 个人提升 yas补直播笔记(听、口)1~3课 *2倍 dy学堂 —— 3课时输出博客 个人笔记本搭建环境 副业探索 收集信息差 目前已…...

基于Spring boot + Vue的灾难救援系统
作者的B站地址:程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址:程序员云翼-CSDN博客 1.项目技术栈: 前后端分离的项目 后端:Springboot MybatisPlus 前端:Vue ElementUI 数据库: …...
C#进阶:轻量级ORM框架Dapper详解
C#进阶:轻量级ORM框架Dapper详解 在C#开发中,ORM(对象关系映射)框架是处理数据库交互的重要工具。Dapper作为一个轻量级的ORM框架,专为.NET平台设计,因其高性能和易用性而备受开发者青睐。本文将详细介绍D…...

【python015】常见成熟AI-图像识别场景算法清单(已更新)
1.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 【python015】常见成熟AI-图像识别场景算法清单及代码【python015】常见成熟AI-图像识别场景算法清单及代码【python015】常见成熟AI-图像识别场景算法清单及代码 文章目录 1.背景介绍2…...
删除有序数组中的重复项(LeetCode)
题目 给你一个 升序排列 的数组 ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 中唯一元素的个数。 考虑 的唯一元素的数量为 ,你需要做以下事情确…...

【算法 03】雇佣问题
“雇用问题”及其算法优化 在日常生活和工作中,我们经常会遇到需要从多个选项中做出选择的情况,而“雇用问题”正是这样一个典型的例子。在这个问题中,我们不仅要考虑如何高效地找到最佳候选人,还要关注整个过程中的成本。今天&a…...

vue3+axios请求导出excel文件
在Vue 3中使用axios请求导出Excel文件,可以发送一个GET或POST请求,并设置响应类型为blob或arraybuffer,然后使用new Blob()构造函数创建一个二进制文件,最后使用URL.createObjectURL()生成一个可以下载的链接。 先看代码 import…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...