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.hqwc.cn/news/685291.html

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

相关文章

Java 集合-List

集合主要分为两组(单列集合, 双列集合) Connection 接口有两个重要的子接口LIst 和 Set, 它们的实现子类都是单列集合, Map 接口的实现子类是双列集合, 存放的是 K-V Connection 接口 Collection 接口和常用方法 下面以 ArrayList 演示一下 add: 添加单个元素remove: 删除指…

618值得入手的平价好物清单,看完再买不吃亏!

即将到来的618年中购物狂欢节&#xff0c;无疑是一年一度的购物盛宴。为了让大家的购物体验更加愉悦和充实&#xff0c;我特地为大家精选了一系列好物。如果你也打算在618尽情购物&#xff0c;那就赶紧收藏这份清单吧&#xff01; 一、舒适佩戴不伤耳——南卡骨传导耳机Runner…

CTF—AWD防御起手式

前言 AWD (Attack With Defence)&#xff0c;比赛中每个队伍维护多台服务器&#xff0c;服务器中存在多个漏洞&#xff0c;利用漏洞攻击其他队伍可以进行得分&#xff0c;修复漏洞可以避免被其他队伍攻击失分。 改SSH密码 官方在给出服务器密码时&#xff0c;很有可能是默认…

浅谈如何利用 AI 提高内容生产效率?|TodayAI

在数字化时代&#xff0c;内容的创建和分发速度变得尤为关键。人工智能&#xff08;AI&#xff09;技术提供了加速这一过程的可能性&#xff0c;不仅提升了生产效率&#xff0c;还改善了内容的质量和受众的接受度。本文深入探讨AI如何在内容生成、分发与推广&#xff0c;以及内…

【Python】selenium爬虫常见用法和配置,以及常见错误和解决方法

欢迎来到《小5讲堂》 这是《Python》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言无执行文件代码报错信息错误路径手动下载自动下载 选项配置Ch…

【p7】正规式转正规文法

需要注意的是&#xff0c;有时候需要自己构造一个非终结符&#xff0c;非终结符推导到空&#xff0c;然后套用上面的公式即可

apollo资料整理

Application X: Application X Apollo: Apollo 自动驾驶开放平台 Cyber RT API tutorial Apollo learning notes for beginners. buildtool 命令 模块扩展概念介绍 消息的修改及扩展 基于插件进行开发 apollo介绍之Transform模块(七) - 知乎 Apollo Auto GitHub 百度…

Mysql8本地安装

官网&#xff1a; https://www.mysql.com/ yum安装下载&#xff1a;https://dev.mysql.com/downloads/repo/yum/ 二进制安装下载&#xff1a;https://downloads.mysql.com/archives/community/ 安装包下载 yum安装下载 打开网址&#xff08;https://dev.mysql.com/downloads/r…

基于Vant UI的微信小程序开发(随时更新的写手)

基于Vant UI的微信小程序开发✨ &#xff08;一&#xff09;悬浮浮动1、效果图&#xff1a;只要无脑引用样式就可以了2、页面代码3、js代码4、样式代码 &#xff08;二&#xff09;底部跳转1、效果图&#xff1a;点击我要发布跳转到发布的页面2、js代码3、页面代码4、app.json代…

Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件)

前言 Adobe Photoshop 是一款专业强大的图片处理工具&#xff0c;从照片编辑和合成到数字绘画、动画和图形设计&#xff0c;一流的图像处理和图形设计应用程序是几乎每个创意项目的核心所在。利用 Photoshop 在桌面上的强大功能&#xff0c;您可以在灵感来袭时随时随地进行创作…

Redis的数据类型及使用场景

redis命令大全官网: Commands | Docs (redis.io) 基本介绍 redis起初主要就是为了解决性能问题的&#xff0c;那么redis为什么快? 基于内存操作的&#xff0c;所以操作不需要跟磁盘进行交互&#xff0c;单次的执行会很快 命令执行是单线程 因为基于内存操作 单次执行时间反…

数据库调优-连接池优化

先贴下连接池的相关配置&#xff1a; 连接池参数配置&#xff1a; 字段含义Max Number of Connections最大连接数&#xff1b;做性能测试时&#xff0c;可以填 0 。在开发的项目中按实际代码填写&#xff0c;默认是 20 。Max Wait(ms)在连接池中取回连接最大等待时间&#xf…