久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > React應(yīng)用的4種性能優(yōu)化技術(shù)

React應(yīng)用的4種性能優(yōu)化技術(shù)

來源:千鋒教育
發(fā)布人:syq
時(shí)間: 2022-09-13 18:06:02 1663063562

  還有很多其他方法可以優(yōu)化 React 應(yīng)用程序。并非所有應(yīng)用都適用于每個(gè)應(yīng)用,也不是你所做的每件事都會(huì)顯著提高性能。我最近被分配了一個(gè)任務(wù),上面寫著“提高應(yīng)用程序的性能”。這是我在記錄這段旅程。

7

  步驟 1 — 查找性能開始下降的方案

  我很幸運(yùn),當(dāng)我被告知性能下降如此之大以至于用戶體驗(yàn)絕對無法忍受時(shí),我被告知了這種情況。要找出所有此類方案,需要嚴(yán)格地繼續(xù)在應(yīng)用程序上執(zhí)行各種操作,并在性能開始下降時(shí)繼續(xù)監(jiān)視。沒有直接的方法可以做到這一點(diǎn),唯一的方法是讓越來越多的人使用該應(yīng)用程序并報(bào)告他們的經(jīng)歷。另一種方法也可能是生成大量虛擬數(shù)據(jù),并嘗試將所有這些數(shù)據(jù)加載到UI上,看看它的表現(xiàn)如何。此外,不要指望一次找到所有方案,你會(huì)不時(shí)發(fā)現(xiàn)它們,然后你可以執(zhí)行以下步驟來提高每個(gè)方案的性能。

  步驟2 - 調(diào)試并嘗試找到真正的罪魁禍?zhǔn)?/strong>

  下一步是調(diào)試并查看真正導(dǎo)致性能滯后或下降的原因。為此,你可以在開發(fā)工具中使用探查器,還可以突出顯示在特定操作上重新呈現(xiàn)的所有組件。對我來說,這兩個(gè)效果最好,因?yàn)樗鼈兛梢詭椭依斫庵匦落秩镜膬?nèi)容,并且分析器也會(huì)告訴您原因。探查器還將告訴你哪些組件需要多少時(shí)間來呈現(xiàn),以及你的應(yīng)用總共需要多少周期才能達(dá)到就緒狀態(tài)。此外,如果我看到嵌套循環(huán)并查看這些循環(huán)是否花費(fèi)大量時(shí)間才能完成,我也使用javascript中的conport.time()方法。在我的場景中,我得到了一些提醒,即我們使用的 React 上下文導(dǎo)致了主要問題。

  單擊此處閱讀有關(guān) React 分析器的所有信息。

  步驟 3 — 使用以下技術(shù)提高性能

  在本節(jié)中,我將列出我所做的幫助我提高應(yīng)用性能的操作。

  從狀態(tài)中刪除了實(shí)際上不需要重新渲染組件的變量:

  我們有兩個(gè)上下文,并且大約有10-15個(gè)狀態(tài)變量。這樣做的問題是,每次由于setState而重新渲染上下文時(shí),它都會(huì)繼續(xù)進(jìn)行并導(dǎo)致使用上下文的所有子項(xiàng)重新渲染。我刪除了所有沒有理由繼續(xù)重新呈現(xiàn)組件的狀態(tài)變量,我還刪除了作為值傳遞給上下文提供程序的所有變量,這些變量可以派生或未在整個(gè)應(yīng)用中的任何地方使用。這是一個(gè)重要的學(xué)習(xí),我們傾向于把一切都放在上下文中,而你應(yīng)該只添加你真正需要的東西。

  在正確的地方使用了上下文:

  我看到在一些組件中,我們調(diào)用了上下文,但沒有真正使用上下文的任何屬性。相反,我們將其作為道具傳遞給子組件。這會(huì)導(dǎo)致大量重新呈現(xiàn),因?yàn)樵谏舷挛闹兄匦鲁尸F(xiàn)會(huì)觸發(fā)組件 A 重新呈現(xiàn),這將導(dǎo)致組件 B、C 和 D 的所有子級重新呈現(xiàn)。只有組件 D 中才需要上下文,因此我直接將上下文移動(dòng)到子組件。我對我看到的每個(gè)地方都這樣做了,上下文變量作為 prop 傳遞給子組件。

  添加了空值和空檢查:

  我看到我們呈現(xiàn)了一個(gè)子組件,該子組件需要來自父組件和子組件內(nèi)部的一些數(shù)據(jù),該組件添加了對存在數(shù)據(jù)的檢查。這種方法沒有錯(cuò),但是如果子組件作為少數(shù)組件使用Effects或正在調(diào)用其他API,則將數(shù)據(jù)作為空/空檢查移動(dòng)到父組件是有意義的。您根本不需要將子組件呈現(xiàn)給 DOM,因?yàn)樗鼪]有值。這將節(jié)省應(yīng)用在呈現(xiàn)子項(xiàng)并調(diào)用其中的所有掛鉤和 API 時(shí)可能遇到的所有性能影響。

  重構(gòu)代碼:

  我執(zhí)行的一個(gè)一般步驟是嘗試?yán)斫饩帉懙拇a,特別是在數(shù)據(jù)作或添加到數(shù)組中,或者我們使用嵌套循環(huán)等。將數(shù)組轉(zhuǎn)換為有意義的映射,進(jìn)一步從use中刪除變量效果依賴項(xiàng)數(shù)組,因?yàn)樗鼈儧]有添加任何值,最后還刪除了對沒有多大意義的數(shù)據(jù)的檢查。對于不同的應(yīng)用程序,此步驟可能會(huì)有所不同,并且必須非常小心地完成,因?yàn)槟幌M茐囊呀?jīng)工作的內(nèi)容。因此,理想情況下,嘗試盡可能深入地首先理解邏輯,然后如果您有信心,請繼續(xù)重構(gòu)它。

  結(jié)論

  使用上述方法,我能夠?yàn)槲业膽?yīng)用減少大約 25-30 次重新渲染。將初始頁面加載時(shí)間縮短了幾秒鐘,并將響應(yīng)時(shí)間縮短了一兩秒(在性能受到重大影響的情況下)。這是一段旅程,我仍在努力讓它變得更好:D

  最后,還有很多其他方法可以優(yōu)化 React 應(yīng)用程序。并非所有應(yīng)用都適用于每個(gè)應(yīng)用,也不是你所做的每件事都會(huì)顯著提高性能。有時(shí)問題很清楚,解決它們會(huì)使應(yīng)用程序具有高性能,在其他情況下,問題很復(fù)雜,很難增加任何性能改進(jìn)。但總而言之,優(yōu)化你的代碼是一個(gè)有趣的旅程,你可以學(xué)到很多東西,大多數(shù)時(shí)候,學(xué)習(xí)一個(gè)交易技巧,你覺得為什么我之前不知道這一點(diǎn)?

  經(jīng)?;〞r(shí)間重構(gòu)代碼,經(jīng)?;〞r(shí)間評估性能,因?yàn)槿绻悴贿@樣做,它可能會(huì)突然變得太晚。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
