以用户为中心的前端性能

news2025/2/26 19:10:29

在这里插入图片描述

1. 简介

前端性能跟用户体验息息相关。举个栗子,当你打开乘车码扫码进站,网页白屏了很久才加载出来,延误了乘车时间;当你在微信抢红包时,点击按钮后延迟了一会才开始转圈圈,最终没抢到红包。当出现这样的情况,用户体验就不好了。有研究表明,网页加载时间超过3秒,有一半的用户会失去耐心而离开。由此可见,前端性能对用户体验很重要

那么,什么是前端性能呢?

谈到性能,我们会想到高并发、高吞吐量,但这些是用户无法感知到的。对于用户来说,页面秒开、交互顺畅,才会觉得这个网站快。所以,前端性能关注的是页面加载速度和交互响应速度

image.png

2. 页面加载

如果页面加载太慢,用户就会失去耐心而离开。那么,浏览器是怎么加载页面的呢?

  • 首先,加载HTML并构建DOM。同时,同步地加载脚本(<script>),异步地加载异步脚本(<script async>) 和图片等资源。
  • 然后,DOM构建完成之后,加载延迟脚本(<script defer> 和 <script type=‘module’>)。在以上过程中,非异步脚本都会等待CSS加载。
  • 最后,DOM构建完成,所有脚本、CSS和图片等资源加载完成,即页面加载完成。

下图是页面加载的整个生命周期:
image.png

关键时间点如下:

  • domInteractive:表示DOM构建完成的时间点(此时JavaScript已经可以访问DOM)。
  • domContentLoadedEventStart:表示domContentLoaded事件处理器开始的时间点。(此时,脚本和CSS已经加载完成,异步脚本除外)
  • domComplete:表示页面加载完成的时间点(包括DOM解析完成,所有脚本、CSS和图片等资源加载完成)。

这些关键时间点,客观地衡量了页面加载速度。但是对用户来说,能直接感知的是白屏时间

对应的指标如下:

  • FCP: First Contentful Paint即首次渲染出内容的时间点。
  • LCP:Largest Contenful Paint即渲染出主要内容的时间点。与FCP相比,用户对LCP的感知会更明显。

3. 交互响应

用户看到页面渲染出来了,就会下意识地去操作页面,这时如果没有及时反馈,用户就会感觉到页面有延迟。

那么,为什么页面没有及时响应呢?

用户输入或点击按钮触发事件,网页会执行事件处理函数。如果处理时间过长,就会阻塞主线程,无法及时处理UI事件,造成页面卡顿。

对应的指标如下:

  • TTI: Time To Interactive,即页面可交互的时间点。
  • FID:First Input Delay,即用户首次输入的延迟时间。
  • long tasks:如果一个任务执行时间超过50ms,就是long tasks。long tasks会阻塞主线程,造成页面卡顿。
  • input delay:从用户输入到页面响应的时间差值。

4. 采集性能数据

网页的加载和渲染是发生在浏览器端的,所以依赖于浏览器提供的API来获取性能数据。

4.1. 采集页面加载性能

new PerformanceObserver((entryList) => {  
  for (const entry of entryList.getEntries()) {  
      console.log(entry)
  }  
}).observe({type: "navigation", buffered: true});

image.png

4.2. 采集FCP&LCP

// 获取FCP
new PerformanceObserver((entryList) => {  
  for (const entry of entryList.getEntries()) {  
      console.log(entry)
  }  
}).observe({type: "paint", buffered: true});

image.png

// 获取LCP
// 浏览器会多次报告 LCP ,而一般真正的 LCP 是用户交互前最近一次报告的 LCP
new PerformanceObserver((entryList) => {  
  for (const entry of entryList.getEntries()) {  
    console.log('LCP candidate:', entry.startTime, entry);  
  }  
}).observe({type: 'largest-contentful-paint', buffered: true});

image.png

4.3. 采集TTI&FID

浏览器没有提供直接获取TTI的API,但有方法可以计算出TTI。计算方法是:找到FCP之后的第一个安静窗口,窗口前的最后一个long task结束时间就是TTI。

安静窗口需满足三个条件:1.没有long task;2.窗口内get请求不超过2个;3.窗口时间不少于5s。

image.png

// 获取FID
new PerformanceObserver(function(list, obs) {  
  const firstInput = list.getEntries()[0];  
  
  // Measure the delay to begin processing the first input event.  
  const firstInputDelay = firstInput.processingStart - firstInput.startTime;  
  // Measure the duration of processing the first input event.  
  // Only use when the important event handling work is done synchronously in the handlers.  
  const firstInputDuration = firstInput.duration;  
  // Obtain some information about the target of this event, such as the id.  
  const targetId = firstInput.target ? firstInput.target.id : 'unknown-target';  
  // Process the first input delay and perhaps its duration...  
  
  // Disconnect this observer since callback is only triggered once.  
  obs.disconnect();  
}).observe({type: 'first-input', buffered: true});

