当前位置: 首页 > news >正文

WHAT - 前端性能指标(交互和响应性能指标)

文章目录

  • 一、交互和响应性能指标总览
  • 二、指标详细解析
    • 1. Input Delay
    • 2. Event Handlers Execution
    • 3. Animation Frame Rate (FPS)
  • 三、在 React 项目中采集交互指标
    • 1. 采集 Input Delay
    • 2. 采集 Event Handlers Execution
    • 3. 采集 FPS
  • 四、采集后的应用
    • 五、React 项目实战建议

在 WHAT - 前端性能指标 中我们简单介绍了几类前端性能指标。今天我们主要介绍第四类指标。

这类指标是 用户感知性能 中最直接的部分,往往决定了一个网站是否“流畅、不卡顿”。

它们不同于加载性能,更关注页面 加载完成之后的体验质量,特别是输入、点击、滚动、动画等交互。


一、交互和响应性能指标总览

指标含义推荐阈值描述
Input Delay用户输入延迟≤ 100ms(优秀)用户触发交互(点击、输入)到浏览器响应的延迟
Event Handlers Execution事件处理耗时≤ 50ms(理想)事件处理函数执行耗时
Animation Frame Rate (FPS)动画帧率≥ 60 FPS(理想)每秒渲染的帧数,反映页面交互和动画流畅度

二、指标详细解析

1. Input Delay

定义:Input Delay 衡量用户触发交互(点击、输入、滚动等)到浏览器真正开始执行事件处理的延迟。本质上受主线程是否被阻塞影响,是 FID 的延伸和更精细的 RUM 指标。

推荐值:
优秀:≤ 100 ms
可接受:100–300 ms
较差:> 300 ms

影响因素:

  • 主线程正在执行长任务(Long Task)
  • JS 执行体积大、同步逻辑多
  • React 渲染/调和任务占用主线程
  • 事件委托、冒泡链较长

优化方向

  • 拆分 JS bundle,减少同步执行。具体可以阅读 HOW - 如何使用 bundle-analyzer 工具优化包体积
  • 使用 requestIdleCallback 处理非关键任务。具体可以阅读 WHAT - requestIdleCallback 介绍
  • 使用 Web Worker 分担计算。具体可以阅读 WHAT - 前端 Web Worker 和 Service Worker(含工作者线程概念)
  • 减少组件层级和重渲染

2. Event Handlers Execution

定义:Event Handlers Execution 是指浏览器调用你的事件处理函数,并完成执行的耗时。如果执行时间过长,会阻塞后续帧的渲染,导致交互“卡顿”。

推荐值:
理想:≤ 50 ms
较差:> 100 ms

影响因素:

  • 事件处理逻辑复杂(循环、计算、DOM 操作)
  • 触发频率高(如 scroll、mousemove)
  • 多次 setState 导致多轮渲染

优化方向:

  • 减少事件处理中的同步计算
  • 节流、防抖高频事件
  • 使用 useMemo / useCallback 优化 React 组件
  • DOM 操作使用批处理(batch update)

3. Animation Frame Rate (FPS)

定义:FPS(Frames Per Second)是衡量动画和交互流畅度的核心指标。

浏览器理想帧率为 60 FPS,意味着一帧渲染时间 ≈ 16.67 ms。如果渲染超过这个时间,就会掉帧或卡顿。

推荐值
优秀:≥ 55–60 FPS
可接受:40–55 FPS
较差:< 40 FPS

影响因素:

  • JS 执行占用过长
  • 页面需要重绘/重排的元素太多
  • 动画未使用 GPU 加速(transform/opacity)
  • 滚动、拖拽逻辑繁重

优化方向

  • 使用 transform/opacity 进行动画(避免 layout)
  • 使用 CSS 动画代替 JS 动画
  • 使用 requestAnimationFrame 控制 JS 动画
  • 通过虚拟滚动、惰性渲染减少 DOM 数量
  • 避免强制同步布局

具体可以阅读 WHAT - CSS Animationtion 动画系列(三)- 动画卡顿分析


三、在 React 项目中采集交互指标

这类指标可以通过 PerformanceObserverperformance.now()requestAnimationFrame 等 API 实时采集。

不像加载类指标有官方 web-vitals 包,但实现相对简单。


1. 采集 Input Delay

通过监听用户输入事件,记录从事件触发到回调执行的时间差:

// src/utils/inputDelay.ts
export function monitorInputDelay(callback: (delay: number) => void) {const listener = (e: Event) => {const eventTime = e.timeStamp;const now = performance.now();const delay = now - eventTime;callback(delay);};['click', 'keydown', 'pointerdown', 'touchstart'].forEach((type) => {window.addEventListener(type, listener, { passive: true });});
}

