AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

我已徹底拿捏 React Compiler,原來它是元素級細粒度更新。原理性能優(yōu)秀實踐都在這七千字里

來源: 責編: 時間:2024-06-18 17:04:28 148觀看
導讀說實話現(xiàn)在我很激動。從 React Compiler 開源到現(xiàn)在我連續(xù)研究分析 React Compiler 已經(jīng)四天時間了,這期間我積累了大量的使用心得,整體感受就是它真的太強了!現(xiàn)在我迫不及待地想跟大家分享 React Compiler 的深度使用體

說實話現(xiàn)在我很激動。pID28資訊網(wǎng)——每日最新資訊28at.com

從 React Compiler 開源到現(xiàn)在我連續(xù)研究分析 React Compiler 已經(jīng)四天時間了,這期間我積累了大量的使用心得,整體感受就是它真的太強了!pID28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在我迫不及待地想跟大家分享 React Compiler 的深度使用體驗。pID28資訊網(wǎng)——每日最新資訊28at.com

這篇文章我會結(jié)合三個實踐案例為大家解讀 React Compiler 到底強在哪,這可能會有一點難理解,不過道友們請放心,我會做好知識鋪墊,盡量用更簡單的方式來表達。內(nèi)容梗概如下:pID28資訊網(wǎng)——每日最新資訊28at.com

  • 如何查看編譯之后的代碼
  • Symbol.for() 基礎介紹
  • 實現(xiàn)原理詳細分析
  • 實踐案例一:counter 遞增
  • 實踐案例二:渲染成本昂貴的子組件
  • 實踐案例三:Tab 切換
  • 強悍的性能表現(xiàn):超細粒度緩存式/記憶化更新
  • 項目開發(fā)中,最佳實踐應該怎么做

經(jīng)過驗證發(fā)現(xiàn)由于 React19 之前的版本內(nèi)部不包含 compiler-runtime,因此無法正常使用,我猜測可能會在以后提供插件來支持編譯老版本的項目。目前我是在 React 19 RC 版本中結(jié)合 Compiler。不過好消息是將項目升級到 React 19 難度并不高。許多三方庫也已經(jīng)積極的適配了 React 19。pID28資訊網(wǎng)——每日最新資訊28at.com

pID28資訊網(wǎng)——每日最新資訊28at.com

從演示效果上來看,這是一個普通的 tab 切換。但是先別急,我還有要求。我希望能實現(xiàn)極限的性能優(yōu)化。pID28資訊網(wǎng)——每日最新資訊28at.com

  • 我希望首次渲染時,頁面渲染更少的內(nèi)容,因此此時,只能先渲染默認的 Panel。其他 Panel 需要在點擊對應的按鈕時,才渲染出來。
  • 在切換過程中,我希望能夠緩存已經(jīng)渲染好的 Panel,只需要在樣式上做隱藏,而不需要在后續(xù)的交互中重復渲染內(nèi)容
  • 當四個頁面都渲染出來之后,再做切換時,此時只會有兩個頁面會發(fā)生變化,上一個選中的頁面與下一個選中的頁面。另外的頁面不參與交互,則不應該 re-render。

?pID28資訊網(wǎng)——每日最新資訊28at.com

這個案例和要求不算特別難,但是對綜合能力的要求還是蠻高的,大家有空可以自己嘗試實現(xiàn)一下,看看能不能完全達到要求。pID28資訊網(wǎng)——每日最新資訊28at.com

具體的完整實現(xiàn)我們會在后續(xù)的直播中跟大家分享。大家可以加我好友「icanmeetu」然后進 React19 討論群,React19 相關的直播消息會第一時間在群內(nèi)公布。pID28資訊網(wǎng)——每日最新資訊28at.com

這里,我主要想跟大家分享的就是 map 方法的小細節(jié)。有如下代碼:pID28資訊網(wǎng)——每日最新資訊28at.com

{tabs.map((item, index) => {  return (    <item.component      appearder={item.appeared}      key={item.title}      selected={current === index}    />  )})}

它的編譯結(jié)果表現(xiàn)如下:pID28資訊網(wǎng)——每日最新資訊28at.com

let t4;if ($[7] !== current) {  t4 = tabs.map((item_0, index_1) => (    <item_0.component      appearder={item_0.appeared}      key={item_0.title}      selected={current === index_1}    />  ));  $[7] = current;  $[8] = t4;} else {  t4 = $[8];}

我們會發(fā)現(xiàn),此時編譯緩存的是整個 map 表達式,但是由于 map 表達式又依賴于 current,因此,在我們點擊切換的交互過程中,每一次的 current 都會發(fā)生變化,那么這里針對 map 表達式的緩存就沒有了任何意義。pID28資訊網(wǎng)——每日最新資訊28at.com

