首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你的网页有多快 — 从 DOMReady 到 Element Timing

你的网页有多快 — 从 DOMReady 到 Element Timing

作者头像
ConardLi
发布于 2022-04-08 07:13:46
发布于 2022-04-08 07:13:46
1.2K00
代码可运行
举报
文章被收录于专栏:code秘密花园code秘密花园
运行总次数:0
代码可运行

「一些废话」

总所周知,写文章需要一个标题。虽然我们搞代码的人一般都喜欢单刀直入,但是受制于文体的约束和发表载体的要求,有时不得不想一个标题。而起一个标题,不亚于起一个函数名或者变量名。单就这篇文章,我就有好几个草稿标题,例如:《页面加载指标演进之路》,《Element Timing:一种全新的页面速度指标》,《如何最准确地测量网页加载速度》,《新前端下的页面加载速度》,甚至《Element Timing In Action》,《三分钟学会测量页面速度》。最后综合考虑了读者的承受能力,编辑的意见,以及最最重要的:本人的孱弱写作实力,就取了个这样的一个非常大众化,既不会一眼就被当成垃圾,也不会被人挑出来仔细找茬的标题。

好了,废话不能多说,直接进入正题。

「DOMReady」

上古时期(指距今 10+ 年前的 jQuery 纪元),我们开发网页还停留在编写静态页面结构,用 JS 脚本对 DOM 进行直接操作,添加删除一些额外页面元素上。此时,DOMReady 基本就可以满足计算页面加载完成时间的需求,DOMReady (在 DOM 事件中是 DOMContentLoaded)代表页面文档完全加载并解析完毕, 一般包含HTML文档分析以及DOM树的创建、外链脚本的加载、外链脚本的执行以及内联脚本的执行,而不会等待样式文件,图片文件,子框架页面的加载。一般在页面 header 中打个时间戳,再在 jQuery 的 domReady 事件中打个时间戳,我们就可以计算到大致的 DOMReady 耗时了。

「Navigation Timing」

中古时期(指距今 10-5 年左右的 Ajax 纪元),网页的交互形式更加丰富多样,Gmail 为首的富网页应用在用户体验大幅增强的同时,也给细粒度的网页加载时间记录带来了需求。因此,从2010年开始Web 性能工作组就已经为 Web 引入了大量时间信息记录,可以通过 window 对象的 performance 属性去获取。这就是后来我们所熟知的 Navigation Timing。

Navigation Timing 接口所提供的数据大致如图:

基本上囊括了从网页开始网络请求到页面完整加载并执行完资源并完成初始化 DOM 节点的时间。我们直接使用 performance.timing,就可以轻松获得这些时间来帮助分析页面的加载时间。

「FP, FCP 和 LCP」

近古时期(指距今 5-2 年左右的 React 纪元),由于各种前端框架(React,Vue 等)雨后春笋似的涌出,加上 Webpack 这种前端构建神器的出现,导致 Web 页面的开发难度迅速下降,复杂度也直线上升。重前端的应用大行其道,页面加载脚本的时间也迅速变长,很多网站为了体验采取了渐进式加载的策略,以解决等待脚本执行时白屏时间过长的问题。因此,渐进式网页渲染指标也应运而生。

渐进式网页指标一般有这几个:

  • 首次绘制(FP):全称 First Paint,标记浏览器渲染任何在视觉上不同于导航前屏幕内容之内容的时间点
  • 首次内容绘制(FCP):全称 First Contentful Paint,标记的是浏览器渲染来自 DOM 第一位内容的时间点,该内容可能是文本、图像、SVG 甚至 <canvas> 元素。
  • 首次有效绘制(FMP):全称 First Meaningful Paint,标记的是页面主要内容绘制的时间点,例如视频应用的视频组件、天气应用的天气信息、新闻应用中的新闻条目。
  • 最大内容绘制(LCP):全称 Largest Contentful Paint,标记在可视区“内容”最大的可见元素开始绘制在屏幕上的时间点。

其中 FMP 因为依赖算法猜测有效元素,所以目前已经基本被弃用。这几个指标的可视化意义可以参考以下两张图:

由于复杂页面的元素往往很多,FCP 所观测的元素可能只是 「无足轻重」 的一个 Loading 标记或者一个边栏,因此对于真实的用户来说,并不能代表页面的“首屏时间”。反而,在某些逻辑复杂的页面中,由于 JS 代码的执行时间长,或者依赖很多后端接口来渲染页面,经常会导致页面最重要的数据展示的时间远远长于页面 OnLoadEvent 触发的时间,此时,对于用户来说最直观感觉的到的“首屏时间”,往往就是 LCP 的时间。