使用:

import { monitorInputDelay } from './utils/inputDelay';monitorInputDelay((delay) => {console.log('Input Delay:', delay);fetch('/api/performance', {method: 'POST',body: JSON.stringify({ metric: 'inputDelay', value: delay }),headers: { 'Content-Type': 'application/json' },});
});

2. 采集 Event Handlers Execution

可以在事件回调中手动记录开始和结束时间,也可以通过 PerformanceObserver 监听 longtask:

export function measureEventHandlerExecution(fn: Function) {return (...args: any[]) => {const start = performance.now();fn(...args);const end = performance.now();const duration = end - start;console.log('Event handler execution time:', duration);fetch('/api/performance', {method: 'POST',body: JSON.stringify({ metric: 'eventHandlerExecution', value: duration }),headers: { 'Content-Type': 'application/json' },});};
}

使用时:

<button onClick={measureEventHandlerExecution(() => {// 一些业务逻辑
})}>Click</button>

也可以用 PerformanceObserver 监控超过 50ms 的 long tasks。


3. 采集 FPS

// src/utils/fpsMonitor.ts
export function monitorFPS(callback: (fps: number) => void) {let lastFrameTime = performance.now();let frameCount = 0;function loop() {const now = performance.now();frameCount++;if (now >= lastFrameTime + 1000) {const fps = (frameCount * 1000) / (now - lastFrameTime);callback(fps);frameCount = 0;lastFrameTime = now;}requestAnimationFrame(loop);}requestAnimationFrame(loop);
}

使用:

import { monitorFPS } from './utils/fpsMonitor';monitorFPS((fps) => {console.log('FPS:', fps);fetch('/api/performance', {method: 'POST',body: JSON.stringify({ metric: 'fps', value: fps }),headers: { 'Content-Type': 'application/json' },});
});

四、采集后的应用

场景指标问题优化方向
点击响应慢Input DelayJS 阻塞主线程减少同步任务、拆包、Worker
点击后页面卡顿Event Handler Execution逻辑复杂减少计算量,节流
动画掉帧FPS渲染压力大GPU 加速、CSS 动画、虚拟滚动

五、React 项目实战建议

技术应用
Performance.now + 事件监听采集 Input Delay
包装事件处理函数采集 handler 执行耗时
requestAnimationFrame实时计算 FPS
PerformanceObserver监控 long tasks
Sentry / 自建上报存储与分析交互性能
http://www.dtcms.com/a/482193.html

相关文章:

  • 专业的媒体发稿网
  • dede旅游网站模板wordpress教学主题
  • 做网站的技术性说明怎么自己做微网站吗
  • VScode安装以及C/C++环境配置20251014
  • 黄页网站大全通俗易懂wordpress 数据库配置错误
  • 常规的红外工业镜头有哪些?能做什么?
  • 一文读懂分子结合位点的预测:为双荧光素酶实验铺路
  • SM4密码核心知识点
  • 当代社会情绪分类及其改善方向深度解析
  • Python 求圆柱体的周长(Find the perimeter of a cylinder)
  • 攻防世界-Web-unseping
  • Python 第十三节 Python中各种输入输出方案详解及注意事项
  • 优秀的网站设计分析西电信息化建设处网站
  • 网页设计第6次课后作业
  • 算法---双指针一
  • ubuntu2404系统安装nocobase的方法
  • FFmpeg 播放播放 HTTP网络流读取数据过程分析
  • 使用Spring Boot构建系统安全层
  • 项目1:高分辨率(1920 * 1080)编码码流推送流媒体讲解
  • [嵌入式系统-109]:GPU与NPU的比较
  • 算法入门:专题攻克一---双指针4(三数之和,四数之和)强推好题,极其锻炼算法思维
  • 比较好的网页设计网站wordpress salient 8
  • 建设网站都需要哪些资料佛山做网站的公司
  • 198种组合算法+优化CNN卷积神经网络+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备!
  • 深度学习基础模块
  • 仿muduo库的高并发服务器
  • DNS优选 2.8.2 | 优选最快DNS,访问受限网站,去网站广告
  • 网络编程就是做网站么枣庄网页制作公司
  • 【目标跟踪n雷达二维EKF】雷达对单目标跟踪,滤波(使用扩展卡尔曼)增强定位能力,二维,目标状态未知,雷达数量可调。给出MATLAB代码
  • 从鉴酱酒:传承文化,品味佳酿