摘要:你可以使用這個(gè)技術(shù)在構(gòu)建時(shí)間生成。谷歌實(shí)際上是在年開(kāi)始抓取素材的,這個(gè)算法現(xiàn)在已經(jīng)可以完美地工作了。閉包在無(wú)處不不在,并且你可能一直使用到它,即使你還沒(méi)有注意到。但是你在方法中使用閉包時(shí),它確實(shí)是不好的。
原文:5 common practices that you can stop doing in React
從下面這點(diǎn)來(lái)說(shuō),很難說(shuō)React是這個(gè)星球上最受歡迎的庫(kù)之一。很多人對(duì)React感興趣,新的開(kāi)發(fā)者之所以傾向于使用這個(gè)框架的原因是因?yàn)樗腢I優(yōu)先方法。雖然這些年React和它的整個(gè)生態(tài)已經(jīng)比較成熟,但是在某些情況下你仍然會(huì)這樣問(wèn)自己:“正確的做法到底是什么?”
這是一個(gè)好問(wèn)題--并不總是有一個(gè)通用的“正確”的做事方式。事實(shí)上,正如你所知,最佳實(shí)踐并不總是那么的適用。長(zhǎng)遠(yuǎn)來(lái)看,其中的某些寫法可能會(huì)影響性能,可讀性,并導(dǎo)致效率低下。
在本文中,我將描述在React開(kāi)發(fā)中5種被普遍接受的寫法,但是實(shí)際上你是可以避免這樣做的。當(dāng)然,我將解釋為什么我認(rèn)為這些做法是可以避免的,并且我會(huì)建議你用其他的寫法來(lái)完成相同的事情。
從一開(kāi)始就優(yōu)化ReactReact的開(kāi)發(fā)人員在如何使React更快投入了大量的精力,每次迭代新的優(yōu)化方法又會(huì)被添加進(jìn)去。在我看來(lái),你不應(yīng)該花費(fèi)時(shí)間優(yōu)化這些東西,除非你發(fā)現(xiàn)了真正的性能影響。
為什么?
React相比其它的前端平臺(tái)更容易擴(kuò)展,因?yàn)槟悴槐刂貙懩硞€(gè)模塊來(lái)加快應(yīng)用的速度。導(dǎo)致性能問(wèn)題的罪魁禍?zhǔn)淄ǔJ?b>React使用更新虛擬DOM的reconciliation過(guò)程。
讓我們看一下React是如何處理下面的事情的。在每個(gè)render()中,React生成了一個(gè)由UI元素組成的樹(shù)——子節(jié)點(diǎn)是實(shí)際的DOM元素。當(dāng)state或者props更新的時(shí)候,React需要使用最小的改變次數(shù)來(lái)生成一個(gè)新的樹(shù),并保持可預(yù)測(cè)性。
想象一下,你看到的樹(shù)是這個(gè)樣子的:
想象一下,你的應(yīng)用接收到新的數(shù)據(jù),下列的節(jié)點(diǎn)需要被更新:
React通常會(huì)重新渲染整個(gè)子樹(shù),而不是像這樣僅僅渲染相關(guān)節(jié)點(diǎn):
當(dāng)頂層組件的state發(fā)生改變的時(shí)候,它的子元素都會(huì)重新渲染。這是默認(rèn)的行為,在小型應(yīng)用中不需要擔(dān)心。隨著應(yīng)用的逐漸擴(kuò)展,您應(yīng)該考慮使用Chrome Profiling工具來(lái)測(cè)量實(shí)際性能。這個(gè)工具將為你提供在不必要的渲染上所浪費(fèi)時(shí)間的精確數(shù)據(jù)。如果這些數(shù)據(jù)很重要,你可以通過(guò)向你的組件中添加shouldComponentUpdate鉤子來(lái)優(yōu)化你的渲染時(shí)間。
這個(gè)鉤子在重新渲染開(kāi)始之前將被觸發(fā),默認(rèn)返回true:
shouldComponentUpdate(nextProps, nextState) { return true; }
當(dāng)返回true時(shí),React的diff算法接管并重新渲染整個(gè)子樹(shù)。你能避免這樣的情況發(fā)生,通過(guò)在shouldComponentUpdate中添加比較邏輯,并且僅當(dāng)相關(guān)的props發(fā)生改變的時(shí)候更新邏輯。
shouldComponentUpdate(nextProps, nextState) { if (this.props.color !== nextProps.color) { return true; } if (this.state.count !== nextState.count) { return true; } return false; }
除了color/count,其它任何props/state改變,這個(gè)組件都不會(huì)更新。
除此之外,還有一些開(kāi)發(fā)人員通常忽略的non-React優(yōu)化技巧,但它們會(huì)影響應(yīng)用程序的性能。
我將在下面列舉一些可以避免的習(xí)慣和解決方案:
未優(yōu)化的圖片--如果你的應(yīng)用中有很多動(dòng)態(tài)圖片,你需要在處理圖片時(shí)考慮你的選項(xiàng)。較大的圖片可能會(huì)給用戶一種應(yīng)用很慢的印象。在將圖片推入服務(wù)器之前壓縮圖片,或者使用動(dòng)態(tài)圖片處理解決方案來(lái)替代。我個(gè)人喜歡Cloudinary來(lái)優(yōu)化react圖片因?yàn)樗兴约旱?b>react庫(kù),但是你也可以使用Amazon S3或者Firebase。
未壓縮的構(gòu)建文件--Gzipping構(gòu)建文件(bundle.js)可以有效的減少文件大小。你需要修改webserver的配置文件。Webpack有一個(gè)gzip壓縮插件,叫做compression-webpack-plugin。你可以使用這個(gè)技術(shù)在構(gòu)建時(shí)間生成bundle.js.gz。
服務(wù)端渲染的SEO雖然單頁(yè)面應(yīng)用非常棒,但是他們?nèi)匀淮嬖趦蓚€(gè)問(wèn)題。
當(dāng)應(yīng)用首次加載的時(shí)候,瀏覽器中沒(méi)有JavaScript緩存。如果應(yīng)用很大,首次加載應(yīng)用的時(shí)間將會(huì)很慢。
由于應(yīng)用程序是在客戶端進(jìn)行渲染,搜索引擎使用的web爬蟲(chóng)程序?qū)o(wú)法索引JavaScript生成的內(nèi)容。搜索引擎將看到你的應(yīng)用是空白的,然后排名很差。
這就是服務(wù)端渲染技術(shù)派上用處的地方。在SSR中,JavaScript內(nèi)容最初是由服務(wù)器渲染的。在首次渲染后,客戶端的腳本接管,并像一個(gè)正常的SPA應(yīng)用運(yùn)行。由于你需要使用Node/Express服務(wù),因此在以傳統(tǒng)SSR進(jìn)行構(gòu)建時(shí)復(fù)雜度和花費(fèi)更高。
如果你是為了搜索引擎優(yōu)化、谷歌索引和沒(méi)有任何問(wèn)題地抓取JavaScript內(nèi)容,那么有一個(gè)好消息。谷歌實(shí)際上是在2016年開(kāi)始抓取JavaScript素材的,這個(gè)算法現(xiàn)在已經(jīng)可以完美地工作了。
以下是2015年10月Webmaster博客的節(jié)選。
今天,只要你不阻止Googlebot抓取你的JavaScript或CSS文件,我們就能像現(xiàn)代瀏覽器一樣渲染和理解你的網(wǎng)頁(yè)。為了反映這一改進(jìn),我們最近更新了我們的技術(shù)站長(zhǎng)指南,建議不要禁止Googlebot抓取你網(wǎng)站的CSS或JS文件。
如果你使用服務(wù)器端渲染,是因?yàn)槟銚?dān)心你的谷歌頁(yè)面排名,那么你不需要使用SSR。它曾經(jīng)是過(guò)去的事,但現(xiàn)在不是了。
然而,如果你正在改善首次渲染速度,那么你應(yīng)該嘗試使用像Next.js這樣的庫(kù)來(lái)實(shí)現(xiàn)更加簡(jiǎn)單的SSR。Next將節(jié)省你在設(shè)置Node/Express 服務(wù)所花費(fèi)的時(shí)間。
Inline styles和CSS imports在使用React做開(kāi)發(fā)時(shí),我曾親自嘗試過(guò)多種不同的樣式理念,為了能找到一種新的引入樣式到React組件的方式。在React組件中使用已經(jīng)存在多年的傳統(tǒng)的CSS-in-CSS 方法。你的樣式表全部樣放在一個(gè)樣式表目錄,然后你可以將所需要的CSS導(dǎo)入到你的組件中。
然而,當(dāng)你使用這些組件的時(shí)候,樣式表不再清晰明了。React鼓勵(lì)你以組件化的方式來(lái)思考你的應(yīng)用,然而樣式表則強(qiáng)迫你以文檔的角度來(lái)思考。
目前有多種方法將CSS和JS代碼合并到一個(gè)文件中。內(nèi)聯(lián)樣式可能是其中最流行的。
const divStyle = { margin: "40px", border: "5px solid pink" }; const pStyle = { fontSize: "15px", textAlign: "center" }; const TextBox = () => (); export default TextBox;Yeah!
你不需要再導(dǎo)入CSS,但是這會(huì)犧牲可讀性和可維護(hù)性。除了這樣做,內(nèi)聯(lián)樣式不支持媒體查詢,偽元素以及樣式回退。當(dāng)然,有一些技巧可以讓你解決上述問(wèn)題,但是使用起來(lái)卻并不方便。
這就是CSS-in-JSS派上用處的地方,內(nèi)聯(lián)樣式并不完全是CSS-in-JSS。下面的代碼演示了使用styled-components的概念。
import styled from "styled-components"; const Text = styled.div` color: white, background: black `This is CSS-in-JS
在瀏覽器中看上去是這樣的:
This is CSS-in-JS
新的標(biāo)簽被添加到了頂層的DOM中,不像內(nèi)聯(lián)樣式,實(shí)際的CSS樣式在這里生成。所以,任何能在CSS運(yùn)行的東西,在樣式組件中也能工作。此外,這個(gè)技術(shù)還增強(qiáng)了CSS,改善了可讀性并且適用到組件的架構(gòu)中。使用styled-components 庫(kù),你還可以得到SASS的支持。
嵌套的條件運(yùn)算符條件運(yùn)算符在React中很常用。它是我用來(lái)創(chuàng)建狀態(tài)語(yǔ)句的go-to操作符,在render()方法中得到了很好的應(yīng)用。例如,在下列中它們幫助你以內(nèi)聯(lián)的方式渲染元素,我使用它來(lái)顯示登入狀態(tài)。
render() { const isLoggedIn = this.state.isLoggedIn; return (The user is {isLoggedIn ? "currently" : "not"} logged in.); }
然而,當(dāng)你一次又一次的嵌套條件運(yùn)算符,它們可能變的丑陋并且難以閱讀。
int median(int a, int b, int c) { return (a如你所見(jiàn),速記符號(hào)更加的簡(jiǎn)潔,但是它們往往會(huì)使代碼看起混亂。想象一下如果在你的結(jié)構(gòu)中有12個(gè)或者更多嵌套的條件運(yùn)算符。這比你所認(rèn)為的要常發(fā)生。一旦開(kāi)始使用條件運(yùn)算符,就很容易繼續(xù)嵌套它,最后,您會(huì)發(fā)現(xiàn)需要一種更好的技術(shù)來(lái)處理狀態(tài)渲染。
但好的方面是你有很多其它的選擇。你可以使用增強(qiáng)JSX控制語(yǔ)句的babel插件,用來(lái)擴(kuò)展JSX以包含用于條件語(yǔ)句和循環(huán)的組件。
// before transformationTruth // after transformation { test ? Truth : null }這里有另外一個(gè)流行的技術(shù)叫做iify(IIFE--立即執(zhí)行函數(shù)表達(dá)式)。它是一個(gè)在聲明之后會(huì)立即執(zhí)行的匿名函數(shù)。
(function() { // Do something? } )()為了使匿名函數(shù)成為函數(shù)表達(dá)式,我們將函數(shù)封裝在一對(duì)括號(hào)中。這個(gè)模式在JavaScript中很流行,原因有很多。但是在React里,我們可以把所有if/else語(yǔ)句放到函數(shù)中,然后返回我們想要渲染的內(nèi)容。
這里有一個(gè)例子演示我們?cè)鯓釉?b>React中使用IFFE。
{ (() => { if (this.props.status === "PENDING") { return (); } else { return (); })() }IIFE可能對(duì)性能有所影響,但是在大多數(shù)情況下不會(huì)有太大的影響。這里有更多的方法來(lái)運(yùn)行React中的條件語(yǔ)句,并且我們已經(jīng)在用于React中狀態(tài)渲染的8個(gè)方法中有所說(shuō)明。
在React中的閉包閉包是一個(gè)獲取外部函數(shù)變量和參數(shù)的內(nèi)部函數(shù)。閉包在JavaScript無(wú)處不不在,并且你可能一直使用到它,即使你還沒(méi)有注意到。
class SayHi extends Component { render () { return () { } } }但是你在render()方法中使用閉包時(shí),它確實(shí)是不好的。每當(dāng)SayHi組件重新渲染,新的匿名會(huì)被重新創(chuàng)建并傳入到Button組件中。雖然porps沒(méi)有改變,但是 將被強(qiáng)制重新渲染。正如前面所言,重復(fù)的渲染會(huì)直接帶來(lái)性能的損耗。
因此,使用類方法來(lái)代替閉包。類方法可讀性更高并且更容易調(diào)試。
class SayHi extends Component { showHiMessage = this.showMessage("Hi") render () { return () { } } }結(jié)論當(dāng)一個(gè)平臺(tái)逐漸擴(kuò)大,每天都會(huì)出現(xiàn)新的模式。一些模式幫助你改善整個(gè)工作流程。而其它的一些方式則會(huì)有明顯的副作用。當(dāng)副作用影響應(yīng)用的性能的時(shí)候或者可讀性時(shí),最好是尋找替代方案。在本文中,我介紹了一些因?yàn)樗鼈兊娜秉c(diǎn),你可以在React中避免的做法。
您對(duì)React的看法和最佳做法是什么?在評(píng)論中分享它們。(想看評(píng)論直接去原文看吧)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97076.html
摘要:為了使用它們,您可以向組件添加一個(gè)屬性,該屬性的值是一個(gè)回調(diào)函數(shù),它將接收底層的元素或組件的已掛接實(shí)例,作為其第一個(gè)參數(shù)。通常最好使用另一個(gè)生命周期方法,而不是依賴這個(gè)回調(diào)函數(shù),但是很高興知道它存在。 React 常見(jiàn)的面試題 (在 React 里面,你可以知道也可以不知道的事, 但是你會(huì)發(fā)現(xiàn)他們確實(shí)很有用) 根據(jù)記錄,問(wèn)這些問(wèn)題可能不是深入了解他們?cè)谑褂?React 方面的經(jīng)驗(yàn)的最...
摘要:在中由于業(yè)務(wù)的需要我們往往要在諸多的頁(yè)面間,組件之間做一些參數(shù)的傳遞與管理在這里我總結(jié)了幾大經(jīng)過(guò)驗(yàn)證,穩(wěn)定好用的方式給大家導(dǎo)航傳值推薦指數(shù)適用范圍相鄰頁(yè)面間傳值兼容性原理為頁(yè)面的上掛載了對(duì)象可用來(lái)做路由跳轉(zhuǎn),在做頁(yè)面跳轉(zhuǎn)時(shí)可以攜帶參數(shù)回調(diào)方 在React Native 中由于業(yè)務(wù)的需要, 我們往往要在諸多的頁(yè)面間,組件之間做一些參數(shù)的傳遞與管理, 在這里我總結(jié)了幾大經(jīng)過(guò)驗(yàn)證,穩(wěn)定好用的...
摘要:中只有的作用域是動(dòng)態(tài)作用域的五種綁定初學(xué)時(shí),會(huì)想當(dāng)然認(rèn)為遵循某一條規(guī)律,就像物理學(xué)那樣,然而并不是。的綁定分為五種情況,這五種情況之間毫無(wú)規(guī)律可言。以至指向更加撲朔迷離。 this 到底指向哪里 以下如果沒(méi)提及,則為嚴(yán)格模式。 js中作用域有兩種: 詞法作用域 動(dòng)態(tài)作用域 詞法作用域 詞法作用域指在書(shū)寫代碼時(shí)就被確定的作用域。看如下代碼 var value = 1; ...
摘要:數(shù)據(jù)結(jié)構(gòu)和算法樹(shù)快速排序,堆排序,插入排序其實(shí)八大排序算法都應(yīng)該了解一致性算法,一致性算法的應(yīng)用的內(nèi)存結(jié)構(gòu)。如何存儲(chǔ)一個(gè)的。八大排序算法一定要手敲一遍快排,堆排尤其重要。面試是一個(gè)雙向選擇的過(guò)程,不要抱著畏懼的心態(tài)去面試,不利于自己的發(fā)揮。 前言 16年畢業(yè)到現(xiàn)在也近兩年了,最近面試了阿里集團(tuán)(菜鳥(niǎo)網(wǎng)絡(luò),螞蟻金服),網(wǎng)易,滴滴,點(diǎn)我達(dá),最終收到點(diǎn)我達(dá),網(wǎng)易o(hù)ffer,螞蟻金服二面掛掉,...
摘要:父組件向子組件之間非常常見(jiàn),通過(guò)機(jī)制傳遞即可。我們應(yīng)該聽(tīng)說(shuō)過(guò)高階函數(shù),這種函數(shù)接受函數(shù)作為輸入,或者是輸出一個(gè)函數(shù),比如以及等函數(shù)。在傳遞數(shù)據(jù)的時(shí)候,我們可以用進(jìn)一步提高性能。 本文主要談自己在react學(xué)習(xí)的過(guò)程中總結(jié)出來(lái)的一些經(jīng)驗(yàn)和資源,內(nèi)容邏輯參考了深入react技術(shù)棧一書(shū)以及網(wǎng)上的諸多資源,但也并非完全照抄,代碼基本都是自己實(shí)踐,主要為平時(shí)個(gè)人學(xué)習(xí)做一個(gè)總結(jié)和參考。 本文的關(guān)鍵...
閱讀 1338·2023-04-25 15:21
閱讀 2670·2021-11-24 10:23
閱讀 3397·2021-10-11 10:59
閱讀 3242·2021-09-03 10:28
閱讀 1731·2019-08-26 13:45
閱讀 2319·2019-08-26 12:11
閱讀 921·2019-08-26 12:00
閱讀 1705·2019-08-26 10:44