这就是现在很多前端页面性能工具都会把 LCP 列入一个重要的参考指标的原因。

「Element Timing」

现代时期(指距今 1-0 年左右的微前端纪元),LCP 的计算逻辑是浏览器给定的,在不同页面中,浏览器所认为的 「最大的可见元素」 也未必是我们业务中 「真正重要的」 内容。并且在微前端流行的现代,不仅仅是同一应用的不同页面采用单页模式,甚至不同子应用的加载也可能通过 「hash」 路由来驱动。对于这种单页应用来说,以上的各个指标其实都无法满足在主体框架加载完成后切换不同页面时的重新计算。那么我们是不是只能够完全依赖业务开发本身去在代码里主动打点和上报加载时间呢?那也未必。

让我们来看看 W3C 的一个新草案,元素计时 API :https://wicg.github.io/element-timing/ 。尽管这个 API 还处于草案阶段,但是 「Chrome」「Edge」 两个浏览器其实早已在新版本给予了支持:兼容性

Element Timing API 的目的是让 Web 开发人员或分析工具能够测量页面上关键元素的渲染时间,比起 LCP ,我们能够自己来定义关键元素,这正是Element Timing 的最大魅力。Element Timing 支持的元素有:

  • <img> 元素
  • <svg> 中的 <img> 元素
  • <video> 中的 poster image
  • 拥有 background-image 的元素
  • 一组文本节点

举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<img src="image.jpg" elementtiming="big-image">
<p elementtiming="text" id="text-id">text here</p>
const observer = new PerformanceObserver((list) => {
  let entries = list.getEntries().forEach(function (entry) {
      console.log(entry); 
  });
});
observer.observe({ entryTypes: ["element"] });


// 输出 entry 内容:
// {
//   duration: 0
//   element: p.aimake-site-name
//   entryType: "element"
//   id: ""
//   identifier: "text-id"
//   intersectionRect: DOMRectReadOnly {x: 236, y: 130, width: 144, height: 28, top: 130, …}
//   loadTime: 0
//   name: "text-paint"
//   naturalHeight: 0
//   naturalWidth: 0
//   renderTime: 10850.899999976158
//   startTime: 10850.899999976158
//   url: ""
// }

但是需要注意的是,并不是所有文本节点都可以通过添加 elementtiming="" 让 Element Timing API 识别,WICG 的解释中有一段注意事项:

We say that a text node 「belongs to」 the closest block-level Element ancestor of the node. This means that an element could have 0 or many associated text nodes with it. We say that an element is text-painted if at least one text node belongs to and has been painted at least once. Thus, the 「text rendering timestamp」 of an element is the time when it becomes text-painted. Let the text rect of a text node be the display rectangle of that node within the viewport. We define the 「text rect」 of an element as the smallest rectangle which contains the geometric union of the text rects of all text nodes which belong to the element.

读起来比较难懂,但是实际上它想说明的是,只有满足以下条件的文本节点才能够被记录:

  • 「必须是块级元素」:如 <p><h1><div><section> 等,也就是说,单独的 <span> 元素等行内元素,即时添加了 elementtiming="" 属性也并不会被记录。
  • 「直接子节点必须包含一个或多个文本节点」:例如 纯文本,<span><i><b> 等,<p> 等块级元素则不算,<img> 这种图像也不算。

举一些例子就懂了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
  <p elementtiming = "p1"><p>1</p></p> <!-- 无效 -->
  <p elementtiming = "p2">2</p> <!-- 有效 -->
  <span elementtiming = "span1">span1</span> <!-- 无效 -->
  <div elementtiming = "div1"><image elementtiming = "img1" src="https://img.alicdn.com/tfs/ConardLi.png"></image></div> <!-- div1 无效,其中的 img1 有效 --> 
  <div elementtiming = "div2"><span>1</span></div> <!-- 有效 -->
  <div elementtiming = "div3"><p>2</p></div> <!-- 无效 -->
  <div elementtiming = "div4"><h1>3</h1></div> <!-- 无效 -->
  <div elementtiming = "div5"><b>4</b></div> <!-- 有效 -->
  <b elementtiming = "b1">b1</b> <!-- 无效 -->
  <i elementtiming = "i1">i1</i> <!-- 无效 -->
  <h1 elementtiming = "h1">h1</h1> <!-- 有效 -->
  <section elementtiming = "section1">section1</section> <!-- 有效 -->
</html>

在添加了自定义 elementtiming 属性后,当所标记的图像或者文本节点被 「真正渲染」 时,浏览器就会记录下时间。因此,我们可以在不同应用中让开发同学直接给能够标志 「首屏」 的元素添加该属性,即可由采集脚本通过监听 PerformanceObserver 来统一采集到元素绘制的时间点(renderTime)了。

