当考虑网页首屏时长优化的时候,我们在考虑什么?

简介: 当考虑网页首屏时长优化的时候,我们在考虑什么?

写在前面


首先贴一下参考文章的地址:

https://developers.google.com/web/fundamentals/performance/user-centric-performance-metrics


最近这段时间,我在做h5的首屏加速相关的工作。首先需要搞清楚的问题就是:首屏加速,到底是要加速什么?  答案可能很简单:加快网页的展现过程。不过再细想一下,网页快不快是针对用户而言的,那么什么样的速度会让用户感到快呢?或者说,哪些指标能够衡量用户所感知的"快"呢?


首屏性能指标


我首先想到的衡量指标就是网页开始请求,到页面渲染完成展现在用户眼前,这中间的时间差。现代浏览器都提供了window.performance的api,可以通过window.performance.timing.fetchStart来获取网页开始请求时候的时间戳。页面渲染完成的时间点,可以在页面的业务逻辑中判断。我用这种打点方式统计了业务中某页面的首屏加载时长:

640.jpg

(上图中,横坐标是加载耗时,单位是毫秒。纵坐标是各个加载耗时对应的pv数)

上图的数据中,pv总数为90316,首屏加载时长60分位值为:1394ms,90分位值为:2715ms。也就是说,60%的用户能在1394毫秒内看到完整的页面,90%的用户能在2715毫秒内看到完整页面。

在测量首屏时长的时候,为了看到长尾数据的影响,一般会采用分位值的方式,平均数会用来作为参考,毕竟平均数在样本量不够大的情况下,受极大、极小值的影响比较大(比如我和马云平均年薪几个亿)。


首屏性能指标细化


上面的数据中,我只是简单的统计了页面整体的首屏耗时。但其实页面加载是一个很复杂的过程。在加载过程中,哪些指标可能会影响到用户的体验呢?谷歌给出了以下的指标:


  • FP:首次绘制。用于标记导航之后浏览器在屏幕上渲染像素的时间点。这个不难理解,就是浏览器开始请求网页到网页首帧绘制的时间点。这个指标表明了网页请求是否成功。
  • FCP:首次内容绘制。FCP 标记的是浏览器渲染来自 DOM 第一位内容的时间点,该内容可能是文本、图像、SVG 甚至 <canvas> 元素。
  • FMP:首次有效绘制。这是一个很主观的指标。根据业务的不同,每一个网站的有效内容都是不相同的,有效内容就是网页中"主角元素"。对于视频网站而言,主角元素就是视频。对于搜索引擎而言,主角元素就是搜索框。
  • TTI:可交互时间。用于标记应用已进行视觉渲染并能可靠响应用户输入的时间点。应用可能会因为多种原因而无法响应用户输入:①页面组件运行所需的JavaScript尚未加载完成。②耗时较长的任务阻塞主线程

下面是参考文章中的一个例子,来直观表示上述的四种指标。

640.jpg


怎么测量FP、FCP、FMP、TTI的值

明确了上述的几个指标的含义后,下面介绍一下如何测量这几个指标的值。


FP和FCP

现代浏览器已经为我们提供了性能测试的api。直接上代码:


  • PerformanceObserver

在页面html代码顶部加入以下代码,订阅性能事件。


const observer = new PerformanceObserver((list) => {    for (const entry of list.getEntries()) {        const metricName = entry.name;        const time = Math.round(entry.startTime + entry.duration);        console.log(entry);        console.log(metricName + ' : ' + time);    }});observer.observe({entryTypes: ['paint']});


上述代码的输出如下:

640.jpg

  • performance

下面的代码也是可以的:


window.performance.getEntriesByType('paint');

640.jpg


FMP

FMP是一个十分主观的指标,需要开发者自己去测量。像文章一开始说的那样,我们可以在业务逻辑中判断页面加载、渲染完成时记录一个时间戳,然后和window.performance.timing.fetchStart相减,来得到FMP


TTI


TTI也是一个较为主观的指标。浏览器并没有为这个指标提供api。不过google提供了polyfill。下面是使用方法。

在页面html顶部加入:


!function(){if('PerformanceLongTaskTiming' in window){var g=window.__tti={e:[]};g.o=new PerformanceObserver(function(l){g.e=g.e.concat(l.getEntries())});g.o.observe({entryTypes:['longtask']})}}();


install这个polyfill,


npm install tti-polyfill


在业务代码中引用:


import ttiPolyfill from 'tti-polyfill';...
ttiPolyfill.getFirstConsistentlyInteractive().then((tti) => {    console.log('tti', tti);});...