什么是PlatformIo?

PlatformIO是什么PlatformIO是一個(gè)全面的物聯(lián)網(wǎng)開發(fā)平臺(tái),它為眾多硬件平臺(tái)和開發(fā)環(huán)境提供了統(tǒng)一的工作流程,有效簡化了開發(fā)過程,并能兼容各種...詳情>>

2023-10-14 12:55:06
云快照與自動(dòng)備份有什么區(qū)別?

1、定義和目標(biāo)不同云快照的主要目標(biāo)是提供一種快速恢復(fù)數(shù)據(jù)的方法,它只記錄在快照時(shí)間點(diǎn)后的數(shù)據(jù)變化,而不是所有的數(shù)據(jù)。自動(dòng)備份的主要目標(biāo)...詳情>>

2023-10-14 12:48:59
服務(wù)器為什么要用Linux?

服務(wù)器為什么要用Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,Linux在眾多選擇中脫穎而出。Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,有其獨(dú)特的優(yōu)勢和特點(diǎn)。包括其...詳情>>

2023-10-14 12:34:11
ORM解決的主要問題是什么?

ORM(對象關(guān)系映射)解決的主要問題是將關(guān)系數(shù)據(jù)庫與面向?qū)ο缶幊讨g的映射困境。在傳統(tǒng)的關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)以表格的形式存儲(chǔ),而在面向?qū)ο?..詳情>>

2023-10-14 12:26:19
Go為什么不支持三元運(yùn)算符?

Go為什么不支持三元運(yùn)算符Go語言是一種以簡潔和有效性為目標(biāo)的編程語言,因此在設(shè)計(jì)過程中,Go的設(shè)計(jì)者刻意排除了一些他們認(rèn)為可能導(dǎo)致復(fù)雜性或...詳情>>

2023-10-14 12:12:36
快速通道