精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

熱點技術:React性能優化總結

開發 前端
初學者對React可能滿懷期待,覺得React可能完爆其它一切框架,甚至不切實際地認為React可能連原生的渲染都能完爆——對框架的狂熱確實會出現這樣的不切實際的期待。讓我們來看看React的官方是怎么說的。

初學者對React可能滿懷期待,覺得React可能完爆其它一切框架,甚至不切實際地認為React可能連原生的渲染都能完爆——對框架的狂熱確實會出現這樣的不切實際的期待。讓我們來看看React的官方是怎么說的。React官方文檔在Advanced Performanec這一節,這樣寫道:

  1. One of the first questions people ask when considering React for a project is whether their application will be as fast and responsive as an equivalent non-React version 

顯然React自己也其實只是想盡量達到跟非React版本相若的性能,

你所不知道的render

react的組件渲染分為初始化渲染和更新渲染。在初始化渲染的時候會調用根組件下的所有組件的render方法進行渲染,如下圖(綠色表示已渲染,這一層是沒有問題的):

但是當我們要更新某個子組件的時候,如下圖的綠色組件(從根組件傳遞下來應用在綠色組件上的數據發生改變):

我們的理想狀態是只調用關鍵路徑上組件的render,如下圖:

但是react的默認做法是調用所有組件的render,再對生成的虛擬DOM進行對比,如不變則不進行更新。這樣的render和虛擬DOM的對比明顯是在浪費,如下圖(黃色表示浪費的render和虛擬DOM對比)

Tips:

  • 拆分組件是有利于復用和組件優化的。

  • 生成虛擬DOM并進行比對發生在render()后,而不是render()前。

更新階段的生命周期

  • componentWillReceiveProps(object nextProps):當掛載的組件接收到新的props時被調用。此方法應該被用于比較this.props 和 nextProps以用于使用this.setState()執行狀態轉換。(組件內部數據有變化,使用state,但是在更新階段又要在props改變的時候改變state,則在這個生命周期里面)

  • shouldComponentUpdate(object nextProps, object nextState): -boolean 當組件決定任何改變是否要更新到DOM時被調用。作為一個優化實現比較this.props 和 nextProps 、this.state 和 nextState ,如果React應該跳過更新,返回false。

  • componentWillUpdate(object nextProps, object nextState):在更新發生前被立即調用。你不能在此調用this.setState()

  • componentDidUpdate(object prevProps, object prevState): 在更新發生后被立即調用。(可以在DOM更新完之后,做一些收尾的工作)

Tips:

  • React的優化是基于shouldComponentUpdate的,該生命周期默認返回true,所以一旦prop或state有任何變化,都會引起重新render。

shouldComponentUpdate

react在每個組件生命周期更新的時候都會調用一個shouldComponentUpdate(nextProps, nextState)函數。它的職責就是返回true或false,true表示需要更新,false表示不需要,默認返回為true,即便你沒有顯示地定義 shouldComponentUpdate 函數。這就不難解釋上面發生的資源浪費了。

為了進一步說明問題,我們再引用一張官網的圖來解釋,如下圖( SCU表示shouldComponentUpdate,綠色表示返回true(需要更新),紅色表示返回false(不需要更新);vDOMEq表示虛擬DOM比對,綠色表示一致(不需要更新),紅色表示發生改變(需要更新)):

根據渲染流程,首先會判斷shouldComponentUpdate(SCU)是否需要更新。如果需要更新,則調用組件的render生成新的虛擬DOM,然后再與舊的虛擬DOM對比(vDOMEq),如果對比一致就不更新,如果對比不同,則根據最小粒度改變去更新DOM;如果SCU不需要更新,則直接保持不變,同時其子元素也保持不變。

  • C1根節點,綠色SCU (true),表示需要更新,然后vDOMEq紅色,表示虛擬DOM不一致,需要更新。

  • C2節點,紅色SCU (false),表示不需要更新,所以C4,C5均不再進行檢查

  • C3節點同C1,需要更新

  • C6節點,綠色SCU (true),表示需要更新,然后vDOMEq紅色,表示虛擬DOM不一致,更新DOM。

  • C7節點同C2

  • C8節點,綠色SCU (true),表示需要更新,然后vDOMEq綠色,表示虛擬DOM一致,不更新DOM。