通过使用 Element Timing API ,我们能够更精确记录到每个应用,页面,甚至功能模块的加载时长。这才是最现代,最前沿的页面加载时间方案,其余方案最终都将被埋葬在历史的尘埃中!开个玩笑

「另一些废话」

江山代有才人出,各领风骚数百年

一般来说,结尾并没有标题那么重要,因此我也不需要费脑子去想 N 个结尾了,直接简单总结一下:无论前端发展到什么程度,Timing 的标准总会追上你!

希望如果有读者大神如果受到了一点点启发,能够给写个包含 Element Timing 指标的性能库造福我们。毕竟我就是懒,以上都是我自己 YY 的用法。在此先提前感谢了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 code秘密花园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
目前为止整理最全的前端监控体系搭建篇(长文预警)
PV(page view) 是页面浏览量,UV(Unique visitor)用户访问量。PV 只要访问一次页面就算一次,UV 同一天内多次访问只算一次。
前端达人
2022/04/18
13.6K1
目前为止整理最全的前端监控体系搭建篇(长文预警)
前端页面加载性能指标之LCP
之前已经介绍过 FCP,可以点击查阅前端页面加载性能指标之 FCP。本文介绍与之相对应的 LCP。通过上文得知,FCP 衡量的是页面首次渲染出有意义的内容的时间点,这通常包括文本、图像、非白色画布或 SVG 的渲染,可以让用户感知到网页正在加载。那么 LCP 又是什么?
用户8171976
2024/11/29
7130
超全对照!前端监控的性能指标与数据采集
导语 | 前端监控可以让你更了解自己的网站,更早地发现和解决存在的问题,再通过优化来提升网站的性能和体验。那么,如何衡量一个网站的好坏?有什么指标?性能数据如何采集?本文围绕这些问题和你一起探讨。 一、为什么要做前端性能监控 可能你也有过这样的经历: 有用户反馈你的网站很慢,然后你立马紧张地在浏览器上打开用户反馈的网站。经过检查,可能你的网站一切正常,也可能你的网站真的很慢,甚至打不开了。 有一天老板问你:“咱们的网站性能体验怎么样?”你该如何回答?“挺好的,很快,这个月没有发生过故障....”老板再
腾讯云开发者
2021/06/02
4.4K0
面试必问——前端页面性能指标基本介绍
导语 | 面试的时候问页面性能有哪些指标,却经常得到合并文件、压缩资源等优化手段的答案,是时候整体盘一下“性能指标”了。 1. 基本指标介绍 首先前端性能指标一般分为以下几种: 首屏绘制(First Paint,FP) 首屏内容绘制(First Contentful Paint,FCP) 可交互时间(Time to Interactive,TTI) 最大内容绘制(Largest Contentful Paint,LCP) 首次有效绘制(First Meaning Paint, FMP) FP 是时间线上的第
用户1097444
2022/06/29
3.8K0
面试必问——前端页面性能指标基本介绍
从 8 秒到 1 秒:前端性能优化的 12 个关键操作
在现代 Web 应用中,页面首次加载性能(FP、FCP、LCP)对用户体验和转化率影响巨大。假设我们起初页面加载时间长达 8 秒,跳出率高、用户流失严重。通过本文所述 12 个关键操作,实际将页面优化至约 1 秒的加载时长。
大熊计算机
2025/07/14
2020
前端页面性能及其分析工具
本文结合谷歌官方工具 Lighthouse,分析了最新的前端页面性能评分标准,帮助大家更好地理解各项性能指标,以提升并优化相关的前端项目。
前端迷
2021/01/29
3.3K0
新时代的 Google Web Vitals 性能指标
传统的性能指标如 load time[1] 或 DOMContentLoaded[2] 专注于容易衡量的技术细节,但是它们很难反应出用户所真正关心的是什么。如果你仅仅是把加载速度优化的更快,你很快就会发现网站的用户体验依然很差。一个站点的总加载时间可以很快,但如果它直到所有内容都准备好了才渲染的话,用户只能盯着空白的屏幕一段时间。如果点击了按钮但没有反应,是因为主线程被 JavaScript 任务占满而阻塞了,此时虽然页面已经“加载”,但用户依然会感到沮丧。
前端迷
2021/11/12
1.7K0
前端性能优化--数据指标体系
常常进行前端性能优化的小伙伴们会发现,实际开发中性能优化总是阶段性的:页面加载很慢/卡顿 -> 性能优化 -> 堆叠需求 -> 加载慢/卡顿 -> 性能优化。
被删
2024/05/15
4980
前端性能优化--数据指标体系
前端监控 SDK 的一些技术要点原理分析
本文要讲的就是其中的第一个环节——数据采集与上报。下图是本文要讲述内容的大纲,大家可以先大致了解一下:
谭光志
2022/03/24
2.5K0
前端监控 SDK 的一些技术要点原理分析
基于 RUM 的前端优化理论与实践 - 性能篇(一)
作者:李振,腾讯云前端性能监控负责人 前言 对于前端来说,最重要的是体验,而在前端体验中,最为核心的就是性能。 相信大多数用户接入前端性能监控(RUM)都是为了通过 RUM 质量评价体系来验证前端性能和质量如何,而直接影响性能和质量的则是一系列的指标,因此了解页面性能指标显得格外重要! 前端性能监控 RUM 是腾讯云的大前端领域页面质量和性能监控平台,聚焦提升用户体验。了解详情 通俗点说,某用户想了解页面访问速度快,是否快,究竟有多快?怎么衡量?需要一个中立的裁判来裁决,而 RUM 的角色正是这个裁
腾讯云可观测平台
2021/09/10
9900
【总结】2072- 前端常见性能优化策略
采用域名分片技术,将资源放到不同的域名下。接触同一个域名最多处理6个TCP链接问题。
pingan8787
2024/06/19
2620
【总结】2072- 前端常见性能优化策略
vue项目你一定会用到的性能优化!
而本渣最近维护的项目恰巧在这个方向下了很大功夫,一些经验之谈奉上,希望对大家有些许帮助!
用户7413032
2022/04/24
1.4K0
vue项目你一定会用到的性能优化!
聊一聊H5营销页面的性能优化
我来自机票BU,目前负责机票营销的业务开发,众所周知营销业务的普遍特点是:访问量很大。每次营销活动,对于不同角色的同学,关注的点也不一样。
前端森林
2022/12/10
1.2K0
聊一聊H5营销页面的性能优化
Web 性能优化-首屏和白屏时间
白屏时间是指浏览器从响应用户输入网址地址,到浏览器开始显示内容的时间。 首屏时间是指浏览器从响应用户输入网络地址,到首屏内容渲染完成的时间。
李振
2021/11/26
3.1K0
Web 性能优化-首屏和白屏时间
干货 | 提升50分,Trip.com 机票基于 PageSpeed 的前端性能优化实践
作者简介 Patrick,携程资深前端开发工程师,专注于前端工程化和性能优化。 前言 网站性能对于用户体验、转化率和流失率、SEO 排名等至关重要,Trip.com 主要用户来自海外,对网站访问性能有更高的要求。能够快速响应的网站通常有机会获取更多流量,并为用户带来更好的体验。 近期我们对 Trip.com 机票站点做了一版性能优化,通过对主要 landing 页面进行系统优化,将页面的 PageSpeed 评分从原本 30 左右提升到 80 分以上。 这里分享在优化过程中的一些经验,将从性能指标、性能测
携程技术
2022/03/04
8180
Performance API不完全使用指北
使用浏览器的DevTools来评估web应用性能是很有用的,但要复现现实世界的使用情况并不容易。因为人们在不同地点使用不同的设备、浏览器和网络,都会有不同的体验。
chuckQu
2023/02/13
1.2K0
Performance API不完全使用指北
前端页面性能指标与采集方式
目前业界常用的指标就是:白屏、首屏、domready和pageloaded四个指标,在usual-index.html中, 我们通过performance API获取到响应的指标值。
用户1217459
2019/07/10
2.4K0
前端页面性能指标与采集方式
用户体验角度来看前端性能监控
继续寻找标准,不过很可惜,从 performance timing 没有找到,那么我们将目光转向业界来看一下:
皮小蛋
2021/05/06
1.4K0
用户体验角度来看前端性能监控
Sentry Web 性能监控 - Web Vitals
Web Vitals 是谷歌定义的一组度量指标,用于度量渲染时间(render time)、响应时间(response time)和布局偏移(layout shift)。每个数据点都提供了关于应用程序总体性能的见解。
为少
2021/09/17
2.9K0
页面性能优化的利器 — Timeline
本文介绍了如何定位和分析Web性能问题中的重绘(Repaint)问题,通过介绍和实例分析,提供了在Timeline中查看和定位重绘问题的方法,以及通过Paint Profiler分析绘制细节,从而优化页面性能。
陈泽钦
2017/04/12
7K3
页面性能优化的利器 — Timeline
推荐阅读
相关推荐
目前为止整理最全的前端监控体系搭建篇(长文预警)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档