redBus 如何改进其网站的 Interaction to Next Paint (INP) 并将销售额提高 7%

INP 优化帮助 redBus 提高了约 7% 的销售额

Amit Kumar
Amit Kumar
Saurabh Rajpal
Saurabh Rajpal

Web 及其功能正在快速发展。现在,您可以在 Web 上构建丰富且功能齐全的体验,在功能方面实现原生应用的大部分功能。

JavaScript 是 Web 上互动的主要推动力,但如果使用不当,互动可能会感觉缓慢,导致用户认为您的网站无响应或完全损坏。幸运的是,Interaction to Next Paint (INP) 指标就是为了解决这一特定用户体验问题而创建的。

INP 会衡量网页在其生命周期内发生的所有互动,并报告一个代表网站响应用户输入速度的单个值。简单来说,如果网页的 INP 达到或低于良好阈值,则可以说与该网页进行的所有互动都是快速可靠的。

redBus 是一家位于印度的巴士预订和票务网站,该公司付出了大量努力来提高其网站的 INP,即使在 INP 仍被视为实验性指标时也是如此。他们的努力取得了成效,销售额提高了 7%,这再次证明了网站性能与业务健康状况之间的关系。下面是 redBus 为提高其网站的 INP 所采取的措施。

主要目标

当 redBus 着手优化其网站的 INP 时,他们有三个目标:

  1. 无论网络速度和设备功能如何,都应着重于互动延迟时间,以便为用户提供更好的用户体验。
  2. 优化其网站,以尽可能加快互动速度。
  3. 确保其 API 的响应尽可能轻量,以确保快速将数据传输到前端。

历程

redBus 以两种方式对互动延迟时间进行了分类:

  1. 由于在客户端上屏蔽 JavaScript 而导致的互动延迟时间。如果互动使用过多的 JavaScript 而阻塞了主线程,则会延迟呈现,这会影响网页的 INP。
  2. API 调用导致的网络延迟时间。虽然 INP 不会衡量网络活动,但如果网络速度较慢或请求导致响应较大,依赖于对远程 API 的调用的互动可能会感觉缓慢。

redBus 最初非常自信,认为其网站的 INP 会很高,但 95 百分位数的实时用户监控 (RUM) 数据却表明情况并非如此。

redBus 如何衡量 INP

redBus 依赖 Google 构建的 web-vitals JavaScript 库,不仅跟踪 INP,还跟踪其网站上所有网页的所有重要用户体验指标。除了 web-vitals JavaScript 库之外,redBus 还使用 ELK 分析在前端收集的 INP 数据。

不过,您在实际操作中跟踪网站 INP 的方式可能与 redBus 解决此问题的方式大不相同。在开始优化互动之前,我们强烈建议您先了解如何在现场发现互动缓慢的问题,以便了解如何为您的网站最佳跟踪 INP,然后再了解如何在实验室中重现这些问题

在 redBus 建立了用于跟踪 INP 的系统后,他们能够分析数据,从而更好地了解互动缓慢的情况。

ELK 日志记录系统报告 INP 值以供分析的屏幕截图。
redBus 用于分析从现场收集的 INP 值的日志记录系统的屏幕截图。(点击可查看此图片的高分辨率版本。)

使用场景

用户在 redBus 网站上搜索票价时,可以更改搜索页上的日期,以过滤出目标目的地的所选票价。更改此页面上日期的互动速度缓慢,是导致 INP 较差的原因。

此外,当用户滚动浏览费率时,系统会从 API 延迟加载其他费率。虽然滚动本身不会计入 INP 衡量结果,但 scroll 事件监听器本身会调度许多必须在主线程上运行的工作。此工作会导致主线程上出现争用,从而增加互动延迟时间,导致搜索页上的 INP 较差。

用于在滚动时从 API 加载更多费率的延迟加载行为。(点击此处可观看分辨率更高的版本。)

redBus 如何针对搜索页面优化 INP

为了提高搜索页面的 INP,redBus 进行了多项优化:

  • scroll 事件处理程序已debounced,以减少事件回调在给定时间段内触发的次数。通过降低 scroll 事件回调的运行频率,主线程能够更快地响应搜索页面上的用户互动。
  • 系统使用 requestAnimationFrame 回调对生成的渲染工作进行了优先级排序。requestAnimationFrame 会告知浏览器,必须在下一帧之前完成回调中的工作。
Chrome DevTools 中性能面板的屏幕截图,显示 redBus 网站发出了未进行去抖动的滚动事件回调。结果是主线程会变为阻塞状态。
之前:滚动处理程序会在不对事件回调应用去抖动的情况下触发。主线程上存在大量阻塞任务,这会导致互动延迟。
Chrome DevTools 中“Performance”(性能)面板的屏幕截图,显示 redBus 网站触发了经过去抖处理的滚动事件回调。结果是,由于滚动事件处理脚本的触发频率要低得多,主线程的阻塞程度也降低了。
后:应用了去抖动功能后,滚动处理程序会触发。滚动事件回调的触发频率会降低,从而让主线程有更多机会响应用户互动。

此外,我们还对搜索结果页进行了以下进一步优化:

  • 在搜索结果页上的倒数第二张卡片上提取了新批次的结果,以便通过更早触发延迟加载来改善用户体验和视觉效果。
  • 在延迟加载期间,每次网络调用提取的结果更少。将提取结果从 30 个减少到 10 个后,INP 范围从 870 到 900 减少到 350 到 370。
用于在滚动时从 API 加载其他费率的延迟加载行为。(点击此处可观看分辨率更高的版本。)

虽然这些更改显著提高了搜索页的 INP,但搜索页输入字段上的 change 事件仍会调用开销较高的 reducer 函数来更新界面。这导致界面不必要地重新呈现,进而影响了网页的 INP。

当用户在输入字段中输入内容时,控制台中报告的 INP 值。实验室设置中观察到的最终 INP 值为 344,属于“需要改进”阈值范围内。(点击此处可观看分辨率更高的版本。)

为了优化这种互动,redBus 在本地管理输入组件的状态,并且仅在输入的 blur 事件触发时将其与 Redux 存储区同步。这项更改通过减少调用 reducer 的频率,减少了重新渲染的次数,并消除了界面不必要的重新渲染。

减少了在输入字段发生更改时调用 reducer 的频率,从而改进了 INP。(点击此处可观看分辨率更高的版本。)

经过这项更改,该网页的 INP 提高了 72%,用户体验更快速、更流畅,因而更有可能与之互动。

业务影响

商家健康状况与网页效果之间的关系众所周知。与其他 Core Web Vitals 指标相比,INP 是一项相对较新的指标,但 redBus 通过专注于改进这项以用户为中心的重要性能指标,取得了更好的业务成效。结果是,总销售额提高了 7%。

简而言之,INP 有助于全面了解 redBus 网站上的运行时性能问题。知道需要改进后,redBus 能够观察问题、重现问题,并利用这些重要信息进行优化,从而对 redBus 及其业务有益。