帶坑的寫法:

  • {…this.props} (不要濫用,請只傳遞component需要的props,傳得太多,或者層次傳得太深,都會加重shouldComponentUpdate里面的數據比較負擔,因此,也請慎用spread attributes(<Component {…props} />))。

  • ::this.handleChange()。(請將方法的bind一律置于constructor)

  • this.handleChange.bind(this,id)

  • 復雜的頁面不要在一個組件里面寫完。

  • 請盡量使用const element。

  • map里面添加key,并且key不要使用index(可變的)。具體可參考使用Perf工具研究React Key對渲染的影響

  • 盡量少用setTimeOut或不可控的refs、DOM操作。

  • 數據盡可能簡單明了,扁平化。

性能檢測工具

React官方提供的:React.addons.Perf

react官方提供一個插件React.addons.Perf可以幫助我們分析組件的性能,以確定是否需要優化。
打開console面板,先輸入Perf.start()執行一些組件操作,引起數據變動,組件更新,然后輸入Perf.stop()。(建議一次只執行一個操作,好進行分析)
再輸入Perf.printInclusive查看所有涉及到的組件render,如下圖(官方圖片):

或者輸入Perf.printWasted()查看下不需要的的浪費組件render,如下圖(官方圖片):

優化前:

優化后:

其他的檢測工具

react-perf-tool為React應用提供了一種可視化的性能檢測方案,該工程同樣是基于React.addons,但是使用圖表來顯示結果,更加方便。

React官方的解決方案

PureRenderMixin(es5)

 

  1. var PureRenderMixin = require('react-addons-pure-render-mixin'); 
  2. React.createClass({ 
  3.   mixins: [PureRenderMixin], 
  4.  
  5.   render: function() { 
  6.     return <div className={this.props.className}>foo</div>; 
  7.   } 
  8. }); 

