浏览器接收响应数据过大_交互响应性能之优化FID

由于 FID 需要一个真实用户的交互,所以无法用实验数据测试。

83726c9f324be43736fabaf24cbdf747.png

为了在实验数据下预测 FID,通常会用 TBT(Total Blocking Time),具体这个指标后面文章会介绍。他们测量的内容不同,但改善 TBT 通常也能改善 FID

一个糟糕的 FID 主要原因是JS执行过长,优化JS的解析、编译、执行可以直接降低 FID

过长的JS执行

当JS执行过程中,浏览器无法响应用户交互,因为主线程被占用,为了改善这点,可以:

  • 分解长任务
  • 优化页面,为交互准备
  • 使用 Web Worker
  • 减少JS执行时间

分解长任务

如果你准备尝试减少单个页面的js的体积,可以先考虑把较长执行的js代码分解成小的异步任务。

长任务指的是用户可能会发现页面无响应的时期执行的js代码。任何阻塞主线程大于等于50ms的代码都是长任务。长任务一般是js体积过大的潜在因素(浏览器加载并执行了比页面初始化所需要的更多的js)。

分解长任务可以降低用户输入延迟。

862426a135f8bc63e80ac0c82e0e08d4.png

当你采用最佳实践(例如拆分代码、分解长任务),FID 会有显著改善。虽然 TBT 并非现场数据指标,但这对于改善 FIDTTI(Time To Interactive) 都很有帮助。

优化页面,为交互准备

造成 FIDTBT 分数低有很多原因,大多都是js引起的。

自己站点的脚本执行可能会延后交互

  • JS体积过大,执行时间过长,无效的分包会导致页面响应用户交互变慢,影响 FIDTBTTTI。逐步加载代码和功能块可以拆分这些任务,提升响应速度。
  • 服务端渲染看上去页面是出来了,但用户的交互还是受限于js的执行时间,可以考虑把更多逻辑代码放在服务端实现,或者在构建的时候创建更多静态内容。

下图是 TBT 得分的优化前后对比。通过将非必须的昂贵的脚本的加载和执行移出关键路径,用户就可以更快的去与页面交互。

bd86321ea9794e326ef179a224a1cbf9.png

数据获取会影响交互准备的很多方面

  • 级联的获取数据的水流图(包含js,数据的网络请求等),会导致交互延迟。目的是要减少对级联数据获取的依赖。(减少请求数)
  • 较大的内联数据可以节省HTML的解析时间,同时影响绘制图像和交互两种指标。目的是要减少客户端后续处理对数据的依赖。(数据在内联已经准备好了,不需要额外请求)

第三方脚本的执行可能会延后交互

  • 很多网站都包含第三方库的标签和统计代码,这些会导致网络阻塞,使得主线程长时间无法响应,延后了交互。查找出必须加载的第三方代码。(例如:不滚动到指定位置不展示广告)
  • 有时候,第三方的脚本会抢先于本站脚本加载,例如加载优先级和带宽限制。尝试着优先加载你觉得可以给用户提供最有价值的东西。

使用 web worker

主线程阻塞是导致输入延迟的主要因素之一。web worker可以让你的代码在后台进程中执行,把一些非UI的操作放在web worker中执行可以减少主线程压力,改善 FID 指标。

可以使用以下的库,让你的站点更方便的集成web worker:

  • Comlink
  • Workway
  • Workerize

减少JS执行时间

  • 延后加载未使用的js
  • 最小化无用的polyfill

延后加载未使用的js

通过开发者工具中的coverage的tab页可以查看各资源的有效使用率。

99a611be7fbc46df37d893e219cb4f63.png

为了减少无用JS,可以:

  • 把你的代码拆分成多个chunk,按需加载
  • 使用 async 或者 defer 延后加载非关键脚本,包含第三方脚本

代码拆分指的是将一个大的单个JS拆分成多个小的,根据条件去加载对应的JS。现代浏览器已经支持按需加载:

