React Profiler 是 React DevTools 自带的性能分析工具,核心能量化这 3 个关键指标(优化前后对比这些数据就够了):
- 渲染时长:组件每次渲染消耗的时间(ms);
- 渲染次数:组件是否无意义重复渲染(比如优化前渲染 10 次,优化后只渲染 2 次);
- 渲染原因:组件为什么会重渲染(比如 props 变化、state 变化、父组件渲染带动)。
- 安装 React DevTools:Chrome/Firefox 扩展商店搜「React Developer Tools」,安装后刷新你的 React 项目页面;
- 确保项目是开发环境(生产环境 React 会禁用 Profiler,看不到数据);
- 打开 DevTools:右键页面→检查→切换到「Profiler」标签(如果没看到,点 DevTools 右上角的「>>」展开)。
这一步是为了拿到「优化前的原始数据」,后续对比才有依据:
- 点击 Profiler 面板的「录制按钮」(圆形红色按钮),开始录制;
- 操作你要优化的功能(比如:点击按钮、滚动列表、切换路由)——只做 1 次核心操作,避免无关操作干扰数据;
- 点击「停止按钮」,生成性能分析报告。
录制完成后,面板会显示可视化报告,重点关注以下量化指标:
- 横轴:渲染耗时(ms)(越长代表组件渲染越慢);
- 纵轴:组件嵌套层级(父组件在上,子组件在下);
- 颜色:红色越深 → 渲染耗时越长;
- 关键操作:
- 鼠标悬停在组件上,会显示「渲染时长(Duration)」(比如
List: 245ms);
- 记录下核心组件(比如你优化的列表组件)的渲染时长和渲染次数。
切换到「Ranked」标签,组件会按「渲染总时长」从高到低排序,一眼就能看到最耗时的组件(比如优化前 BigList 耗时 300ms,排第一)。
点击任意组件,右侧会显示「Why did this component render?」,明确渲染原因:
- 比如「Props changed」(props 变化)、「State changed」(state 变化)、「Parent rendered」(父组件渲染带动)—— 这些是优化的核心靶点。
比如你之前优化的列表组件:
// 优化前:无memo,父组件渲染就跟着渲染
function BigList({ data }) {
return <div>{data.map(item => <Item key={item.id} />)}</div>;
}
// 优化后:用memo缓存组件,仅props变化时渲染
const BigList = memo(({ data }) => {
return <div>{data.map(item => <Item key={item.id} />)}</div>;
});
重复步骤 1-2,录制优化后的操作,然后对比核心数据:
点击优化后的组件,看右侧「Why did this component render?」:
- 优化前:显示「Parent rendered」(父组件渲染带动);
- 优化后:仅显示「Props changed (data)」(只有 data 真变化时才渲染)—— 证明 memo 生效了。
- 只录核心操作:比如只测「滚动列表」,不要同时点按钮、切路由,避免数据杂乱;
- 多次录制取平均值:单次录制可能有波动,录 3 次取平均,结果更客观;
- 过滤无关组件:点击 Profiler 面板的「Filter」,输入组件名(比如 BigList),只看目标组件的数据;
- 关注「实际渲染时间」:React Profiler 显示的「Duration」是组件渲染的总时间,而「Actual Duration」是真正消耗在该组件上的时间(排除子组件),优先看这个;
- 对比「交互帧率」:录制时打开 Chrome DevTools → Performance → 勾选「FPS」,优化前帧率 <30fps(卡顿),优化后> 50fps(流畅),也是直观的量化指标。
- 核心流程:录制优化前基准数据 → 分析耗时 / 次数 / 原因 → 优化代码 → 录制后数据 → 对比量化指标;
- 关键指标:组件渲染时长(Actual Duration)、渲染次数、渲染原因;
- 验证标准:优化后「时长减少」「次数降低」「渲染原因仅为必要的 props/state 变化」,就是优化生效的量化证明。