4.4. 采集long task

// 获取long task
new PerformanceObserver((entryList) => {  
  for (const entry of entryList.getEntries()) {  
    console.log(`startTime=${entry.startTime},duration=${entry.duration}`);  
  }  
}).observe({type: 'longtask', buffered: true});

image.png

4.5. 性能测试工具

以下是一些常用的性能测试工具:

  1. lighthouse

Lighthouse 是 Google 开发的一款性能测试工具。支持Chrome Extension手动使用,还可以通过 Node CLI 集成到流水线自动化测试。
image.png

  1. www.webpagetest.org

如果要测试国外网站,可以用webpagetest。
image.png

5. 性能基线

根据用户对网页性能的感知,有了FCP、LCP、TTI、FID等性能指标来衡量网页性能。那么,如何划分优劣呢?为此,Google提供了一个标准的性能基线。我们可以参考这个基线来监控网页性能的达标率。需要注意的是,随着软硬件的升级,基线本身是会有调整的。另外,设备性能和网络环境对网页性能也有很大影响,例如IOS上报的性能指标一般要优于安卓。

指标
FCP[0,1800ms][1800ms,3000ms]>3000ms
LCP[0,2500ms][2500ms,4000ms]>4000ms
TTI[0,3800ms][3800ms,7300ms]>7300ms
FID[0,100ms][100ms,300ms]>300ms

6. 总结

前端性能对用户体验很重要。如果页面加载太慢,用户就会失去耐心而离开。页面加载出来后,用户会下意识地去操作页面,如果页面没有及时给出反馈,用户就会感知到页面延迟。因此,针对用户对性能地感知,可通过FCP、LCP、FID、TTI、long task、input delay等性能指标,衡量页面性能。通过采集性能数据,有效地帮助分析网页性能,提升性能,提升用户体验。

参考资料

海愚-如何重新认知性能优化及其度量方法

MDN Web Performance

Web Performance Working Group

前端监控系列3 | 如何衡量一个站点的性能好坏

深入浅出 Performance 工具 & API

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

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

相关文章

python自学之《艾伯特用Python做科学计算》(1)——(待完善)

好吧&#xff0c;刚开始就打了一波而广告 啄木鸟社区的Python图书概览&#xff1a; http://wiki.woodpecker.org.cn/moin/PyBooks &#xff08;22/388&#xff09;

pytorch 模型量化quantization

pytorch 模型量化quantization 1.workflow1.1 PTQ1.2 QAT 2. demo2.1 构建resnet101_quantization模型2.2 PTQ2.3 QAT 参考文献 pytorch框架提供了三种量化方法&#xff0c;包括&#xff1a; Dynamic QuantizationPost-Training Static Quantization&#xff08;PTQ&#xff0…

基于Logistic回归实现二分类

目录 Logistic回归公式推导&#xff1a; Sigmoid函数&#xff1a; Logistic回归如何实现分类&#xff1a; 优化的方法&#xff1a; 代码&#xff1a; 1.创建一个随机数据集&#xff0c;分类直线为y2x&#xff1a; 为什么用np.hstack()增加一列1&#xff1f; 为什么返回…

协同过滤算法:个性化推荐的艺术与科学

目录 引言&#xff1a; 一、协同过滤算法的基本原理 二、协同过滤算法的应用领域 三、协同过滤算法的优缺点 四、协同过滤算法的未来发展方向 五、结论 引言&#xff1a; 在当今数字化时代&#xff0c;信息过载成为了一个普遍的问题。为了帮助人们更好地发现符合个性化需…

Linux驱动开发学习笔记2《LED驱动开发试验》

目录 一、Linux下LED灯驱动原理 1.地址映射 二、硬件原理图分析 三、实验程序编写 1.LED 灯驱动程序编写 2.编写测试APP 四、运行测试 1.编译驱动程序和测试APP &#xff08;1&#xff09;编译驱动程序 &#xff08;2&#xff09;编译测试APP 2.运行测试 一、Linux下…

分享81个节日PPT,总有一款适合您

分享81个节日PPT&#xff0c;总有一款适合您 81个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1V0feg5pZ8C1Szycy40CrUw?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

Android CardView基础使用

目录 一、CardView 1.1 导入material库 1.2 属性 二、使用(效果) 2.1 圆角卡片效果 2.2 阴影卡片效果 2.3 背景 2.3.1 设置卡片背景(app:cardBackgroundColor) 2.3.2 内嵌布局&#xff0c;给布局设置背景色 2.4 进阶版 2.4.1 带透明度 2.4.2 无透明度 一、CardView 顾名…