但是實際上,我們可以觀察到,我們有 4 個 Panel,點擊切換的交互發(fā)生時,實際上只有兩個 Pannel 發(fā)生了變化。因此,最極限的優(yōu)化是,只有這兩個組件對應的函數(shù)需要重新 re-render,那么我們的代碼應該怎么寫呢?pID28資訊網(wǎng)——每日最新資訊28at.com

其實非常簡單,那就是不用 map,將數(shù)組拆開直接手寫,代碼如下:pID28資訊網(wǎng)——每日最新資訊28at.com

let c1 = tabRef.current[0]let c2 = tabRef.current[1]let c3 = tabRef.current[2]let c4 = tabRef.current[3]
<c1.component appearder={c1.appeared} selected={current === 0}/><c2.component appearder={c2.appeared} selected={current === 1}/><c3.component appearder={c3.appeared} selected={current === 2}/><c4.component appearder={c4.appeared} selected={current === 3}/>

然后,我們就會發(fā)現(xiàn),在編譯結(jié)果中,不再緩存 map 表達式的結(jié)果,而是緩存每一個組件。pID28資訊網(wǎng)——每日最新資訊28at.com

let t5;if ($[7] !== c1.component || $[8] !== c1.appeared || $[9] !== t4) {  t5 = <c1.component appearder={c1.appeared} selected={t4} />;  $[7] = c1.component;  $[8] = c1.appeared;  $[9] = t4;  $[10] = t5;} else {  t5 = $[10];}

?pID28資訊網(wǎng)——每日最新資訊28at.com

這樣做的收益在特定場景下的收益將會非常高。pID28資訊網(wǎng)——每日最新資訊28at.com

七、強悍的性能:細粒度記憶化更新

經(jīng)過上面的學習,想必各位道友對 React Compiler 的工作機制已經(jīng)有了非常深刻的理解。此時,我們就需要分析一下,這樣的記憶化更新機制,到底有多強。pID28資訊網(wǎng)——每日最新資訊28at.com

首先明確一點,和 Vue 等其他框架的依賴收集不同,React Compiler 依然不做依賴收集。pID28資訊網(wǎng)——每日最新資訊28at.com

React 依然通過從根節(jié)點自上而下的 diff 來找出需要更新的節(jié)點。在這個過程中,我們會通過大量的判斷來決定使用緩存值。可以明確的是,Compiler 編譯之后的代碼,緩存命中的概率非常高,幾乎所有應該緩存的元素和函數(shù)都會被緩存起來。pID28資訊網(wǎng)——每日最新資訊28at.com

因此,React Compiler 也能夠在不做依賴收集的情況下,做到元素級別的超級細粒度更細。但是,這樣做的代價就是,React 需要經(jīng)歷大量的判斷來決定是否需要使用緩存結(jié)果。pID28資訊網(wǎng)——每日最新資訊28at.com

所以這個時候,我們就需要明確,我所謂的大量判斷的時間成本,到底有多少?它會不會導致新的性能問題?pID28資訊網(wǎng)——每日最新資訊28at.com

可以看到,Compiler 編譯之后的代碼中,幾乎所有的比較都是使用了全等比較,因此,我們可以寫一個例子來感知一下,超大量的全等比較到底需要花費多少時間。pID28資訊網(wǎng)——每日最新資訊28at.com

測試代碼如下:pID28資訊網(wǎng)——每日最新資訊28at.com

var cur = performance.now()for(let i = 0; i < 1000000; i++) {  'xxx' == 'xx'}var now = performance.now()console.log(now - cur)

執(zhí)行結(jié)果,比較 100 萬次,只需要花費不到 1.3 毫秒。這太強了啊。我們很難有項目能夠達到 1000,000 次的比較級別,甚至許多達到 10000 都難。那也就意味著,這里大量的比較成本,落實到你的項目中,幾乎可以忽略不計。pID28資訊網(wǎng)——每日最新資訊28at.com

pID28資訊網(wǎng)——每日最新資訊28at.com

為了對比具體的效果,我們可以判斷一下依賴收集的時間成本。pID28資訊網(wǎng)——每日最新資訊28at.com

首先是使用數(shù)組來收集依賴。依然是 100 萬次收集,具體執(zhí)行結(jié)果如下。耗時 8 毫秒。pID28資訊網(wǎng)——每日最新資訊28at.com

pID28資訊網(wǎng)——每日最新資訊28at.com

