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

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

写在前面


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

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,以给用户提供良好的体验。


写在后面


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

相关文章
|
2月前
|
缓存 监控 前端开发
SPA 首屏加载速度优化
【10月更文挑战第14天】解决 SPA 首屏加载速度慢的问题需要综合运用多种优化策略和技术。通过资源压缩、减少异步请求、优化渲染流程、利用缓存、代码分割、预加载等方法,可以有效提高 SPA 首屏加载速度,为用户提供更好的体验。同时,性能监控和分析是持续优化的关键,应根据实际情况不断调整优化策略。在未来,随着技术的不断发展,我们还需要不断探索新的优化方法和途径,以适应不断变化的需求。
|
7月前
|
缓存 前端开发 JavaScript
|
6月前
|
缓存 前端开发 UED
前端优化:首屏加载速度的实践
随着互联网技术的飞速发展,前端网页逐渐取代了传统客户端成为用户获取信息、进行交互的重要渠道,但是网页也有常见的弊端,比如网页首屏加载速度的快慢直接影响着用户体验,那么如何提升网页的首屏加载速度,成为了前端开发者必须面对的问题。本文将从多图片懒加载、避免用户多次点击请求以及骨架屏原理等方面,简单分享一下前端优化首屏加载速度的策略优化。欢迎大家在评论区留言交流。
92 2
前端优化:首屏加载速度的实践
|
5月前
|
缓存 前端开发 JavaScript
如何减少页面加载时间
如何减少页面加载时间
57 1
|
域名解析 缓存 JavaScript
导致页面加载白屏时间长的原因有哪些,怎么进行优化?
导致页面加载白屏时间长的原因有哪些,怎么进行优化?
352 0
|
JavaScript Go
埋点统计优化,首屏加载速度提升
埋点统计在我们业务里经常有遇到,或者很普遍的,我们自己网站也会加入第三方统计,我们会看到动态加载方式去加载jsdk,也就是你常常看到的insertBefore操作,我们很少考虑到为什么这么做,直接同步加载不行吗?统计代码会影响业务首屏加载吗?同步引入方式,当然会,我的业务代码还没加载,首屏就加载一大段统计的jsdk,在移动端页面打开要求比较高的苛刻条件下,首屏优化,你可以在埋点统计上做些优化,那么页面加载会有一个很大的提升
182 0
埋点统计优化,首屏加载速度提升
|
缓存 移动开发 前端开发
网页首屏性能优化总结
网页首屏性能优化总结
396 0
网页首屏性能优化总结
|
移动开发 缓存 前端开发
客户端内H5页面的首屏性能优化
客户端内H5页面的首屏性能优化
508 0
客户端内H5页面的首屏性能优化
|
缓存 JavaScript 前端开发
页面首屏渲染性能指南
我们知道渲染页面是一个将服务器的响应内容翻译成图片的过程。但是,如果你页面的渲染性能比较糟糕的话,可能会带来相对较高的跳出率。
241 0
页面首屏渲染性能指南
|
Web App开发 JavaScript 前端开发
我优化了进度条,页面性能竟提高了70%
大家好,我是零一。最近我准备在组里进行代码串讲,所以我梳理了下项目之前的业务代码。在梳理的过程中,我看到了有个进度条组件写的非常好,这又想起我刚开始学前端时写的进度条的代码,跟这个比起来真的差距太大了(大部分的初学者应该都想不到,而且我第一次实习的公司带我的mentor亦是如此)。 因此,我想给大家分享一下这个思路极好的进度条组件,同时它也存在非常严重的性能问题,本文末尾也会讲解一下问题所在以及优化方式
292 0
我优化了进度条,页面性能竟提高了70%

热门文章

最新文章