getFirstConsistentlyInteractive() 方法接受可选的 startTime 配置选项,让您可以指定下限值(您知道您的应用在此之前无法进行交互)。默认情况下,该 polyfill 使用 DOMContentLoaded 作为开始时间,但通常情况下,使用主角元素呈现的时刻或您知道所有事件侦听器都已添加的时间点这类时间会更准确。


如何优化


如何优化首屏速度?一提到这个topic,我首先想到的就是一系列写代码、工程化时应注意的原则,以及以下几个点:


1、充分利用缓存。

2、资源懒加载。

3、http请求层面的优化,比如上http2。

4、如果是客户端内的页面,可以做预加载等。

5、SSR。

....

本文不会深入去讨论每一种方法具体应该怎么实施。在了解了文章中提到的几个关键性能指标后,可以针对页面加载的每一个阶段,进行深入的数据采集,分析和研究。在研究过程中,自然可以知道页面到底慢在哪里,不同的阶段使用不同的方法进行优化。回到文章的标题,当考虑网页首屏速度优化时,我们在考虑什么?其实就是在考虑通过一系列的方法,缩小网页的FP、FCP、FMP、TTI,以给用户提供良好的体验。


写在后面


本文根据谷歌的参考文章,对页面加载过程中的几个重要时间点进行了总结,明确、细化了首屏优化的方向和思路,符合预期。

相关文章
|
5月前
|
网络协议 Java 数据安全/隐私保护
吃透OSI七层模型:从底层逻辑到实战落地,一文打通网络通信任督二脉
本文从“底层逻辑拆解+权威标准解读+可落地实战示例”三个维度,用通俗的语言讲透OSI七层模型的每一个细节。所有内容均参考ISO/IEC 7498-1官方标准(OSI模型的权威定义),核心论点100%有据可依;实战示例基于Java语言实现,确保可直接编译运行;同时针对易混淆技术点进行明确区分,帮你真正做到“知其然,更知其所以然”。
2393 2
|
人工智能 自然语言处理 算法
经典大模型提示词工程技术路线概述
本文概述几种经典提示词工程方法,总结关键信息,分析其优势和局限,并分享笔者的一点思考。
1018 105
经典大模型提示词工程技术路线概述
|
9月前
|
域名解析 人工智能 机器人
AppFlow:企业微信支持流式群聊机器人
企业微信近日更新,新增群聊机器人功能,支持与自定义大模型对话。通过@机器人,可实现流式输出,提升交互效率。只需简单配置,即可将AI能力集成至群聊,完成即时消息解析与业务联动。
2595 1
AppFlow:企业微信支持流式群聊机器人
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
595 17
|
人工智能 安全 图形学
【AI落地应用实战】篡改检测技术前沿探索——从基于检测分割到大模型
在数字化洪流席卷全球的当下,视觉内容已成为信息交流与传播的核心媒介,然而,随着PS技术和AIGC技术的飞速发展,图像篡改给视觉内容安全带来了前所未有的挑战。 本文将探讨篡改检测技术的现实挑战,分享篡改检测技术前沿和最新应用成果。
自适应网站图片广告横幅代码(带广告标识)
自适应网站图片广告横幅代码(带广告标识)
326 1
|
存储 缓存 移动开发
别催更啦!手淘全链路性能优化下篇--容器极速之路
历时1年,上百万行代码!首次揭秘手淘全链路性能优化(上)我们重点介绍了手淘在性能优化中的一些实践和思路,主要集中在原生的代码的优化,这次,我们将继续分享在手淘容器化页面如 H5 及 Weex 相关的优化实践。
别催更啦!手淘全链路性能优化下篇--容器极速之路
|
存储
操作系统第五章_03 假脱机技术 (SPOOLing技术)
操作系统第五章_03 假脱机技术 (SPOOLing技术)
1606 0
操作系统第五章_03 假脱机技术 (SPOOLing技术)
|
存储 前端开发 JavaScript
|
Web App开发 JavaScript 前端开发
Web 页面性能衡量指标-以用户为中心的性能指标
Web 页面性能衡量指标-以用户为中心的性能指标 以用户为中心的性能指标是理解和改进站点体验的关键点 一、以用户为中心的性能指标 1. 指标是用来干啥的? 指标是用来衡量性能和用户体验的 2. 指标类型 • 感知加载速度:网页可以多快地加载网页中的所有视觉元素并将其渲染到屏幕上 • 加载响应速度:页面加载和执行组件快速响应用户互动所需的 JavaScript 代码的速度 • 运行时响应速度:网页在加载后对用户互动的响应速度 • 视觉稳定性:页面上的元素是否会以用户意想不到的方式发生偏移,是否可能会干扰用户的互动? • 流畅性:过渡和动画是否以一致的帧速率渲染,并在一种状态之间流畅地流动
831 1