您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

推荐几个 React 性能优化工具

时间:2020-06-21 16:55:15  来源:  作者:

本文翻译自 5 Recommended Tools for Optimizing Performance in ReactJS,作者 Chidume Nnamdi ,有较大的删改。

Profiler

推荐几个 React 性能优化工具

 

Code SandBox

可以前往
https://codesandbox.io/s/react-profiler-example-o75nc?fontsize=14&hidenavigation=1&theme=dark 在线编辑效果。

Profiler 是 React 中的一个组件,由 B. Vaughn 开发,它可以测量 React 应用渲染的频率和渲染所花费的时间资源。Profiler 提供一个函数属性 onRender,当组件 mount 或者 update 的时候,这个函数会接受到一些时间指标。用这些时间指标你就可以发现效率低下的代码了。

import React, { Profiler } from 'react';

...
<Profiler id="Counter1" onRender={this.callback1(this)}>
  <Counter1 />
</Profiler>

id 用来标识对应的 Profiler 组件,onRender 函数会在组件 mount 或者 update 的时候执行,它的参数结构如下:

function onRenderCallback(  id,
  phase,
  actualDuration, 
  baseDuration,
  startTime,
  commitTime,) {
  console.log('onRenderCallback', {
    id,
    phase,
    actualDuration, 
    baseDuration,
    startTime,
    commitTime,
  })
}
  • id 组件 id;
  • phase 执行阶段,mount 或者 update;
  • actualDuration Profiler 和子组件渲染当前的更新所花费的时间,这个值在首次 mount 的时候比 update 阶段的值大;
  • baseDuration 子组件最近一次渲染所持续的时长
  • startTime 开始渲染当前的更新的时间戳
  • commitTime React 提交当前更新的时间戳

这些数据可以帮助我们分析组件运行的效率,找到性能瓶颈。

React Developer tools

推荐几个 React 性能优化工具

 

React Developer tools 是 React 官方团队发布的一个浏览器插件,功能十分强大。我要介绍的是 Highlight Update 这个功能。这个工具用来检测组件重复渲染非常有效。他可以用不同的颜色来标识组件的边框,颜色越黄表示这个组件重复渲染的次数越多。

如果你有一个组件树像下面这样:

推荐几个 React 性能优化工具

 

如果 Main 组件重复渲染了,那么封装 Counter 和 Count 组件的边界就会出现一个边框表示重复渲染。

我们激活这个特性之后,在 ReactJS 官网开启关闭右侧的菜单,会出现边框提示:

推荐几个 React 性能优化工具

 

如何激活这个特性呢?找到调试工具的 Components 一栏,点击右上角的小齿轮,再选中弹窗中的 Highlight updates when components render.

推荐几个 React 性能优化工具

 

边框的类型取决于重复渲染的程度,重复渲染越多,颜色越深。

|    绿色 - 低频次更新
|    蓝色 - 一般频次更新
v    红色 - 高频次更新

通过使用这个工具,我们可以通过边框颜色来轻易找到有性能问题的组件,并对它做针对性的优化。

why-did-you-render

推荐几个 React 性能优化工具

 


https://github.com/welldone-software/why-did-you-render,这个工具是由 Welldone Software 开发的,用来对组件重复渲染给出反馈。

它会对组件的 props 做 diff,如果组件重新渲染了,但是 props 并没改变,它会在命令行提醒你 props 并没有变化。

重复渲染在小型应用中影响可能不大,但是在大型项目中将肯定会有影响。

这个工具嵌入到了 React 组件的生命周期中,所以他能在组件重新渲染时比对 props 是否变化。

使用方法很简单,先安装

npm install @welldone-software/why-did-you-render --save

然后注册一次:

whyDidYouRender(React, {
  trackAllPureComponents: true
});

然后对 class component:

class Counter extends React.Component {
  static whyDidYouRender = true;
  render() {
   //...
  }
}

对函数组件:

function Counter() {
  return(
   // ...
  )
}
Counter.whyDidYouRender = true;

下面是一个完整的例子,每次 setState 时候,style={{ width: "100%" }} 都是一个新的值,所以会触发比对。

import React from "react";
import "./styles.css";
const whyDidYouRender = require("@welldone-software/why-did-you-render");
whyDidYouRender(React, {
  trackAllPureComponents: true
});
export default class App extends React.Component {
  constructor() {
    super();
    this.state = {
      count: 1
    };
  }
  render() {
    return (
      <div className="App">
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          add
        </button>
        <p>{this.state.count}</p>
        <Comp style={{ width: "100%" }} />
      </div>
    );
  }
}
function Comp(props) {
  return <div>100</div>;
}
Comp.whyDidYouRender = true;

前往 Code SandBox 测试
https://codesandbox.io/s/distracted-architecture-t9ih2?file=/src/App.js