【编码魔法师系列_构建型1.3 】抽象工厂模式(Abstract Factory)

学会设计模式&#xff0c;你就可以像拥有魔法一样&#xff0c;在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们&#xff08;GoF&#xff09;凝聚出来的最佳实践&#xff0c;可以提高代码的可读性、可维护性和可重用性&#xff0c;从而让我们的开发效率更高。通…

vs 安装 qt qt扩展 改迅雷下载qt

Qt5.14.2安装教程和VS2019中的qt环境配置-CSDN博客 1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2 4 新版要源码安装 需要自己安装 安装独立安装的旧版 官网…

pygame时序模块time

文章目录 简介时钟对象平抛运动 pygame系列&#xff1a;初步&#x1f48e;加载图像&#x1f48e;图像变换&#x1f48e;直线绘制 简介 之前在更新图形的时候&#xff0c;为了调控死循环的响应时间&#xff0c;用到了time.sleep。而实际上&#xff0c;我们并不需要额外导入其他…

最强Node js 后端框架学习看这一篇文章就够

距离上次认真花时间写作&#xff0c;似乎已经过了许久许久&#xff0c;前端讲了一个新框架 &#xff0c;叫 Nest.js 下方是课件&#xff0c;有过一定开发经验可跟随视频学习 B站 地址 &#xff1a; https://www.bilibili.com/video/BV1Lg4y197u1/?vd_sourcead427ffaf8a5c8344…

【计算机网络笔记】物理层——数据通信基础

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【1】基于多设计模式下的同步异步日志系统-项目介绍

1. 项目介绍 本项⽬主要实现⼀个日志系统&#xff0c; 其主要支持以下功能: • 支持多级别日志消息 • 支持同步日志和异步日志 • 支持可靠写⼊日志到控制台、文件以及滚动文件中 • 支持多线程程序并发写日志 • 支持扩展不同的日志落地⽬标地 2. 开发环境 • CentOS 7 • vs…

Node版本管理nvm工具安装及使用问题

安装和配置 下载地址 nvm官方下载window环境直接下nvm-setup.zip解压安装即可。 安装效验以及镜像配置 在cmd中&#xff0c;输入nvm -v 会反馈相应的安装版本&#xff0c;即表示安装成功。配置镜像源: nvm node_mirror https://npm.taobao.org/mirrors/node/ nvm npm_mir…

GitHub上1.5K标星的QA和软件测试学习路线图

​最近在GitHub上发现一个项目&#xff0c;项目描述了作为QA工程师&#xff0c;进行软件测试技能提升时的&#xff0c;建议的软件测试学习顺序图​。 虽然2021年起就不再更新了&#xff0c;但是居然有1.5K的​星。 整个项目有两个部分​&#xff1a; ​1.QA和软件测试学习顺序…

线程池大小设置多少,比较合适?

设置线程数的核心点 压测&#xff01;压测&#xff01;再压测&#xff01;实际对性能要求比较高的场景&#xff0c;压测是最佳的方式&#xff01; 并发编程适用于什么场景&#xff1f; CPU 密集型 对于 CPU 密集型任务&#xff0c;希望最大限度地提高 CPU 利用率&#xff0c…

使用String.valueOf()的坑

说明&#xff1a;记录一次使用String.valueOf()的坑&#xff0c;以下是一段有问题的代码&#xff1a; String count String.valueOf(listData.get(0).get(0).get("count");if (StringUtils.isBlank(count) || "0".equals(count)) {result.setResult(page)…

LLM推理部署(五):AirLLM使用4G显存即可在70B大模型上进行推理

众所周知&#xff0c;大模型的训练和推理需要大量的GPU资源&#xff0c;70B参数的大模型需要130G的GPU显存来存储&#xff0c;需要两个A100&#xff08;显存为100G&#xff09;。 ​ 在推理过程中&#xff0c;整个输入序列也需要加载到内存中进行复杂的“注意力”计算&am…

【WinForm.NET开发】演示:创建一个图片查看器 Windows 窗体应用

本文演示将创建一个 Windows 窗体应用程序&#xff0c;用于加载和显示图片。 Visual Studio 集成设计环境 (IDE) 提供了创建应用所需的工具。 1、先决条件 若要完成本教程&#xff0c;必须具有 Visual Studio。 请访问Visual Studio 下载页获取免费版本。 2、创建 Windows …

C语言扫雷游戏

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、扫雷游戏的分析和设计1.1扫雷游戏的功能说明1.2数据结构的分析1.3文件结构设计 二、扫雷游戏的代码实现总结 前言 详细介绍扫雷游戏的思路和实现过程。 一…