DevEco:智能、灵活、实时的集成开发环境

引言

前端性能是一个老生常谈的话题了,它不单单是一个技术概念,而是用户体验中非常重要的一环。通常在一些面向用户的产品中它直接影响了用户转化率、粘性等重要指标。

那么是不是不在乎转化率的中后台产品就可以不在乎性能了?显然不是,在中后台系统中虽然用户别无选择,但是糟糕的体验带给他们的压力会更大,且一定程度地影响他们的工作效率。

在消费者研究中指出,对网页加载速度延迟的压力反应类似于观看恐怖电影或解决数学问题,比在零售店排队等候的压力更大。

后面我会主要介绍前端的性能模型及其关键的性能指标,帮助大家更好定义自己系统的性能好坏。

性能模型

说到性能就不得不提到谷歌提出的 RAIL 模型 ,该模型是一种以用户为中心的性能模型,会将用户体验细分为关键操作(例如点按、滚动、加载),并帮助您为每项操作定义性能目标。

image

该模型定义了用户对性能的感知范围

image

基于该范围为每个方面都定了目标和准则:

  • 相应:<50ms
  • 动画:<10ms
  • 空闲:最大限度地延长空闲时间
  • 加载:3g 环境下 <5s

具体详细可以自行查看。类似灯塔和 Chrome DevTools 等性能分析工具也都是基于该模型去分析网页的性能数据,同时给出一些指标。接下来我们来详细了解这些效果指标。

效果指标

在了解具体指标之前我们要先了解效果指标的衡量方式,通过以下两种方式之一进行衡量:

  • 在实验室中:使用工具在一致的受控环境中模拟网页加载,称之为实验室指标(lab)
  • 在实际环境中:针对实际加载网页并与之互动的真实用户,称之为现场指标(field)

实验室指标

实验室指标通常需要借助开发工具,在一致受控的环境模拟加载。通常来说会在发布功能之前就行测试。

现场指标

和实验室指标不同,现场指标更多是在用户实际使用时采集的指标。

因为网站性能会因为用户的设备以及网络状态的不同造成明显的变化,还会受到用户的实际操作的不同而受到影响。

核心衡量指标

下面我们来介绍一些核心的衡量指标,所有指标会有自己的生命周期,同样地也会有指标被废弃

下面我会以 2024/02 的版本来介绍目前核心的三个指标:

Largest Contentful Paint (LCP)

 LCP最大内容绘制,为目前感知加载速度的最核心指标。他报告的时间区间为:

首次导航到相应网页的时间 => 视口中可见最大图片或文本块的呈现时间。

我们知道一个完整的周期包含很多过程:

而 LCP 记录在页面加载之后的时间,包含了后续的大部分 js 操作,是最能真实反应加载时长的指标。

何为最大内容?

和我们的固有印象不同,它记录的不是整个页面的“堆积”而是某个固定元素的大小,这个目标元素可能是

  • 图片
  • 视频
  • 包含文本节点的块级元素

其“大小”指的是该元素在视图中占的尺寸。对于文本元素而言即块级元素所占的长方形区域,对于图片而言为调整过大小的可见尺寸或原尺寸(取小的),同时不包含 css 的边距。最终,占比最大的元素出现的时间点为上报的时间点。

要注意的是一旦用户操作,则会停止记录,当前记录的最大内容则为目标最大内容,之后再出现的不算。

如何评估好坏

RAIL 模型认为应将 LCP 控制在 2.5 秒以内,该指标取的是数据的 75 分位。

image

实际情况可以自己定义。比如相对于我们 Hulu 架构,目标相对激进,取的都是 90 分位数据,目标数字可能是 3s(good)、5s(need improvement)

Interaction to Next Paint (INP)

 和 LCP 一样  INP 也是一个核心指标,该指标用来评估页面的响应能力。INP 会在网页生命周期内观察用户与网页进行的所有点击、点按和键盘互动的延迟时间,并报告最长持续时间。

对于 INP,仅观察以下互动类型

  • 使用鼠标点击。
  • 点按带有触摸屏的设备。
  • 按实体键盘或屏幕键盘上的某个键。

这里需要注意的是INP 并不关心滚动本身,当然触发滚动的其他键盘操作可能会引起其他记录

image

同样的 75 分位 200ms 你的页面响应数据可以算得上优秀。

这里不得不提到另一个指标:First Input Delay (FID) 。FID 可以算得上 INP 的前任,不同的是其只记录页面上首次互动的输入延迟。相比来说 INP 更能反应整体水平。

Cumulative Layout Shift (CLS) 

累计布局偏移是最后一个核心指标,它可以量化用户遇到意外布局偏移的频率,越低代表体验越好。

什么是布局偏移?

突然插入的元素、布局的变化导致某些元素丢失其原来的位置,对于用户而言其关注的元素发生了位置变化。

举个例子:用户本来是要点击取消按钮提交按钮,突然插入的元素让用户不小心点到了提交。

CLS 会在每次布局偏移后记录其得分。得分计算方法了解下就好:

为了计算布局偏移得分,浏览器会考虑视口大小,以及视口中不稳定元素在两个渲染帧之间的移动。布局偏移分数是该移动的两种度量的乘积:影响分数和距离分数。

layout shift score = impact fraction * distance fraction

如何避免?

CLS 的优秀分数为 0.1 这个分数大家会没什么体感,且这个分数在我们团队不作要求。

我们中后台页面会有很多表单,折叠、开关等交互控制部分内容的显隐十分普遍。

大家只要注意以下场景即可。

  • 没有尺寸的图片。
  • 广告、嵌入和没有尺寸的 iframe。
  • 动态注入的内容
  • 网络字体。

其他衡量指标

其他指标多为非核心指标,这些指标要么被核心指标替代,要么包含在核心指标内,要么被废除,除了前面提到的 FID,我这里介绍些其余两个未被废除的重要指标:

Time to First Byte (TTFB)

TTFB 记录加载第一个字节所需时间,其包含了:

  • 重定向时间
  • Service Worker 启动时间(如果适用)
  • DNS 查找
  • 连接和 TLS 协商
  • 请求,直到响应的第一个字节到达

无论是  FCP 还是 LCP 都包含了 TTFB 的时间,虽然他不是核心指标,但是在我们团队是一个非常关注的指标,他反映了我们整体 hulu 架构中天雀部分的性能水平。

 模型认为 75 分位的 800ms 为 GOOD ,而我们团队目前基本已经达到优秀水平,后续希望在 90 分位达到优秀水平。

First Contentful Paint (FCP)

First Contentful Paint (FCP) 是另一项重要指标。该指标很好理解,其报告区间为

 首次导航到相应网页的时间 => 网页的任何部分呈现在屏幕上所用的时间。

FCP 不会作为我们性能分析的核心数据,因为个人认为其上报的点不具有实际意义。同样以我们的 Hulu 架构为例,FCP 的上报时间大多在我们的 Layout 渲染期间,此时只渲染出了菜单,并没有开始渲染我们的微应用,我们可以轻而易举地达到 GOOD 水平,对于用户来说意义不大。当然它可以作为其他的过程指标,比如 layout 的渲染时间用于记录业务之前的渲染时长。

自定义指标

上面都是 RAIL 模型定义的指标,但就像我上面提到的,实际情况并不是所有指标都适用,我们还需要根据自己的实际情况,定制自己的指标。

比如我们的 Hulu 架构就有很多特点:

  • spa 单页应用
  • 中后台应用
  • 多表单
  • 微应用
  • 可视化
  • ...

针对这种情况,底层还是有很多 api 供我们使用的:

  • User Timing API
  • Long Tasks API
  • Element Timing API
  • Navigation Timing API
  • Resource Timing API
  • 服务器时间

具体这些 api 如何使用,本文就不多做介绍了,大家可以自行查阅。以及后续会有哪些自定义指标我会在后续的《性能标准》中体现。

最后

本文主要介绍了 RAIL 性能模型以及模型定义的相关指标,同时讲述了部分指标在团队内的使用情况。为什么要梳理这些?这些内容是我做性能优化以及制定目标的理论基础,同时也是我后续制订性能标准的重要参考。基于该模型也是希望能打造一个属于自己团队的性能模型,借此提高团队整体性能水位。

前端的世界总是在不断变化,作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。低代码也是一个值得我们深入探索的领域,让我们拭目以待,它将给前端世界带来怎样的变革。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

JNPF可以实现应用从创建、配置、开发、测试到发布、运维、升级等完整生命周期的管理。减少了传统应用程序的代码编写量,通过图形化、可视化的界面,以拖放组件的方式,即可快速生成应用程序的产品,大幅降低了开发企业管理类软件的难度。

希望这篇文章对你有所帮助~

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

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

相关文章

API接口开发实现一键智能化自动抓取电商平台商品评论数据支持高并发免费接入示例

为了实现一键智能化自动抓取电商平台商品评论数据可支持高并发免费接入&#xff0c;你可以使用Python编程语言和相关库&#xff08;如requests、BeautifulSoup等&#xff09;来开发一个API接口&#xff0c;也可以使用封装好的api接口获取&#xff0c;注册一个api账号获取key和s…

超详细的胎教级Stable Diffusion使用教程(一)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

星途重启:244亿公里外的「旅行者1号」,修好了

2024年4月20日&#xff0c;旅行者1号工程团队时隔5个月&#xff0c;终于重新收到了来自47年前所发射的探测器传回的有效数据。 ▲收到数据当天&#xff0c;工程团队成员在NASA喷气动力实验室的会议室中欢呼。 01.关于旅行者1号 在当下5G和WIFI已经普及的时代&#xff0c;NASA喷…

【QT教程】QT6硬件数据库编程 QT硬件数据库

QT6硬件数据库编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免…

Oracle中blob和clob的区别和例子

在Oracle数据库中&#xff0c;BLOB&#xff08;Binary Large Object&#xff09;和CLOB&#xff08;Character Large Object&#xff09;是用于存储大量数据的两种大型对象&#xff08;LOB&#xff09;类型&#xff0c;但它们之间存在一些关键的区别。 数据存储方式&#xff1…

