跳转到文章
Performance2026年10月20日阅读约 2 分钟

为什么网站在点击后变慢:INP、JavaScript 和消息队列

通过 INP、JavaScript 负载和 Worker 消息队列排查点击与输入延迟,介绍使用 Milten INP Scanner 和 JS Scanner 的诊断步骤。

按钮交互以及主线程与 Worker 之间传递的发光消息

筛选条件迟迟不生效、菜单不能立即打开,或输入的文字延后显示,即使页面加载很快,也可能出现这些问题。应检查操作后的响应和 JavaScript 处理。对于使用 Worker 或 iframe 的应用,还要分析消息交换。

为什么快速网站对操作的响应可能很慢

单击后,浏览器需要处理该事件,执行 JavaScript 并显示更新后的帧。如果主线程繁忙,则有些工作会等待。因此,良好的加载速度并不能保证菜单、过滤器和表单的快速响应。

将计算移到 Web Worker 可以减轻主线程的负担,但也增加了数据交换。页面窗口、Worker 和 iframe 通过 postMessage() 交换消息。消息发送后,也可能需要排队等待处理。

消息队列发生延迟的地方

从三个可能的原因开始:

  • 接收器正在执行长时间运行的同步任务。当线程空闲时,将处理新消息。
  • 消息太多。如果工作到达的速度快于处理的速度,即使是执行时间较短的处理程序也会创建一个队列。
  • 传输大量数据。发送方的序列化和接收方的反序列化需要各自线程上的时间。

例如,用户每输入一个字母,搜索就向 Worker 发送一次请求。如果上一轮搜索结果尚未算完,后续请求便会积累。用户已经完成输入,应用却仍在计算旧输入的结果。应测量消息频率、处理时间和传输量。

INP 如何测量页面响应

INP(Interaction to Next Paint)评估访问期间页面对点击、触摸和键盘输入的响应能力。按照异常值排除规则,结果反映较慢交互中的一次。单次交互延迟包括等待处理开始、执行事件处理程序,以及等待下一帧显示的时间。

良好的 INP 为 200 毫秒及以下;超过 200 毫秒、但不超过 500 毫秒时需要改进;超过 500 毫秒则较差。评估网站时,应分别查看移动设备与桌面设备上,各次访问 INP 的第 75 百分位数。

当消息队列的处理占用主线程并干扰输入或渲染时,消息队列可能会导致这种延迟。但Worker响应时间不能自动被视为INP。

让我们回到搜索:输入的字母可能会立即出现,稍后会更新结果。尽管有用的工作尚未完成,但下一帧已经显示。在这种情况下,请分别测量对输入的响应和获得实际结果的时间。快速加载指示器并不能证明搜索本身变得更快。

Milten中的INP检查和JavaScript分析

INP检查 有助于调查测试运行中的交互延迟。选择存在问题操作的页面:菜单、目录、表单或购物车。在报告中,检查哪些交互已完成以及发现了哪些延迟原因。结论适用于本次运行及其条件。

JS Scanner 分析 Chromium 中单次页面加载时的 JavaScript,不执行点击或滚动。报告展示脚本大小与加载、代码执行、长任务、错误,以及主机名不同的脚本。网站提供可用的源码映射时,还能查看打包文件内部的模块。

比较报告以选择要检查的区域。 JS Scanner 中的重文件可能可以解释启动页面时的负载,但它的存在尚不能证明点击缓慢的原因。加载后的行为需要单独重现。这两种工具都可以帮助您缩小搜索范围;它们不提供所有窗口和Worker之间的每条消息的跟踪。

单击后或在其他页面状态下可能需要加载期间未执行的代码。删除前请检查这些脚本。具有不同主机名的脚本也不一定是多余的:项目自己的 CDN 可以属于这一组。

如何查找 INP 不良的原因

  1. 记录复现步骤。指定页面、设备和界面状态。例如:打开目录,快速输入查询,然后选择过滤器。
  2. 如果存在 RUM 或 CrUX,请使用真实访问数据选择最明显的问题。实验室运行并不能取代真实访问的统计数据。
  3. 运行 INP 检查并将报告覆盖范围与有问题的活动进行匹配。如果还没有重现,请在浏览器中单独检查。
  4. 探索通过 JS Scanner 加载 JavaScript。选择可疑文件和可能与延迟重叠的长任务。
  5. 在 DevTools 中记录有问题的场景。对于 Worker 或 iframe,跟踪正在发送的消息、已启动的处理、响应和屏幕刷新。请求 ID 将有助于区分对旧输入的响应和当前输入的响应。
  6. 修复后,使用相同的设备、CPU 和网络设置重复相同的步骤。比较多次运行,然后检查累积的真实访问数据。

改变什么来优化 INP

INP优化 首先减少延迟下一帧的工作。减少同步处理程序,分解长任务,并让浏览器在不必要的计算之前呈现反馈。

对于使用 Worker 的应用,先确认发送的工作是否都有必要。搜索可以合并频繁更新,并忽略过时结果。防抖间隔应根据界面行为设置:间隔过长,也会拖慢搜索本身。

只发送接收方所需的数据。筛选条件改变后,有时只需传递查询参数,而不是整个商品目录。对于合适的二进制数据,可以考虑可转移对象。注意所有权转移:发送方将无法继续使用已转移的缓冲区。

分别检验每个假设。如果您减小了消息的大小,请比较传输和处理时间。如果您移动了计算,请检查界面响应和得出结果的时间。这将显示哪个编辑有帮助。

是否可以自动查看队列过载?

WICG 提案目前转向扩展 Long Animation Frames API,以检测文档和 Worker 中任务队列的持续拥塞。单条消息耗时与序列化成本测量,不属于当前扩展案的范围。

这仍是一项实验性提案。不要把早期资料中 delayed-message 的观测示例作为必需的诊断手段。应从可复现的操作流程、INP Scanner、JavaScript 分析和 DevTools 记录入手,选定一个缓慢的操作,追踪到用户所需结果的整个过程。

网站速度检测

找出拖慢网站速度的原因

使用 Milten 检测页面,查看 Core Web Vitals 指标并获取加快加载速度的建议。

检测网站
Cookies

我们使用 Cookie

我们使用 Cookie 以在你的网站上为你提供更好的体验。你可以在我们的 隐私政策.

为什么网站点击后变慢:检查并优化INP