Performance timeline (Browser profiling)

这个工具是 Chrome 自带的调试工具,在 Performance 一栏中。

它可以非常有效地查看严重重复渲染的组件,它也可以很方便地查看 UI 不必要的更新及其出现的频次。

在使用工具之前,先以开发模式把你的 React app 启动起来。

然后,打开开发者工具,切换到 Performance 面板。

推荐几个 React 性能优化工具

 

点击中间的圆点或者用快捷键 command + e,开发者工具就开始录制了,然后你可以在你的应用中做一些交互动作。

建议录制时间在 20 秒以上,时间到了之后,点击中间的 stop,或者左上角红点。

推荐几个 React 性能优化工具

 

然后我们就可以看到时间线了。

推荐几个 React 性能优化工具

 

我们可以滑动选择一片区域,然后通过 W 放大或者通过 S 缩小。选中一片区域,通过 W 键一直放大。

推荐几个 React 性能优化工具

 

每个橙色的条代表一个执行过程,在这个条中你可以看到组件名、组件执行的阶段、以及执行时间。在上面这张图片中,App 的执行阶段是 update 阶段,这表示 App 组件这段时间是在执行更新操作,执行所耗费的时间是 1.71 ms。

组件每次渲染的时候一个新的黄条就会生成,如果一个组件多次渲染,通过这个 Timings 图表可以让你更容易追因。每个黄条的长度表示组件的执行时间,黄条越长,执行时间也越长。你可以使用这个工具来诊断页面。


 



Tags:React   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
每个前端开发人员都听说过三个用于构建 Web 应用程序的框架:React、Vue.js和Angular。React 是一个 UI 库,Angular 是一个成熟的前端框架,而 Vue.js 是一个渐进式框架。它们几...【详细内容】
2021-08-25  Tags: React  点击:(96)  评论:(0)  加入收藏
领域驱动,各自只管各自的模块,顶层再来进行组装和分配...【详细内容】
2021-06-25  Tags: React  点击:(92)  评论:(0)  加入收藏
为什么要从 Vue 转到 React,这篇文章为什么我们放弃了 Vue?不过对于大多数人来说,用 Vue 还是 React 不是自己说了算,多学一门技术不是坏处,而且 React 被大厂大量使用,要进入大厂...【详细内容】
2021-04-13  Tags: React  点击:(265)  评论:(0)  加入收藏
在这篇文章中,我将分享我对React Hooks的观点,正如这篇文章的标题所暗示的那样,我不是一个忠实的粉丝。让我们来分析一下React官方的文档中描述的放弃类而使用钩子的动机。动...【详细内容】
2020-11-03  Tags: React  点击:(80)  评论:(0)  加入收藏
作者:陈吉转发链接:https://mp.weixin.qq.com/s/HweEFh78WXLawyQr_Vsl5g前言前端一般会面临 XSS 这样的安全风险,但随着 React 等现代前端框架的流行,使我们在平时开发时不用太...【详细内容】
2020-09-24  Tags: React  点击:(153)  评论:(0)  加入收藏
近几年 ,前端领域出现了两大玩家:Google 发布的 Angular、Facebook 开发的 JavaScript 库 React。在 2018 年,又有一个实力雄厚的玩家加入了这场竞争:Vue.js,它 很直白地表示出了自己 的豪心壮志——立志成为最受欢迎的 Ja...【详细内容】
2020-07-27  Tags: React  点击:(71)  评论:(0)  加入收藏
"Hooks 到底是个啥玩意儿???"你是不是有这样的疑惑?在你自认为已经了解了差不多 React 所有的内容的时候,Hooks 就这么出现了。这就是前端开发人员的日常,技术从未停止更新。学习...【详细内容】
2020-07-18  Tags: React  点击:(40)  评论:(0)  加入收藏
本文翻译自 5 Recommended Tools for Optimizing Performance in ReactJS,作者 Chidume Nnamdi ,有较大的删改。Profiler Code SandBox可以前往 https://codesandbox.io/s/rea...【详细内容】
2020-06-21  Tags: React  点击:(72)  评论:(0)  加入收藏
说到状态管理器,轮子满天飞。在 Class 时代,redux 与 mobox 几乎占据了全部市场,几乎没有没用过 redux 的同学。随着 Hooks 的诞生,新的一批轮子应运而生,其中有代表性的有 unstated-next、constate 等等。当然无论什么轮...【详细内容】
2020-05-17  Tags: React  点击:(505)  评论:(0)  加入收藏
正如我们所知, React 是 JavaScript 库,用于构建精彩的用户界面。然而,并不是每个人都在使用相同的工具或知道有这么一些出色的工具,可以让 Reacat 开发体验变得更加有趣和积极...【详细内容】
2019-08-27  Tags: React  点击:(190)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条