Shallow Compare (es6)

 

  1. var shallowCompare = require('react-addons-shallow-compare'); 
  2. export class SampleComponent extends React.Component { 
  3.   shouldComponentUpdate(nextProps, nextState) { 
  4.     return shallowCompare(this, nextProps, nextState); 
  5.   } 
  6.  
  7.   render() { 
  8.     return <div className={this.props.className}>foo</div>; 
  9.   } 

es7裝飾器的寫法:

  1. import pureRender from "pure-render-decorator" ... @pureRender class Person extends Component { render() { console.log("我re-render了"); const {name,age} = this.props; return ( <div> <span>姓名:</span> <span>{name}</span> <span> age:</span> <span>{age}</span> </div> 
  2.       ) 
  3.   } 

pureRender很簡單,就是把傳進來的component的shouldComponentUpdate給重寫掉了,原來的shouldComponentUpdate,無論怎樣都是return ture,現在不了,我要用shallowCompare比一比,shallowCompare代碼及其簡單,如下:

  1. function shallowCompare(instance, nextProps, nextState) { 
  2.   return !shallowEqual(instance.props, nextProps) || !shallowEqual(instance.state, nextState); 

缺點

shallowEqual其實只比較props的第一層子屬性是不是相同,就像上述代碼,props 是如下

  1.   detail: { 
  2.     name: "123", age: "123" 
  3.   } 

他只會比較props.detail ===nextProps.detail,導致在傳入復雜的數據的情況下,優化失效。

immutable.js

我們也可以在 shouldComponentUpdate() 中使用使用 deepCopy 和 deepCompare 來避免無必要的 render(),但 deepCopy 和 deepCompare 一般都是非常耗性能的。

Immutable Data 就是一旦創建,就不能再被更改的數據。對 Immutable 對象的任何修改或添加刪除操作都會返回一個新的 Immutable 對象。

Immutable 實現的原理是 Persistent Data Structure(持久化數據結構),也就是使用舊數據創建新數據時,要保證舊數據同時可用且不變。同時為了避免 deepCopy 把所有節點都復制一遍帶來的性能損耗,Immutable 使用了 Structural Sharing(結構共享),即如果對象樹中一個節點發生變化,只修改這個節點和受它影響的父節點,其它節點則進行共享。請看下面動畫:

Immutable 則提供了簡潔高效的判斷數據是否變化的方法,只需 === 和 is 比較就能知道是否需要執行 render(),而這個操作幾乎 0 成本,所以可以極大提高性能。修改后的 shouldComponentUpdate 是這樣的:

 

  1. import { is } from 'immutable'
  2.  
  3. shouldComponentUpdate: (nextProps = {}, nextState = {}) => { 
  4.   const thisProps = this.props || {}, thisState = this.state || {}; 
  5.  
  6.   if (Object.keys(thisProps).length !== Object.keys(nextProps).length || 
  7.       Object.keys(thisState).length !== Object.keys(nextState).length) { 
  8.     return true
  9.   } 
  10.  
  11.   for (const key in nextProps) { 
  12.     if (!is(thisProps[key], nextProps[key])) { 
  13.       return true
  14.     } 
  15.   } 
  16.  
  17.   for (const key in nextState) { 
  18.     if (thisState[key] !== nextState[key] || !is(thisState[key], nextState[key])) { 
  19.       return true
  20.     } 
  21.   } 
  22.   return false
  23.  
  24. react-immutable-render-mixin 

這是一個facebook/immutable-js的react pure render mixin 的庫,可以簡化很多寫法。
使用react-immutable-render-mixin可以實現裝飾器的寫法。

 

  1. import React from 'react'
  2. import { immutableRenderDecorator } from 'react-immutable-render-mixin'
  3.  
  4. @immutableRenderDecorator 
  5. class Test extends React.Component { 
  6.   render() { 
  7.     return <div></div>; 
  8.   } 

Immutable 詳解及 React 中實踐

無狀態組件

為了避免一定程度的浪費,react官方還在0.14版本中加入了無狀態組件,如下:

  1. // es6 
  2. const HelloMessage = (props) => <div>Hello {props.name}</div>; 

高階組件(接下來的方向)

大部分使用mixin和class extends的地方,高階組件都是更好的方案——畢竟組合優于繼承

參考文章

使用ES6編寫React應用(4):使用高階組件替代Mixins
Mixin 已死,Composition 萬歲

React同構直出(接下來方向)

同構基于服務端渲染,卻不止是服務端渲染。

React在減少重復渲染方面確實是有一套獨特的處理辦法,那就是virtual DOM,但顯示在首次渲染的時候React絕無可能超越原生的速度。因此,我們在做優化的時候,接下來可以做的事情就是:

首屏時間可能會比較原生的慢一些,但可以嘗試用React Server Render (又稱Isomorphic)去提高效率

責任編輯:張燕妮 來源: Pines_Cheng
相關推薦

2021-08-27 14:26:06

開發技能React

2019-02-25 07:07:38

技巧React 優化

2018-03-23 18:07:20

存儲

2023-11-01 17:57:56

React應用程序性能

2022-08-03 09:11:31

React性能優化

2025-10-29 01:25:00

CSSJS靜態提取

2022-05-23 13:44:53

前端開發優化

2012-09-11 15:43:32

HBase

2020-06-22 07:30:00

React開發工具

2019-03-14 15:38:19

ReactJavascript前端

2009-12-24 16:46:03

WPF性能優化

2020-12-20 10:02:17

ContextReactrender

2022-09-13 12:56:28

前端優化

2015-11-05 09:02:05

Java代碼性能優化

2017-12-04 12:29:15

前端JavaScript性能優化

2015-07-09 13:19:17

Ceph分布式存儲性能調優

2021-06-17 08:59:45

React前端優化

2022-03-11 10:23:02

React性能優化

2021-11-05 10:36:19

性能優化實踐

2010-12-10 10:17:21

關系型數據庫
點贊
收藏

51CTO技術棧公眾號

欧美日韩在线中文字幕| √天堂中文官网8在线| 亚洲福利影院| 国产精品污www在线观看| 亚洲一区二区三区久久| 国产精品自拍视频一区| 欧美特黄一级大片| 欧美xxxx在线观看| 北条麻妃视频在线| 亚洲卡一卡二| 久久久国产综合精品女国产盗摄| 国产精品狠色婷| 唐朝av高清盛宴| 欧美伦理影院| 亚洲国产97在线精品一区| 日韩av片网站| 天堂av中文在线观看| 自拍偷拍欧美激情| 欧美主播一区二区三区美女 久久精品人| 国产在成人精品线拍偷自揄拍| 日韩五码在线| 欧美尺度大的性做爰视频| 亚洲av无码一区二区三区人| 6080成人| 日韩一区二区在线看| 国产精品天天av精麻传媒| av白虎一区| 亚洲乱码国产乱码精品精可以看| 欧美日韩国产一二| 高清毛片aaaaaaaaa片| 激情伊人五月天久久综合| 青青久久av北条麻妃海外网| 男女免费视频网站| 国产电影一区二区在线观看| 亚洲欧美日韩中文在线制服| 蜜臀aⅴ国产精品久久久国产老师| 日本成人在线网站| 色婷婷精品大视频在线蜜桃视频| 免费av手机在线观看| 爆操欧美美女| 1000部国产精品成人观看| 日韩精品大片| 蜜桃视频在线免费| 91天堂素人约啪| 精品无人区一区二区三区竹菊| 精品人妻一区二区三区浪潮在线| 蜜桃视频一区二区三区在线观看| 日韩av免费在线播放| 欧美三级午夜理伦| 99精品免费| 51久久精品夜色国产麻豆| 日本三级网站在线观看| 亚洲精品123区| 国产综合在线看| 不卡的免费av| 亚洲精品婷婷| 欧美一区第一页| 成人公开免费视频| 日本美女一区二区三区视频| 国产精品久久久久免费a∨大胸| 成人免费视频国产免费| 日韩电影一区二区三区四区| 国产精品老女人精品视频| 国产三级理论片| 男人的j进女人的j一区| 国产精品综合久久久| 91麻豆国产在线| 国产在线播放一区二区三区 | 日本综合久久| 欧美午夜理伦三级在线观看| 不卡的在线视频| 亚洲福利合集| 日韩国产高清污视频在线观看| 疯狂揉花蒂控制高潮h| 亚洲国产最新| 中文字幕九色91在线| 日韩在线不卡av| 欧美日韩精品免费观看视频完整| 欧美精品videosex极品1| 国产剧情在线视频| 美女在线视频一区| 91精品久久久久久蜜桃| 五月婷婷六月激情| 欧美国产精品专区| 欧美黄色免费网址| 波多野结衣乳巨码无在线观看| 黑人巨大精品欧美一区二区一视频| 国产成人无码一二三区视频| 国产一区二区精品调教| 日韩欧美亚洲一区二区| 青青草福利视频| 婷婷丁香综合| 国外成人在线直播| 国产情侣免费视频| 国产不卡视频在线播放| 区一区二区三区中文字幕| 欧洲日本在线| 偷拍一区二区三区| 日韩高清第一页| 欧美亚洲大陆| 久久国产精品久久久久| 六月丁香激情综合| 国产一区在线观看麻豆| 久久精品国产精品国产精品污 | 久久久久久久人妻无码中文字幕爆| 日韩av资源网| 久久视频国产精品免费视频在线| 久久久久久久极品| 国产一区二区按摩在线观看| 欧洲在线视频一区| 免费在线看电影| 欧美美女一区二区在线观看| www.超碰97| 欧美人成网站| 国产日韩换脸av一区在线观看| 人妻少妇精品无码专区久久| 亚洲日本一区二区| 亚欧在线免费观看| 亚洲+变态+欧美+另类+精品| 欧美国产日韩一区| 一起草av在线| 国产欧美日韩卡一| 人妻熟女一二三区夜夜爱| 视频二区欧美毛片免费观看| 视频一区视频二区国产精品 | 精品视频在线免费看| 中文字幕影片免费在线观看| 午夜性色一区二区三区免费视频| 国产精品久久久久久久久久三级| 欧美在线精品一区二区三区| 亚洲欧美日韩在线不卡| 99sesese| 久久高清精品| 国产欧美va欧美va香蕉在| 久草福利在线| 色婷婷久久综合| 亚洲区免费视频| 亚洲欧美视频| 久久亚洲国产精品日日av夜夜| 成年网站在线视频网站| 欧美mv日韩mv国产网站app| 天天色影综合网| 久久精品免费观看| 国产系列第一页| 亚洲美女色播| 免费不卡在线观看av| 国产男女裸体做爰爽爽| 亚洲色图视频免费播放| 加勒比av中文字幕| 欧美69wwwcom| 国产精品国模大尺度私拍| 羞羞污视频在线观看| 日韩欧美国产一区二区三区| 日韩女优一区二区| 高清不卡一二三区| 可以在线看的av网站| 欧美重口另类| 国产91色在线| 色开心亚洲综合| 欧美一区二区在线看| 亚洲熟女www一区二区三区| 国产a久久麻豆| 中国丰满熟妇xxxx性| 台湾佬综合网| 国产精品视频xxxx| 黄色在线播放网站| 欧美大片一区二区三区| 五月天婷婷综合网| 久久综合视频网| 欧美大尺度做爰床戏| 亚欧美无遮挡hd高清在线视频| 亚洲xxxx视频| 国产v日韩v欧美v| 亚洲视频自拍偷拍| 国产男女无套免费网站| 亚洲午夜羞羞片| 成年人在线观看av| 久久99热这里只有精品| av久久久久久| 偷窥自拍亚洲色图精选| 国产欧美精品日韩| 国产又色又爽又黄刺激在线视频| 亚洲美女激情视频| 99热这里只有精品5| 亚洲成av人影院| 亚洲第一综合网| 国产精品一卡二卡在线观看| 国产主播在线看| 99久久夜色精品国产亚洲96| 国外成人免费视频| 亚洲福利影视| 538国产精品视频一区二区| 秋霞午夜在线观看| 亚洲精品中文字幕有码专区| 国产免费黄色片| 在线观看日韩国产| 久久高清无码视频| 国产精品丝袜久久久久久app| 一区二区三区国产好的精华液| 国产精品视频| 在线观看三级网站| av亚洲免费| 国产一区二区三区四区五区加勒比 | 999在线免费视频| 欧美日韩1区| 水蜜桃一区二区| 日本福利一区| 99se婷婷在线视频观看| 最新日韩一区| 97超碰国产精品女人人人爽| 天天干在线视频论坛| 这里只有精品在线观看| 亚洲av毛片成人精品| 精品国产免费视频| 国产精品污视频| 欧美制服丝袜第一页| 欧美bbbbbbbbbbbb精品| 一区二区三区精品视频| 欧美a在线播放| 久久亚洲综合色| 国产人妻黑人一区二区三区| 国产美女主播视频一区| 国内外成人免费在线视频| 乱码第一页成人| 国产精品999视频| 午夜视频一区| 老司机激情视频| 欧美99久久| 黄色a级在线观看| 久久免费大视频| 亚洲第一导航| 欧美日韩中文字幕一区二区三区| 久久精品午夜一区二区福利| 精品久久97| 国产欧美一区二区在线播放| 亚洲视频一起| 国产成人精品免费视频大全最热| 国产aa精品| 92看片淫黄大片欧美看国产片| 少妇高潮一区二区三区99| 国产精品丝袜白浆摸在线| 婷婷综合六月| 国产精品极品美女在线观看免费 | 成人在线一区二区| 91麻豆精品国产综合久久久 | 欧美jizzhd精品欧美巨大免费| 中文字幕不卡每日更新1区2区| 日韩精品免费| 一区二区三区四区欧美日韩| 久久久久国产精品| 日韩最新中文字幕| 欧美a级片一区| 欧美成人三级在线视频| 国产精品久久久久久模特| 欧美a在线视频| 日本欧美韩国一区三区| 亚洲欧美日韩综合网| 精品一区二区三区在线播放| 中文字幕乱妇无码av在线| 国产成人久久精品77777最新版本| 女同性αv亚洲女同志| 不卡区在线中文字幕| 青青草视频成人| 国产精品毛片无遮挡高清| 日本黄色片免费观看| 亚洲一区免费观看| 日韩久久精品视频| 在线影院国内精品| 国产丝袜在线视频| 精品999久久久| 男人的天堂在线视频| 北条麻妃一区二区三区中文字幕| 2021国产在线| 欧美最近摘花xxxx摘花| www.一区| 国产精品一区二区免费| 啪啪亚洲精品| 白白操在线视频| 久久婷婷影院| 在线观看中文av| 26uuu国产一区二区三区| 欧美激情视频二区| 亚洲香蕉伊在人在线观| 波多野结衣黄色网址| 91精品国产高清一区二区三区蜜臀| 黑人乱码一区二区三区av| 亚洲人午夜色婷婷| 1区2区在线观看| 日本久久久久久久| 日韩精品久久久久久久软件91| 免费一区二区三区| 中国精品18videos性欧美| 欧美色图另类小说| 精品一区二区在线看| 亚洲精品乱码久久| 亚洲日本成人在线观看| 亚洲va在线观看| 日韩一区二区三区在线观看| 韩国三级av在线免费观看| 九九热视频这里只有精品| 日韩中文影院| 国产日韩久久| 亚洲a在线视频| 爱情岛论坛成人| 99视频精品全部免费在线| 日本高清不卡免费| 色88888久久久久久影院按摩| 亚洲美女性生活| 日韩在线视频一区| 亚洲成人短视频| 国产精品有限公司| 亚洲精品在线观看91| 中文字幕国产传媒| 91丝袜美腿高跟国产极品老师 | 3d精品h动漫啪啪一区二区| 黄色不卡一区| 国产网站免费在线观看| 懂色av一区二区在线播放| 美国一级片在线观看| 在线一区二区观看| 全色精品综合影院| 国内精品久久久久影院 日本资源| 国产精品麻豆| 一区二区日本伦理| 免费视频最近日韩| 婷婷色一区二区三区| 色欧美88888久久久久久影院| 欧美自拍第一页| 久久久综合av| 超碰成人免费| 美女黄色免费看| 国产精品 欧美精品| 亚洲天堂黄色片| 69堂国产成人免费视频| 免费在线看黄网站| 国产日韩在线亚洲字幕中文| 第一会所sis001亚洲| 免费激情视频在线观看| 久久久久久久久久久电影| 国产一区二区99| 亚洲精选在线观看| 高清不卡亚洲| 欧美视频小说| 青青草原综合久久大伊人精品优势| 欧美 日韩 国产 成人 在线观看 | 涩涩网站在线看| 亚洲欧美中日韩| 999av视频| 欧美黑人巨大精品一区二区| 在线日韩成人| 每日在线观看av| 91丨porny丨国产入口| 成年人视频在线免费看| 亚洲精品在线视频| jvid一区二区三区| 超碰在线免费观看97| 盗摄精品av一区二区三区| 国产对白videos麻豆高潮| 精品视频在线播放免| 欧洲精品一区二区三区| 亚欧精品在线| 国产高清精品在线| 国产福利拍拍拍| 伊人久久五月天| 91麻豆精品一二三区在线| 国产高潮呻吟久久久| 成人午夜精品一区二区三区| 成人精品在线看| 中文字幕v亚洲ⅴv天堂| 99久久999| 国产人妻777人伦精品hd| 久久久久久久久久久久久久久99 | 久久综合电影一区| 91精品国产自产精品男人的天堂 | 亚洲欧美日韩图片| 日韩成人综合网| 97碰在线视频| 久久久精品人体av艺术| 国产三级在线观看视频| 91精品国产精品| 色88久久久久高潮综合影院| 日本一区二区免费视频| 91国偷自产一区二区使用方法| 二区三区四区高清视频在线观看| 国产乱码一区| 免费成人性网站| 精品深夜av无码一区二区老年| 亚洲人成电影网| 日韩精品一区二区三区中文字幕 | 97av中文字幕| 久久久久国产精品麻豆ai换脸 | 国产激情一区二区三区四区 | 日韩成人dvd| 免费一级全黄少妇性色生活片| 亚洲另类图片色| 国产精品白丝久久av网站| 国产第一页视频| 亚洲制服欧美中文字幕中文字幕| av在线电影网| 久久国产精品久久精品国产|