使用 Map 來收集依賴。100 萬次依賴收集耗時 54 ms。pID28資訊網(wǎng)——每日最新資訊28at.com

pID28資訊網(wǎng)——每日最新資訊28at.com

使用 WeakMap 來收集依賴,那就更慢了。100萬次依賴收集耗時 200 毫秒。pID28資訊網(wǎng)——每日最新資訊28at.com

?pID28資訊網(wǎng)——每日最新資訊28at.com

WeakMap 的 key 不能是一個 number 類型。pID28資訊網(wǎng)——每日最新資訊28at.com

pID28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)展示給大家了,具體強不強,大家自行判斷。pID28資訊網(wǎng)——每日最新資訊28at.com

?pID28資訊網(wǎng)——每日最新資訊28at.com

這里我要明確的是,這樣的性能表現(xiàn),在之前版本的項目中,合理運用 useCallback/memo 也能做到。只是由于對 React 底層默認命中規(guī)則不理解,導致大多數(shù)人不知道如何優(yōu)化到這種程度。React Compiler 極大的簡化了這個過程。pID28資訊網(wǎng)——每日最新資訊28at.com

八、React Compiler 最佳實踐

有許多騷操作,React Compiler 并不支持,例如下面這種寫法。pID28資訊網(wǎng)——每日最新資訊28at.com

{[1, 2, 3, 4, 5].map((counter) => {  const [number, setNumber] = useState(0)  return (    <div key={`hello${counter}`} onClick={() => setNumber(number + 1)}>      number: {number}    </div>  )})}

這個操作騷歸騷,但是真的有大佬想要這樣寫。React 之前的版本依然不支持這種寫法。不過好消息是,React 19 支持了...pID28資訊網(wǎng)——每日最新資訊28at.com

但是 React Compiler 并不支持。對于這些不支持的語法,React Compiler 的做法就是直接跳過不編譯,而直接沿用原組件寫法。pID28資訊網(wǎng)——每日最新資訊28at.com

因此,React Compiler 的最佳實踐我總結(jié)了幾條pID28資訊網(wǎng)——每日最新資訊28at.com

  • 1、不再使用 useCallback、useMemo、Memo 等緩存函數(shù)
  • 2、丟掉閉包的心智負擔,放心使用即可
  • 3、引入嚴格模式
  • 4、在你不熟悉的時候引入 eslint-plugin-react-compiler
  • 5、當你熟練之后,棄用它,因為有的時候我們就是不想讓它編譯我們的組件
  • 6、更多的使用 use 與 Action 來處理異步邏輯
  • 7、盡可能少使用 useEffect

這里,一個小小的彩蛋就是,當你不希望你的組件被 Compiler 編譯時,你只需要使用 var 來聲明狀態(tài)即可。因為這不符合它的語法規(guī)范pID28資訊網(wǎng)——每日最新資訊28at.com

var [counter, setCounter] = useState(0)

而你改成 const/let,它就會又重新編譯該組件。可控性與自由度非常高。pID28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-94585-0.html我已徹底拿捏 React Compiler,原來它是元素級細粒度更新。原理性能優(yōu)秀實踐都在這七千字里

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 如果沒有這個 JavaScript 功能,95%的用戶會討厭使用你的應用程序

下一篇: 一個數(shù)據(jù)獲取竟被 React Query 玩出這么多花樣來!

標簽:
  • 熱門焦點
  • K60 Pro官方停產(chǎn) 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經(jīng)透露了,Redmi K60 Pro已經(jīng)停產(chǎn)且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產(chǎn)之后
  • 6月iOS設備好評榜:第一蟬聯(lián)榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • 印度登月最關鍵一步!月船三號今晚進入環(huán)月軌道

    8月5日消息,據(jù)印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環(huán)月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 共享單車的故事講到哪了?

    來源丨海克財經(jīng)與共享充電寶相差不多,共享單車已很久沒有被國內(nèi)熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發(fā)報道稱,成都、天津、鄭州等地多個共享單
  • 自律,給不了Keep自由!

    來源 | 互聯(lián)網(wǎng)品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產(chǎn)懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風頭無兩。你可以說陳思誠的
  • 小米公益基金會捐贈2500萬元馳援北京、河北暴雨救災

    8月2日消息,今日小米科技創(chuàng)始人雷軍在其微博上發(fā)布消息稱,小米公益基金會宣布捐贈2500萬元馳援北京、河北暴雨救災。攜手抗災,京冀安康!以下為公告原文
  • iQOO Neo8 Pro真機諜照曝光:天璣9200+和V1+旗艦雙芯加持

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經(jīng)上市便受到了用戶的廣泛關注。在時隔半年后,
Top