日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
面試官:說說React性能優(yōu)化的手段有哪些?

本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。

創(chuàng)新互聯(lián)長(zhǎng)期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為鐵西企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,鐵西網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

一、是什么

React憑借virtual DOM和diff算法擁有高效的性能,但是某些情況下,性能明顯可以進(jìn)一步提高

在前面文章中,我們了解到類組件通過調(diào)用setState方法, 就會(huì)導(dǎo)致render,父組件一旦發(fā)生render渲染,子組件一定也會(huì)執(zhí)行render渲染

當(dāng)我們想要更新一個(gè)子組件的時(shí)候,如下圖綠色部分:

理想狀態(tài)只調(diào)用該路徑下的組件render:

但是react的默認(rèn)做法是調(diào)用所有組件的render,再對(duì)生成的虛擬DOM進(jìn)行對(duì)比(黃色部分),如不變則不進(jìn)行更新

從上圖可見,黃色部分diff算法對(duì)比是明顯的性能浪費(fèi)的情況

二、如何做

在React中如何避免不必要的render中,我們了解到如何避免不必要的render來應(yīng)付上面的問題,主要手段是通過shouldComponentUpdate、PureComponent、React.memo,這三種形式這里就不再?gòu)?fù)述

除此之外, 常見性能優(yōu)化常見的手段有如下:

  • 避免使用內(nèi)聯(lián)函數(shù)
  • 使用 React Fragments 避免額外標(biāo)記
  • 使用 Immutable
  • 懶加載組件
  • 事件綁定方式
  • 服務(wù)端渲染

避免使用內(nèi)聯(lián)函數(shù)

如果我們使用內(nèi)聯(lián)函數(shù),則每次調(diào)用render函數(shù)時(shí)都會(huì)創(chuàng)建一個(gè)新的函數(shù)實(shí)例,如下:

 
 
 
 
  1. import React from "react";
  2. export default class InlineFunctionComponent extends React.Component {
  3.   render() {
  4.     return (
  5.       
  6.         

    Welcome Guest

  7.          { this.setState({inputValue: e.target.value}) }} value="Click For Inline Function" />
  8.       
  •     )
  •   }
  • }
  • 我們應(yīng)該在組件內(nèi)部創(chuàng)建一個(gè)函數(shù),并將事件綁定到該函數(shù)本身。這樣每次調(diào)用 render 時(shí)就不會(huì)創(chuàng)建單獨(dú)的函數(shù)實(shí)例,如下:

     
     
     
     
    1. import React from "react";
    2. export default class InlineFunctionComponent extends React.Component {
    3.   
    4.   setNewStateData = (event) => {
    5.     this.setState({
    6.       inputValue: e.target.value
    7.     })
    8.   }
    9.   
    10.   render() {
    11.     return (
    12.       
    13.         

      Welcome Guest

    14.         
    15.       
  •     )
  •   }
  • }
  • 使用 React Fragments 避免額外標(biāo)記

    用戶創(chuàng)建新組件時(shí),每個(gè)組件應(yīng)具有單個(gè)父標(biāo)簽。父級(jí)不能有兩個(gè)標(biāo)簽,所以頂部要有一個(gè)公共標(biāo)簽,所以我們經(jīng)常在組件頂部添加額外標(biāo)簽div

    這個(gè)額外標(biāo)簽除了充當(dāng)父標(biāo)簽之外,并沒有其他作用,這時(shí)候則可以使用fragement

    其不會(huì)向組件引入任何額外標(biāo)記,但它可以作為父級(jí)標(biāo)簽的作用,如下所示:

     
     
     
     
    1. export default class NestedRoutingComponent extends React.Component {
    2.     render() {
    3.         return (
    4.             <>
    5.                 

      This is the Header Component

    6.                 

      Welcome To Demo Page

    7.             
    8.         )
    9.     }
    10. }

    事件綁定方式

    在事件綁定方式中,我們了解到四種事件綁定的方式

    從性能方面考慮,在render方法中使用bind和render方法中使用箭頭函數(shù)這兩種形式在每次組件render的時(shí)候都會(huì)生成新的方法實(shí)例,性能欠缺

    而constructor中bind事件與定義階段使用箭頭函數(shù)綁定這兩種形式只會(huì)生成一個(gè)方法實(shí)例,性能方面會(huì)有所改善

    使用 Immutable

    在理解Immutable中,我們了解到使用 Immutable可以給 React 應(yīng)用帶來性能的優(yōu)化,主要體現(xiàn)在減少渲染的次數(shù)

    在做react性能優(yōu)化的時(shí)候,為了避免重復(fù)渲染,我們會(huì)在shouldComponentUpdate()中做對(duì)比,當(dāng)返回true執(zhí)行render方法

    Immutable通過is方法則可以完成對(duì)比,而無需像一樣通過深度比較的方式比較

    懶加載組件

    從工程方面考慮,webpack存在代碼拆分能力,可以為應(yīng)用創(chuàng)建多個(gè)包,并在運(yùn)行時(shí)動(dòng)態(tài)加載,減少初始包的大小

    而在react中使用到了Suspense和 lazy組件實(shí)現(xiàn)代碼拆分功能,基本使用如下:

     
     
     
     
    1. const johanComponent = React.lazy(() => import(/* webpackChunkName: "johanComponent" */ './myAwesome.component'));
    2.  
    3. export const johanAsyncComponent = props => (
    4.   }>
    5.     
    6.   
    7. );

    服務(wù)端渲染

    采用服務(wù)端渲染端方式,可以使用戶更快的看到渲染完成的頁(yè)面

    服務(wù)端渲染,需要起一個(gè)node服務(wù),可以使用express、koa等,調(diào)用react的renderToString方法,將根組件渲染成字符串,再輸出到響應(yīng)中

    例如:

     
     
     
     
    1. import { renderToString } from "react-dom/server";
    2. import MyPage from "./MyPage";
    3. app.get("/", (req, res) => {
    4.   res.write("My Page");
    5.   res.write("");  
    6.   res.write(renderToString());
    7.   res.write("
    ");
  •   res.end();
  • });
  • 客戶端使用render方法來生成HTML

     
     
     
     
    1. import ReactDOM from 'react-dom';
    2. import MyPage from "./MyPage";
    3. ReactDOM.render(, document.getElementById('app'));

    其他

    除此之外,還存在的優(yōu)化手段有組件拆分、合理使用hooks等性能優(yōu)化手段...

    三、總結(jié)

    通過上面初步學(xué)習(xí),我們了解到react常見的性能優(yōu)化可以分成三個(gè)層面:

    • 代碼層面
    • 工程層面
    • 框架機(jī)制層面

    通過這三個(gè)層面的優(yōu)化結(jié)合,能夠使基于react項(xiàng)目的性能更上一層樓

    參考文獻(xiàn)

    https://zhuanlan.zhihu.com/p/108666350

    https://segmentfault.com/a/1190000007811296


    分享題目:面試官:說說React性能優(yōu)化的手段有哪些?
    鏈接地址:http://www.dlmjj.cn/article/cdispgi.html