REACT性能優(yōu)化

在react內(nèi)部其實已經(jīng)使用了許多的技術去使得更新ui時對dom的操作代價最小化猎拨。對許多應用來說,使用react可以在沒有使用特別優(yōu)化手段的情況下獲得更快的用戶界面,即使如此,我們的react仍然有著許多的方式可以使得應用更加流暢酪耳。

使用生產(chǎn)環(huán)境下的構建

如果你在對你的應用進行性能分析或者遇到了性能問題,請確保你在打包構建應用時使用了生產(chǎn)環(huán)境下的配置項刹缝。
開發(fā)環(huán)境即development mode下碗暗,react會提供許多有用的警告,但這些警告功能會使得應用體積增加赞草、反應速度變慢讹堤,所以你應該確保使用生產(chǎn)環(huán)境下的打包編譯配置。
如果你無法確定你的打包過程是否正確厨疙,你可以通過安裝chrome的插件來檢查。https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi

create-react-app

如果你使用的是create-react-app來創(chuàng)建并打包編譯項目疑务,當你運行npm run build 時沾凄,就會得到一個生產(chǎn)環(huán)境下的編譯結果,但請記住知允,這僅僅在部署階段才時必要的撒蟀,在開發(fā)時請使用npm start

single-file builds

我們提供了適用于生產(chǎn)環(huán)境的react和react-dom庫文件。

<script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
Brunch

使用webpack插件 uglify-js-brunch 可以將你的js文件最小化

yarn add --dev uglify-js-brunch
brunch build -p

但請注意温鸽,這種做法只建議在生產(chǎn)環(huán)境下使用保屯,因為會去掉react的警告功能,并且這種打包過程會消耗更多的時間涤垫。

展示長列表

如果你的應用會渲染大量的列表數(shù)據(jù)姑尺,我們建議使用一種稱為‘windowing’的技術,這種技術下在任何給定的時間內(nèi)只會渲染一小部分數(shù)據(jù)列表蝠猬,并可以減少列表項的重復渲染(即再次渲染已經(jīng)渲染過的數(shù)據(jù))切蟋。

react-windowreact-virtualized都是流行的使用windowing技術的庫,他們都提供了一系列可重用的組件榆芦,這些組件能夠幫助你以最好的性能展示列表以及表格數(shù)據(jù)柄粹。你也可以自己實現(xiàn)自己的windowing組件喘鸟,如果你需要某些高度定制化的功能的話。

避免 reconciliation

react在內(nèi)部維護著一個代表其ui結構的對象驻右,它包含了從你的組件中返回的元素什黑,這個對象有效避免了react對真實dom進行不必要的操作,因為操作真實dom所耗費的性能遠遠大于操作js對象堪夭,我們通常將這個js對象稱為‘虛擬dom’愕把,當一個組件的屬性或者性質(zhì)發(fā)生改變的時候,react會根據(jù)新生成的元素與之前虛擬dom的元素是否一致來決定是否重新渲染真實dom茵瘾。
即使react只會更新真正發(fā)生改變的dom礼华,這仍然需要一點時間來完成,當然這在大多數(shù)情況下都是在難以察覺的一瞬間完成的拗秘,但如果這個過程真的造成了可察覺的延遲現(xiàn)象圣絮,就需要使用鉤子函數(shù)shoudComponentUpdate來重寫其判斷過程,這個鉤子函數(shù)會在更新組件之前執(zhí)行并決定著該組件是否會更新雕旨。
如果你明確知道你的組件在何種情況下需要或是不需要更新扮匠,你可以通過改寫這個鉤子函數(shù)來跳過其內(nèi)部默認的reconciliation過程。
大多數(shù)情況下凡涩,我們會使用繼承PureComponent而不是改寫鉤子函數(shù)來處理上述問題棒搜,PureComponent在進行reconciliation時僅僅會對組件的屬性和狀態(tài)進行淺層比較。

使用 immutable.js

當我們使用了PureCOmponen時活箕,無法追蹤到深層對象屬性的變化力麸,因此會造成某些異常表現(xiàn),但是每次對深層對象進行復制又會產(chǎn)生額外的性能開銷育韩,好在immutablejs致力于解決這一點并卓有成效克蚂,我們可以對immutable對象進行基于內(nèi)容的比較而不是基于指針地址的比較。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筋讨,一起剝皮案震驚了整個濱河市埃叭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悉罕,老刑警劉巖赤屋,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壁袄,居然都是意外死亡类早,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門然想,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莺奔,“玉大人,你說我怎么就攤上這事×钣矗” “怎么了恼琼?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屏富。 經(jīng)常有香客問我晴竞,道長,這世上最難降的妖魔是什么狠半? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任噩死,我火速辦了婚禮,結果婚禮上神年,老公的妹妹穿的比我還像新娘已维。我一直安慰自己,他們只是感情好已日,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布垛耳。 她就那樣靜靜地躺著,像睡著了一般飘千。 火紅的嫁衣襯著肌膚如雪堂鲜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天护奈,我揣著相機與錄音缔莲,去河邊找鬼。 笑死霉旗,一個胖子當著我的面吹牛痴奏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厌秒,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抛虫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了简僧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雕欺,失蹤者是張志新(化名)和其女友劉穎岛马,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屠列,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡啦逆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笛洛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夏志。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖苛让,靈堂內(nèi)的尸體忽然破棺而出沟蔑,到底是詐尸還是另有隱情湿诊,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布瘦材,位于F島的核電站厅须,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏食棕。R本人自食惡果不足惜朗和,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望簿晓。 院中可真熱鬧眶拉,春花似錦、人聲如沸憔儿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皿曲。三九已至唱逢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屋休,已是汗流浹背坞古。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劫樟,地道東北人痪枫。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像叠艳,于是被迫代替她去往敵國和親奶陈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容