Mercado Libre 如何针对网页指标进行优化 (TBT/FID)

优化商品详情页面的互动性,以便将 Lighthouse 中的最大潜在 FID 降低 90%,并将 Chrome 用户体验报告中的 FID 降低 9%。

Carlos Aranha
Carlos Aranha
Demián Renzulli
Demián Renzulli
Joan Baca
Joan Baca

Mercado Libre 是拉丁美洲最大的电子商务和支付生态系统。它覆盖 18 个国家/地区,在巴西、墨西哥和阿根廷(根据唯一身份访问者和网页浏览量判断)是市场领导者。

很长时间以来,网站性能一直是该公司的关注重点,但最近他们组建了一支团队来监控性能,并在网站的不同部分应用优化措施。

本文总结了 Mercado Libre 前端架构团队的 Guille PazPablo CarminattiOleh Burkhay 为优化核心网页指标之一 - First Input Delay (FID) 及其实验室代理 Total Blocking Time (TBT) 所完成的工作。

90%

Lighthouse 最高潜在 FID 降幅

9%

在 CrUX 中,将 FID 视为“快速”的用户增多

耗时较长的任务、First Input Delay 和 Total Blocking Time

运行成本高昂的 JavaScript 代码可能会导致长时间运行的任务,即在浏览器的主线程中运行超过 50 毫秒的任务。

FID(First Input Delay)用于衡量从用户首次与网页互动(例如,点击某个链接)到浏览器实际能够开始处理事件处理脚本以响应此次互动之间的时间。执行成本高昂的 JavaScript 代码的网站很可能会有多项耗时较长的任务,最终会对 FID 产生负面影响。

为了提供良好的用户体验,网站应努力将 First Input Delay 控制在 100 毫秒以内: 良好保真值为 2.5 秒,差值大于 4.0 秒,介于两者之间的任何值都需要改进

虽然 Mercado Libre 的网站在大多数版块中都表现良好,但他们在 Chrome 用户体验报告中发现商品详情页面的 FID 不佳。根据这些信息,他们决定将工作重点放在改善网站中商品页面的交互性上。

Mercado Libre 商品详情页面的移动版和桌面版。
Mercado Libre 商品详情页面的移动版和桌面版。

这类页面允许用户执行复杂的互动,因此其目标是实现互动优化,而不会干扰有价值的功能。

衡量商品详情页面的互动性

FID 需要真实用户,因此无法在实验室中衡量。但是,Total Blocking Time (TBT) 指标可由实验室衡量得出,与实际应用的 FID 非常相关,并且还能捕获影响互动的问题。

例如,在以下跟踪记录中,虽然在主线程上运行任务所花费的总时间是 560 毫秒,但只有 345 毫秒的时间被视为总阻塞时间(每个任务中超过 50 毫秒的部分的总和):

主线程上的任务时间轴,显示了阻塞时间

在实验室中,Mercado Libre 将 TBT 作为替代指标,用于衡量和改进商品详情页面在现实世界中的互动性。

以下是他们采取的常规方法:

使用 WebPageTest 直观呈现较长的任务

WebPageTest (WPT) 是一种 Web 性能工具,可让您在全球不同位置的真实设备上运行测试。

Mercado Libre 使用 WPT 选择与真实用户类似的设备类型和位置,以重现用户的体验。具体来说,他们选择了 Moto 4G 设备弗吉尼亚州杜勒斯,因为他们想要大致估算墨西哥 Mercado Libre 用户的体验。通过观察 WPT 的主线程视图,Mercado Libre 发现有几个连续的长任务阻塞主线程 2 秒:

Mercado Libre 的商品详情页面的主线程视图。
Mercado Libre 的商品详情页面的主线程视图。

在分析相应的广告瀑布流后,他们发现这两秒中有相当一部分来自于其分析模块。该应用的主软件包较大 (950KB),需要很长时间来解析、编译和执行。

商品详情页面的瀑布视图。
Mercado Libre 的商品详情页面的瀑布视图。

使用 Lighthouse 确定最大潜在 FID

Lighthouse 不允许您在不同的设备和位置之间进行选择,但它是一款非常实用的工具,可用于诊断网站并获得性能建议。

在商品详情页面上运行 Lighthouse 时,Mercado Libre 发现最大潜在 FID 是唯一标记为红色的指标,值为 1710ms