import('module.js') .then((module) => {   // Do something with the module.    });

除了常用浏览器支持以外,一些构建系统也支持:

  • webpack,rollup,parcel等构建工具
  • angular,react,vue等客户端框架

除了可以使用代码拆分,也可以使用 async 或者 defer 来延后加载非关键脚本。

<script defer src="…"></script> 
<script async src="…"></script>

除非有特殊原因,一般第三方脚本都可以默认采用这种方式加载。

最小化无用的polyfill

如果你用了一些js高级语法,你可能需要将这些代码转换成旧版浏览器支持的语法,或者引入polyfill来支持。

最好的做法是,如果浏览器支持这些语法,不引入polyfill。最小化无用的polyfill,并且将它们的使用限制在需要它们的环境中,可以降低js的体积。

优化polyfill的使用,可以:

  • 如果你是用babel转义,使用 @babel/preset-env 可以只包含你需要支持的浏览器的polyfill。对于babel 7.9,可以开启 bugfixes 配置,进一步减少无用的polyfill。
  • 使用 module/nomodule 的模式传输两份不同的bundle。(@babel/preset-env 也支持,可以通过 target.esmodules
<script type="module" src="modern.js"></script> 
<script nomodule src="legacy.js" defer></script>

这样可以保证支持js模块的浏览器,可以加载模块化的打包文件,不支持的浏览器可以加载转义后的打包文件。

开发者工具

Lighthouse 6.0 不能测试 FID,因为它是一个现场数据指标,但是 TBT 可以作为替代品测试。针对 TBT 的优化项对 FID 也同样有效。

652355da590b8c421f067f69aa6fcb75.png

总结

实际项目的优化需要频繁的使用开发者工具 performance 和 lighthouse。针对长任务进行拆解,针对未使用的js进行移除,针对复杂的js使用web worker。最后再针对旧版浏览器和新版浏览器加载不同资源,以保证新版浏览器的对polyfill更少的依赖。如果使用webpack打包的项目,可以查看打包的分布图,针对性的去优化每一个bundle。

参考

https://web.dev/optimize-fid/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postman如何发送application/json类的post请求

​ 当接口类型限制为只接受application/json类型的请求&#xff0c;我们使用postman测试的时候怎么选择呢&#xff1f;如下图&#xff1a; 我们需要先在postman上选择POST请求方法&#xff0c;后边输入要请求的地址即可。 在Body选项卡选择raw&#xff0c;然后再后边的下拉选项…

fe文件服务器,FE File Explorer

FE File Explorer是Mac电脑上的一款文件管理应用。FE File Explorer可以访问FTP&#xff0c;SFTP&#xff0c;WebDAV服务器和网络共享上的文件。在这些位置之间传输文件。将电影和歌曲流式传输到Mac。直接在远程位置查看和编辑文档&#xff0c;照片&#xff0c;文件&#xff0c…

swift中文文档_Flutter 中文文档:使用 Packages

Flutter 支持使用其他开发者向 Flutter 和 Dart 生态系统贡献的共享 package&#xff0c;这意味着你可以快速构建应用而不是一切从零开始。现有的 package 支持许多使用场景&#xff0c;例如&#xff0c;网络请求 (http)&#xff0c;自定义导航/路由处理 (fluro)&#xff0c;集…

Spring深入理解之ComponentScan___@ComponentScan 详解

Spring深入理解之ComponentScan 一、概述 ComponentScan顾名思义包扫描&#xff0c;底层其实就可以通过递归算法反射将其装载成bean来实现的&#xff0c;实在开发过程中&#xff0c;Spring已经帮我们实现好了&#xff0c;我们其实就可以直接使用XML或者注解的形式来进行业务处…

云服务器centos怎么还原系统还原,云服务器centos怎么还原系统还原

云服务器centos怎么还原系统还原 内容精选换一换云耀云服务器(Halo Elastic Cloud Server&#xff0c;HECS)是可以快速搭建简单应用的新一代云服务器&#xff0c;具备独立、完整的操作系统和网络功能。提供快速地应用部署和简易的管理能力&#xff0c;适用于网站搭建、开发环境…

高倍数泡沫装置PHP_泡沫灭火系统,了解这几点就好

1 集输站库泡沫灭火系统的构成油区的泡沫灭火系统主要由消防水泵、消防水源、泡沫灭火剂储存装置、泡沫比例混合装置、泡沫产生装置及管道等组成。泡沫液按发泡倍数不同可分为低倍数泡沫液、中倍数泡沫液和高倍数泡沫液。发泡倍数 20 以下的称为低倍数泡沫液&#xff0c; 发泡倍…

python自动化_Python 实现Excel自动化办公上

今天的文章分享Python 如何轻松操作Excel 这款office 办公软件的&#xff0c;在Python 中你要针对某个对象进行操作&#xff0c;是需要安装与其对应的第三方库的&#xff0c;这里对于Excel 也不例外&#xff0c;它也有对应的第三方库&#xff0c;即xlrd 库。什么是xlrd库Python…

utf8编码为什么这么普遍,优势在哪里?

为什么需要字符集 计算机存储的和认识的东西就是0和1&#xff0c;我们存储的任何东西最后都会转为0和1的组合计算机才能处理&#xff0c;更贴切的说是我们看到的英文、中文等都是0和1组合的二进制经过一定规则转换为我们认识的字符&#xff0c;这个规则就是字符集。 有哪些字…

SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解

SpringBoot默认包扫描机制及ComponentScan指定扫描路径详解 SpringBoot默认包扫描机制 标注了Component和Component的衍生注解如Controller,Service,Repository就可以把当前的Bean加入到IOC容器中。那么SpringBoot是如何知道要去扫描Component注解的呢。ComponentScan做的事情…

raid卡组不同raid_RAID 类型介绍

RAID (Redundant Array of Independent/InexpensiveDisks)&#xff0c;独立磁盘冗余阵列&#xff0c;是一种将多块独立的硬盘(物理硬盘)按不同的组合方式形成一个硬盘组(逻辑硬盘)&#xff0c;从而提供比单块硬盘更大的存储容量、更高的可靠性和 更快的读写性能等。该概念最早由…

springboot前端传参date类型后台处理方式

springboot前端传参date类型后台处理方式 先说结论&#xff1a;建议大家直接使用JsonFormat&#xff0c;原因如下&#xff1a; 1、针对json格式&#xff1a;在配置文件中加以下配置 spring.jackson.date-formatyyyy-MM-dd HH:mm:ssspring.jackson.time-zoneGMT82、针对form表…

SpringBoot:解决日期转换问题和日期展示问题

本次我们解决问题&#xff1a;日期展示问题(返回的json中日期的格式是:“birthday”:“1988-08-07T15:00:00.0000000”);需要转化成指定的格式&#xff08;年月日时分秒格式&#xff09; 1、问题如 2、解决方案 在配置中加入 #时间戳统一转换 spring.jackson.date-formatyyy…

日期格式化时注解@DateTimeFormat无效的问题分析

日期格式化时注解DateTimeFormat无效的问题分析 背景 有时候我们在写接口时&#xff0c;需要把前台传来的日期String类型转为Date类型 这时我们可能会用到DateTimeFormat注解 在请求数据为非JSON格式时&#xff0c;这个注解是没有问题的&#xff0c;可用的&#xff1b; 但…

12 - java 类加载内存图

栈是线程私有的、堆是线程公有的如果不加 static 就是堆里面的属性&#xff0c;加了static 就是元数据区的属性

source code怎么用_code-builder代码生成器

背景本来code-builder是专门为MyBatis Enhance来编写的一块代码生成器code-builder可以用来做什么&#xff1f;code-builder是一款代码生成maven mojo插件&#xff0c;通过简单的配置就可以完成数据库内Table转换Entity或者其他实体类&#xff0c;想怎么生成完全根据你的个人业…

@Transactional注解的失效场景

Transactional注解的失效场景 引言 Transactional 注解相信大家并不陌生&#xff0c;平时开发中很常用的一个注解&#xff0c;它能保证方法内多个数据库操作要么同时成功、要么同时失败。使用Transactional注解时需要注意许多的细节&#xff0c;不然你会发现Transactional总是…

Spring 事务方法与非事务方法相互调用 @Transactional 注解失效不回滚?

写这篇文章的初衷呢就是最近遇到了一个Spring事务的大坑。与其说是坑&#xff0c;还不如说是自己事务这块儿太薄弱导致的&#xff08;自嘲下&#xff09;。 项目环境 Spring Boot 下面开始问题描述&#xff0c;发生的过程有点长&#xff0c;想直接看方案的直接跳过哦~&#x…

vue后端必须接口吗_前后端分离模式,后端说开发完才能给接口文档,合理吗

背景&#xff1a;汇总了下老王在其他平台的原创回复&#xff0c;欢迎关注老王原创公众号【软件老王】&#xff0c;关注不迷路。一、后端开发完接口才给出接口文档&#xff0c;合理吗&#xff1f;本人所在的项目组做项目过程中&#xff0c;后端不会先给出接口文档&#xff0c;而…

JAVA那点破事,并发、IO模型、集合、线程池、死锁、非阻塞、AQS...

JDK、JRE、JVM 三者有什么关系&#xff1f; 答案&#xff1a; JDK&#xff08;全称 Java Development Kit&#xff09;&#xff0c;Java开发工具包&#xff0c;能独立创建、编译、运行程序。 JDK JRE java开发工具&#xff08;javac.exe/java.exe/jar.exe) JRE&#xff08;…

PTA 最小生成树-kruskal

7-92 最小生成树-kruskal 分数 10 全屏浏览题目 作者 任唯 单位 河北农业大学 题目给出一个无向连通图&#xff0c;要求求出其最小生成树的权值。 温馨提示&#xff1a;本题请使用kruskal最小生成树算法。 输入格式: 输出格式: 输出一个整数表示最小生成树的各边的长度之和。…