前端性能优化-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…...
SAM 3科研可视化:分割结果嵌入Jupyter Notebook交互式分析
SAM 3科研可视化:分割结果嵌入Jupyter Notebook交互式分析 1. 引言:当科研遇上智能分割 想象一下这样的场景:你正在分析一批生物医学图像,需要从复杂的细胞图像中精确分离出特定的细胞结构。传统方法需要手动标注,耗…...
终极指南:如何利用Everything Claude Code Bun运行时提升JavaScript开发效率
终极指南:如何利用Everything Claude Code Bun运行时提升JavaScript开发效率 【免费下载链接】everything-claude-code The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code…...
Java 多线程详解(持续更新)
原理 线程生命周期 创建线程 存储变量 线程安全 锁的四维度 创建及配置线程池 原理 CPU工作原理:从内存中取出第一条指令(入口函数)进行执行 进程(Process),内存中的一段区域,含机器指令以及堆栈信息,只能被一个CPU执行 注:可执行程序编译后形成指令并加载到内存…...
3步构建安全可靠的用户脚本生态系统:Greasy Fork深度技术解析
3步构建安全可靠的用户脚本生态系统:Greasy Fork深度技术解析 【免费下载链接】greasyfork An online repository of user scripts. 项目地址: https://gitcode.com/gh_mirrors/gr/greasyfork Greasy Fork作为开源的用户脚本平台,基于Ruby on Rai…...
从哈希表到链表:一次搞懂链地址法解决冲突的C++实现细节(含插入与删除操作避坑)
从哈希表到链表:链地址法的C实战精解与避坑指南 在数据结构的世界里,哈希表因其接近O(1)的理想查找效率而备受青睐。但当我们真正动手实现时,特别是采用链地址法解决冲突时,那些看似简单的链表操作却暗藏玄机。本文将带您深入链地…...
GLM-4.6V-Flash-WEB效果展示:智能识别华硕/戴尔/联想BIOS界面
GLM-4.6V-Flash-WEB效果展示:智能识别华硕/戴尔/联想BIOS界面 1. 引言:BIOS界面识别的技术挑战 面对不同品牌电脑的BIOS设置界面,即使是经验丰富的技术人员也常常感到头疼。华硕的UEFI界面、戴尔的BIOS配置、联想的设置菜单——每个厂商都有…...
颠覆式闲鱼智能客服系统:家居卖家7×24小时值守零门槛解决方案
颠覆式闲鱼智能客服系统:家居卖家724小时值守零门槛解决方案 【免费下载链接】XianyuAutoAgent 智能闲鱼客服机器人系统:专为闲鱼平台打造的AI值守解决方案,实现闲鱼平台724小时自动化值守,支持多专家协同决策、智能议价和上下文感…...
终极指南:MoCo性能基准测试揭秘,ImageNet上67.5%准确率如何实现
终极指南:MoCo性能基准测试揭秘,ImageNet上67.5%准确率如何实现 【免费下载链接】moco PyTorch implementation of MoCo: https://arxiv.org/abs/1911.05722 项目地址: https://gitcode.com/gh_mirrors/mo/moco MoCo(Momentum Contras…...
Mathfs源码深度剖析:从多项式求解到几何代数的高级数学实现 [特殊字符]
Mathfs源码深度剖析:从多项式求解到几何代数的高级数学实现 🚀 【免费下载链接】Mathfs Expanded Math Functionality for Unity 项目地址: https://gitcode.com/gh_mirrors/ma/Mathfs Mathfs 是一个专为Unity游戏引擎设计的扩展数学功能库&#…...
5分钟搞定OpenClaw安装:Phi-3-vision-128k-instruct镜像一键部署指南
5分钟搞定OpenClaw安装:Phi-3-vision-128k-instruct镜像一键部署指南 1. 为什么选择星图平台部署Phi-3模型 上周我在本地尝试部署Phi-3-vision-128k-instruct模型时,被各种依赖冲突折磨得够呛。CUDA版本不匹配、vLLM编译失败、Python环境污染...这些问…...