Mercado Libre 商品详情页面的 PSI 报告中的 Lighthouse 指标。

基于这一假设,Mercado Libre 设定了一个目标,即在 Lighthouse 和 WebPageTest 等实验室工具中提高其最大潜在 FID 得分,并假设这些改进会影响其真实用户,因此会出现在 Chrome 用户体验报告等真实用户监控工具中。

优化耗时较长的任务

首次迭代

根据主线程轨迹,Mercado Libre 设定了优化两个运行昂贵代码的模块的目标。

他们开始优化内部跟踪模块的效果。此模块包含一项占用大量 CPU 的任务,而该任务对模块正常工作并不重要,因此可以安全移除。此举使整个网站的 JavaScript 数量减少了 2%。

之后,他们开始着手改善软件包的总体大小

Mercado Libre 使用 webpack-bundle-analyzer 来检测优化机会:

他们还应用了以下 Babel 优化:

通过这些优化,软件包大小缩减了约 16%

衡量影响

这些变更将 Mercado Libre 的连续长时间任务从两秒缩短为一秒

经过第一轮优化后 Mercado Libre 的商品详情页面的主线程视图。
在 WPT 的顶部瀑布流中,第 3 秒到第 5 秒之间有一个红色长条(在网页是交互式行中)。在底部瀑布图中,该栏已拆分为较小的片段,在主线程上占用的时间更短。

Lighthouse 的潜在 First Input Delay 上限减少了 57%

经过第一轮优化后,Mercado Libre 商品详情页面的 PSI 报告中的 Lighthouse 指标。

第二次迭代

该团队继续深入研究耗时较长的任务,以寻找后续改进。

显示经过第一轮优化后 Mercado Libre 商品详情页面的主线程视图详细视图。
广告瀑布流(图中未显示)帮助 Mercado Libre 确定哪些库在大量使用主线程(浏览器主线程行),而页面是交互式行则清楚地表明此主线程活动阻止了互动。

根据这些信息,他们决定实施以下更改:

  • 继续缩减主软件包的大小,以优化编译和解析时间(例如,移除不同模块中的重复依赖项)。
  • 在组件级别应用代码拆分,将 JavaScript 拆分为较小的块,并允许更智能地加载不同组件。
  • 推迟组件水合,以便以更智能的方式使用主线程。这种方法通常称为“部分水合”

衡量影响

生成的 WebPageTest 跟踪记录显示了更小的 JS 执行块:

经过两轮优化后的 Mercado Libre 商品详情页面的主线程视图。

此外,Lighthouse 的最大潜在 FID 时间又减少了 60%

经过第一轮优化后,Mercado Libre 商品详情页面的 PSI 报告中的 Lighthouse 指标。

直观呈现真实用户的进度

虽然 WebPageTest 和 Lighthouse 等实验室测试工具非常适合在开发期间对解决方案进行迭代,但真正的目标是改善真实用户的体验。

Chrome 用户体验报告提供了用户体验指标,以便反映实际 Chrome 用户在网络上对热门目的地的体验。您可以通过在 BigQuery 中运行查询PageSpeedInsightsCrUX API 来获取报告中的数据。

CrUX 信息中心是直观呈现核心指标进度的一种简单方式:

.
Mercado Libre 在 2020 年 1 月至 2020 年 4 月期间的 FID 进度。在优化项目之前,82% 的用户认为 FID 较快(低于 100 毫秒)。之后,超过 91% 的用户认为该指标的速度很快。

后续步骤

网页性能从来都不是完成的任务,Mercado Libre 了解这些优化可为其用户带来的价值。在继续在整个网站上应用多项优化(包括在商品详情页面进行预提取、图片优化等)的同时,他们继续对商品详情页面进行改进,以缩短总阻止时间 (TBT) 和代理 FID 等等。这些优化包括:

  • 迭代代码拆分解决方案。
  • 改进第三方脚本的执行方式。
  • 继续改进捆绑器级别的资源捆绑功能 (webpack)。

Mercado Libre 能够全面了解性能,因此在继续优化网站的互动性的同时,他们也开始评估当前核心网页指标(即 LCP (Largest Contentful Paint)CLS (Cumulative Layout Shift))的改进机会。