前端性能优化-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…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