FFmpeg常用API与示例学习(二)

封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳&#xff0c;将编码后的数据存储于此封装格式的文件之内。 封装又称容器&#xff0c;容器的称法更为形象&#xff0c;所谓容器&#xff0c;就是存放内容的器具&#xff0c;饮料是内容&…

vue3速览

在您的Vue.js 3应用中&#xff0c;createApp 是用于创建一个Vue应用实例的函数。您已经正确地引入了它并开始创建应用&#xff0c;但目前根组件内部是空的。下面我将为您展示一个更完整的例子&#xff0c;说明如何设置根组件的模板、数据、方法等选项&#xff0c;并挂载到DOM上…

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7)

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用&#xff08;7&#xff09; —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&a…

Python | Leetcode Python题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:names path.split("/")stack list()for name in names:if name "..":if stack:stack.pop()elif name and name ! ".":stack.append(name)re…

W801学习笔记二十四:NES模拟器游戏

之前已经实现了NES模拟器玩游戏。W801学习笔记九&#xff1a;HLK-W801制作学习机/NES游戏机(模拟器) 现在要在新版本掌机中移植过来。 1、把NES文件都拷贝到SD卡中。 这回不会受内存大小限制了。我这里拷贝了4个&#xff0c;还可以拷贝更多。 2、应用初始化中&#xff0c;加载…

React 学习-7-组件API

设置状态:setState setState(object nextState[, function callback]) nextState&#xff0c;将要设置的新状态&#xff0c;该状态会和当前的state合并 callback&#xff0c;可选参数&#xff0c;回调函数。该函数会在setState设置成功&#xff0c;且组件重新渲染后调用。 替…

FFmpeg常用API与示例学习(一)

工具层 1.av_log 可以设置日志的级别&#xff0c;这个看看名字就明白了&#xff0c;也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…

如何使用 await-to-js 库优雅的处理 async await 错误

通过阅读优秀的源码并从中学习如何写出让人觉得赏心悦目的代码最后再写文章进行总结对整个学习的过程进行一个梳理同时分享给其他人。 JS 异步编程进化之路 回调地狱阶段 在正式介绍 await-to-js 这个库之前&#xff0c;让我们先简单的回顾一下有关于在 JavaScript 这门语言…

ctfshow web入门 php反序列化 web275--web278(无web276)

web275 这道题和序列化一点关系都没有 整个代码并没有说filename(f)怎么传参只有fn并且屏蔽了flag highlight_file(__FILE__);class filter{public $filename;public $filecontent;public $evilfilefalse;public function __construct($f,$fn){$this->filename$f;$this-&g…

bash: docker-compose: 未找到命令

bash: docker-compose: 未找到命令 在一台新的服务器上使用 docker-compose 命令时&#xff0c;报错说 docker-compose 命令找不到&#xff0c;在网上试了一些安装方法&#xff0c;良莠不齐&#xff0c;所以在这块整理一下&#xff0c;如何正确快速的安装 docker-compose cd…

STM32入门周边知识(为什么要装MDK,启动文件是什么,为什么要配置时钟等等)

目录 MDKMDK与C51共存为什么要安装MDK 启动文件是什么&#xff0c;为什么要添加许多文件为什么要添加头文件路径为什么是寄存器配置魔术棒中的define为什么必须先配置时钟杂例 MDK MDK与C51共存 在最开始学习51单片机的时候&#xff0c;当时安装keil的时候&#xff0c;认为就是…

Web实时通信的学习之旅:WebSocket入门指南及示例演示

文章目录 WebSocket的特点1、工作原理2、特点3、WebSocket 协议介绍4、安全性 WebSocket的使用一、服务端1、创建实例&#xff1a;创建一个webScoket实例对象1.1、WebSocket.Server(options[&#xff0c;callback])方法中options对象所支持的参数1.2、同样也有一个加密的 wss:/…

C++ NetworkToHostOrder、HostToNetworkOrder 模板函数

其作用类型&#xff1a;ntohl、htonl、ntohs、htons 函数的作用&#xff0c;因为要考虑兼容 int128、int64 等数据类型。 IPV6 肯定是 int128 了&#xff0c;使用这两个函数可以帮助人们计算IPV6的地址范围等。 template <class T> static T …

在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

在 Hibernate 中&#xff0c;getCurrentSession 和 openSession 是两种不同的方法来获取 Session 对象&#xff0c;它们之间存在一些关键的区别。 事务管理方式&#xff1a; getCurrentSession&#xff1a;它依赖于当前的事务上下文&#xff0c;通常与 Spring 等框架集成&…

报表-设计器的使用

1、设计器目录结构 报表设计器以压缩包的方式提供&#xff0c;解压后&#xff0c;目录结构如下&#xff1a; 目录说明&#xff1a; 1、jdk-17&#xff1a;压缩包中自带的windows平台下的jdk17 2、lite-report&#xff1a;报表文件和数据源配置文件的保存位置 3、lite-repor…