博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React性能分析利器来了,妈妈再也不用担心我的React应用慢了(转)
阅读量:6566 次
发布时间:2019-06-24

本文共 1824 字,大约阅读时间需要 6 分钟。

Profiler

React16.5正式在devtool中加入了Profiler功能,用于收集每次变更导致的渲染时间,帮助开发者发现潜在的性能问题,有助于开发更高性能的React应用

如何使用

在Chrome的开发工具插件react devtool中多了一个Profiler的tab,点击可以切换到Profiler界面

 

 

在你使用React16.5之后的版本中,开发时默认开启Profiler功能,要想在正是环境也使用这个功能,可以

默认打开Profiler什么都没有,要点击录制按钮进行记录(跟chrome的performance挺像)。

 

 

在你开始录制之后你可以进行一些你想分析的操作,然后再点击stop来停止录制,就可以得到录制的内容

 

 

录制内容分析

首先要了解一点,React在16版本之后处理任务分为两个阶段:

  1. render阶段判断哪些变更需要被处理成DOM,也就是比较上一次渲染的结果和新的更新
  2. commit阶段React最终达成所有变更(也就是从js对象到DOM的更新),并且会调用componentDidMountcomponentDidUpdate这些生命周期方法

开发工具中通过commit阶段对性能数据进行编组,会显示在右侧工具栏上

 

 

看上去像一个柱状图,每一个柱子代表一次commit,他的颜色和高度对应执行时长,越高颜色越黄代表时间越长,反之越短。

删选commits

可以通过commits分组左边的设置图标点击出现的对话框设置删选选项,可以设置:

  1. 执行时间少于多少的不展示
  2. 是否显示原声DOM渲染的时间

 

 

火焰图

火焰图部分会以一个类似树形的结构显示一次commit过程中整个每个组件的渲染信息,跟commit分组信息类似,颜色和长短对应这个组件的渲染耗时,当然组件的渲染时间需要依赖他的子组件的渲染时间。

 

 

上图中可见Router组件渲染时间最长,也基本等于NavRoute的渲染时间之和,因为子组件的渲染最终肯定会被计算在父组件的渲染时间内。

你可以点击任何一个组件来查看他的详细信息

 

 

点击一个组件还可以查看他的propsstate

 

 

有些时候你选中一个组件,在commits分组中进行切换,在stateprops面板会有内容变化的提示

 

 

排名视图

选中火焰图边上的排名视图,会展示该次commit中组件渲染时间由高到低的排名,方便删选最长时间的渲染。

 

 

组件视图

如果你需要查看在你进行录制的过程中,某个组件被渲染了多少次,每次所用的时间,那么这个视图就是为你准备的。

 

 

一看像一个柱状图,每一条代表一次渲染,长度和颜色代表时间的长短。

你可以通过双击一个组件,或者选中一个组件,点击右上角的图标来打开该视图。

 

 

互动?(Interactions不知道怎么翻译好)

在之前React已经发布了一组实验API来追踪更新的原因,使用这个API的信息也会在devtool中展示

 

 

途中四个绿点就是调用API的节点对应的commit,同时你也可以在火焰图的commit信息中看到在这个commit存在的活动追踪

 

 

你可以在互动commits之间进行切换通过点击对应的信息

 

 

顺带提一下,这个API通过scheduler这个包使用

import { unstable_trace as trace } from "schedule/tracing"class MyComponent extends Component { handleLoginButtonClick = event => { trace("Login button click", performance.now(), () => { this.setState({ isLoggingIn: true }); }); }; // render ... } 复制代码

更详细的使用可以

最后

这个功能非常棒,它能够让开发者非常直观的看到他的每次操作带来的组件渲染消耗,能够很方便帮助开发者发现一些不必要的渲染。

其实在React开发中一些小细节可能会给整个应用的性能开销带来很大的影响,只是现在的浏览器太强大以及大部分应用都处于性能过剩的情况下,所以性能问题不是特别明显。

在的最后有一个视频展示了如何利用Profiler帮助发现性能问题并优化的案例,大家都可以看一下。

转载于:https://www.cnblogs.com/sunshq/p/9889305.html

你可能感兴趣的文章
我的博客园的CSS和html设置
查看>>
工作中简单的kettle使用
查看>>
spark shuffle:分区原理及相关的疑问
查看>>
Laravel5.5 使用第三方Vendor添加注册验证码
查看>>
06- Linux下sublime下载与使用
查看>>
前端文摘:Web 开发模式演变历史和趋势
查看>>
将图片序列转化为视频文件
查看>>
jQuery的文档操作***
查看>>
js 小数取整,js 小数向上取整,js小数向下取整
查看>>
vue-cli3.0
查看>>
window.location.replace vs window.location.href
查看>>
CVPR 2018:阿里提出应用 LocalizedGAN 进行半监督训练
查看>>
被劫持的wordpress.com账户被用来感染站点
查看>>
分享一下最近看的东西
查看>>
《大数据、小数据、无数据:网络世界的数据学术》一 第2章 何为数据 2.1 引言...
查看>>
寓教于乐的顶峰:新一届大学生集群竞赛火热开战
查看>>
《计算机科学与工程导论:基于IoT和机器人的可视化编程实践方法第2版》一第1章 职业发展机会和团队建设...
查看>>
HBase BlockCache系列 - 探求BlockCache实现机制
查看>>
【参与有奖】您用的MySQL、MongoDB、Redis等服务被勒索过吗?
查看>>
Java核心技术卷I基础知识1.2.6 体系结构中立
查看>>