前端性能优化-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…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
