一文讲清楚React性能优化

文章目录

  • 一文讲清楚React性能优化
  • [1. React性能优化概述](#1. React性能优化概述)
  • [2. React性能优化](#2. React性能优化)
    • [2.1 render优化](#2.1 render优化)
    • [2.2 较少使用内联函数](#2.2 较少使用内联函数)
    • [2.3 使用React Fragments避免额外标记](#2.3 使用React Fragments避免额外标记)
    • [2.4 使用Immutable](#2.4 使用Immutable)
    • 上代码
    • [2.5 组件懒加载](#2.5 组件懒加载)
    • [2.6 服务端渲染](#2.6 服务端渲染)
    • [2.7 其他优化手段](#2.7 其他优化手段)

一文讲清楚React性能优化

1. React性能优化概述

React通过引入VirtualDOM,再加上diff算法,让渲染性能得到了极大的提升,但是我们依然可以通过很多方法,将性能进一步的 提升

2. React性能优化

2.1 render优化

直接看这篇文章一文讲清楚React的render优化,包括shouldComponentUpdate、PureComponent和memo

2.2 较少使用内联函数

  • 使用内联函数会导致每次render时都创建新的函数实例,造成一定的性能影响,我们应尽量在render外实例化函数,然后再render中绑定就行
js 复制代码
// 使用内联函数
class App extends React.Component{
    render(){
        return(
            <div>
                <button onClick={()=>{/* do something */}}></button>
            </div>
        )
    }
}
// 是使用内敛函数
class App extends React.Component{
    handleClick=()=>{/* do something */}
    render(){
        return(
            <div>
                <button onClick={this.handleClick}></button>
            </div>
        )
    }
}

2.3 使用React Fragments避免额外标记

因为React要求我们每个组件具有唯一父标签,所以我们经常会在最外层嵌套一个div,但是这样会增加DOM消耗

如果我们只是为了满足规则,而不需要在最外层标签做人也业务处理,则可以使用<>React Fragments来代替div

js 复制代码
class App extends from React.Component{
    render(){
        return(
            <>
                <span>use React Fragments</span>
            </>
        )
    }
}

2.4 使用Immutable

  • 首先,Immutable是一个js库,他的作用是让我们在进行对象引用时,不用拷贝整个原对象,而是截取当前节点及父节点,其他节点实现共享,形成一种不可变的数据结构
  • 她提供了主要想Map(主要处理对象),Set(主要处理Array)等来操作对象
  • 用之前先安装 npm install immutable
  • 我们用Map来举例,
  • 主要用法
  • Map(obj)
  • set(name,value)
  • get(name)
  • toJS(转回普通对象)

上代码

js 复制代码
import React, { Component } from 'react';
import {Map} from 'immutable'
class App extends Component {
    state={
        info:Map({
            name:"tom",
            age:20,
            hobbit:Map({
                likeone:"basketball",
                liketwo:"football"
            })
        })
    }
    render() {
        return (
            <div>
                App
                <button onClick={()=>{this.setState({
                    info:this.state.info.set("name","newTom")
                })}}>修改</button>
                {this.state.info.get("name")}
                <Child hobbit={this.state.info.get("hobbit")} ></Child> 
            </div>
        );
    }
}
class Child extends Component{
    shouldComponentUpdate(nextProps,nextState){
        //判断hobbit的值是否更新
        if(this.props.hobbit===nextProps.hobbit){
            return false;
        }
        return true;
    }
    render(){
        return(
            <div>Child</div>
        );
    }
    componentDidUpdate(){
        console.log("子组件更新了");
    }
}
export default App;
  • 实现不必要的render渲染

2.5 组件懒加载

  • 我们在使用webpack的时候都知道,webpack支持代码拆分的能力,打包不同的bundle,然后再需要的时候动态加载,而不是一次性全部加载,减少初始包的大小
  • React使用Suspense和lazy组件实现代码的拆分,即懒加载
  • 上代码
js 复制代码
const lazyComponent=React.lazy(()=>import(/* component name */))
function App(props){
    <React.Suspense>
        <lazyComponent></lazyComponent>
    </React.Suspense>
}

2.6 服务端渲染

  • 我们可以使用服务端渲染的方式,加速首屏加载
  • 可以使用Node服务,调用React.renderToString
  • 也可以直接使用next.js实现服务端渲染

2.7 其他优化手段

相关推荐
子兮曰4 小时前
把 649 种文件格式塞进一个网页里:一个「文件不出浏览器」的预览器
前端·javascript·后端
paopaokaka_luck7 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
weixin_448119948 小时前
Datawhale Easy Data × AI:构建知识与记忆驱动的 Agent笔记8
人工智能·笔记·react.js
溪语流沙8 小时前
【每天一个CSS | Day19】流光文字与一笔写成的手写签名
前端·javascript·css
CDwenhuohuo9 小时前
electron pc项目打包成桌面端
前端·javascript·electron
EatFan11 小时前
React 项目踩坑实录:useEffect 闭包陷阱、Context 性能陷阱与 React 18 升级避坑排查手册
前端·javascript·react.js·react·react hooks·useeffect·闭包陷阱
w2sfot15 小时前
【JS加密在线】jsjiami.online(让JavaScript 更安全!)
开发语言·javascript·安全
梦想的颜色16 小时前
【编程实战】AI 时代 APP 开发全栈硬核指南:技术选型 + AI 架构 + 模型落地全维度决策
python·flutter·react native·react.js·ai·桌面应用·milvus
知野小兔16 小时前
对比react钩子函数
react.js
杨杰39819 小时前
我给嵌入式设备写了个 6MB 的 JavaScript 运行时(xuan)
javascript