日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

說實話現在我很激動。LWj28資訊網——每日最新資訊28at.com

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

現在我迫不及待地想跟大家分享 React Compiler 的深度使用體驗。LWj28資訊網——每日最新資訊28at.com

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

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

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

LWj28資訊網——每日最新資訊28at.com

從演示效果上來看,這是一個普通的 tab 切換。但是先別急,我還有要求。我希望能實現極限的性能優化。LWj28資訊網——每日最新資訊28at.com

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

?LWj28資訊網——每日最新資訊28at.com

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

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

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

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

它的編譯結果表現如下:LWj28資訊網——每日最新資訊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];}

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

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

其實非常簡單,那就是不用 map,將數組拆開直接手寫,代碼如下:LWj28資訊網——每日最新資訊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}/>

然后,我們就會發現,在編譯結果中,不再緩存 map 表達式的結果,而是緩存每一個組件。LWj28資訊網——每日最新資訊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];}

?LWj28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

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

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

測試代碼如下:LWj28資訊網——每日最新資訊28at.com

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

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

LWj28資訊網——每日最新資訊28at.com

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

首先是使用數組來收集依賴。依然是 100 萬次收集,具體執行結果如下。耗時 8 毫秒。LWj28資訊網——每日最新資訊28at.com

LWj28資訊網——每日最新資訊28at.com

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

LWj28資訊網——每日最新資訊28at.com

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

?LWj28資訊網——每日最新資訊28at.com

WeakMap 的 key 不能是一個 number 類型。LWj28資訊網——每日最新資訊28at.com

LWj28資訊網——每日最新資訊28at.com

數據展示給大家了,具體強不強,大家自行判斷。LWj28資訊網——每日最新資訊28at.com

?LWj28資訊網——每日最新資訊28at.com

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

八、React Compiler 最佳實踐

有許多騷操作,React Compiler 并不支持,例如下面這種寫法。LWj28資訊網——每日最新資訊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 支持了...LWj28資訊網——每日最新資訊28at.com

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

因此,React Compiler 的最佳實踐我總結了幾條LWj28資訊網——每日最新資訊28at.com

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

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

var [counter, setCounter] = useState(0)

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

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

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

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

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

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品久久久久久久久久尿 | 亚洲福利视频一区二区| 国产噜噜噜噜噜久久久久久久久| 国产农村妇女毛片精品久久莱园子 | 免费观看不卡av| 欧美精品一区二区三区蜜臀| 国产精品观看| 国内自拍一区| 亚洲经典在线| 亚洲自拍啪啪| 久久久一区二区| 欧美精品91| 国产欧美 在线欧美| 亚洲成人原创| 亚洲综合丁香| 免费欧美日韩| 国产精品国产三级国产aⅴ9色| 国内视频精品| 99精品国产99久久久久久福利| 欧美一激情一区二区三区| 欧美.com| 国产日韩精品在线观看| 亚洲欧洲日韩在线| 欧美一级片一区| 欧美激情综合色综合啪啪| 国产亚洲精久久久久久| 99精品欧美| 久久久久久自在自线| 欧美日韩国产综合视频在线观看中文 | 久久精品国内一区二区三区| 欧美日本韩国一区| 国产在线视频不卡二| 日韩一级免费观看| 久久精品亚洲乱码伦伦中文| 欧美日韩激情小视频| 精品99视频| 亚洲一区国产| 欧美精品久久久久久久免费观看| 国产视频不卡| 亚洲网站在线| 欧美精品亚洲二区| 精品成人久久| 午夜久久99| 欧美日韩精品中文字幕| 136国产福利精品导航网址应用 | 欧美成人国产| 国产综合自拍| 欧美一级大片在线免费观看| 欧美日韩国产页| 亚洲福利视频三区| 久久精品视频亚洲| 国产精品亚洲成人| 日韩西西人体444www| 麻豆成人91精品二区三区| 国产日本亚洲高清| 亚洲专区国产精品| 欧美另类高清视频在线| 国产在线精品成人一区二区三区| 中文av一区特黄| 欧美久久99| 亚洲国产精品激情在线观看| 久久久999精品视频| 国产欧美一区二区精品婷婷| 亚洲一区二区免费在线| 欧美日韩在线一区二区| 日韩亚洲欧美成人| 乱码第一页成人| 欧美日韩成人| 亚洲第一主播视频| 久久国产黑丝| 欧美四级在线观看| 91久久亚洲| 久久午夜羞羞影院免费观看| 国产精品资源在线观看| aa成人免费视频| 欧美成黄导航| 狠狠色丁香久久婷婷综合_中| 亚洲一区二区三区高清不卡| 欧美视频亚洲视频| 亚洲天堂成人| 国产精品久久久| 亚洲欧美综合国产精品一区| 国产精品天天看| 亚洲欧美日韩一区二区在线 | 久久艳片www.17c.com| 狠狠色香婷婷久久亚洲精品| 久久久一区二区三区| 国内精品国语自产拍在线观看| 久久久久.com| 激情亚洲网站| 美日韩精品视频免费看| 亚洲精品一区在线观看香蕉| 欧美日韩www| 亚洲视频欧美视频| 国产精品一级| 久久精品123| 一区二区三区在线视频免费观看| 久久久久久噜噜噜久久久精品| 精品电影在线观看| 欧美成人国产va精品日本一级| 亚洲精品久久久久中文字幕欢迎你 | 久久婷婷成人综合色| 一区二区三区在线视频观看 | 国产综合精品| 久久免费视频在线| 亚洲欧洲在线视频| 欧美三级视频在线| 性欧美videos另类喷潮| 好吊色欧美一区二区三区四区| 米奇777超碰欧美日韩亚洲| 亚洲精品中文在线| 国产精品久久久久久亚洲毛片 | 欧美日一区二区三区在线观看国产免| 亚洲一区二区三区免费观看| 国产欧美日韩| 欧美xx69| 亚洲综合首页| 狠狠色综合色区| 欧美激情精品久久久久久黑人 | 国内精品久久久| 蜜桃av一区二区在线观看| 99精品热视频| 国产欧美一区二区视频| 毛片av中文字幕一区二区| 99re热精品| 国产色综合久久| 欧美国产日本高清在线| 亚洲自拍高清| 亚洲风情在线资源站| 欧美视频在线观看视频极品| 久久爱www久久做| 亚洲精品国精品久久99热一| 国产精品日产欧美久久久久| 老司机午夜精品视频| 一区二区三区视频在线观看| 国产亚洲欧美激情| 欧美精品福利在线| 欧美一区二区三区在线观看视频| 亚洲国产一区二区在线| 国产精品欧美在线| 欧美1区视频| 欧美一区二区三区视频在线观看 | 午夜视频在线观看一区二区三区| 在线观看亚洲a| 国产精品wwwwww| 久久亚洲捆绑美女| 亚洲一区尤物| 亚洲黄色视屏| 国产亚洲欧美一区二区| 欧美日韩一区二区三区在线观看免| 久久精品视频在线看| 亚洲一区在线看| 亚洲精品久久| 韩国av一区| 国产精品久久久久久久久久久久久久 | 欧美大片在线看免费观看| 欧美一级日韩一级| 99精品视频免费在线观看| 狠狠久久五月精品中文字幕| 国产精品欧美风情| 欧美日韩成人综合天天影院| 久久久欧美精品sm网站| 亚洲欧美国产毛片在线| 日韩视频在线观看国产| 在线观看国产成人av片| 国产乱码精品一区二区三区五月婷| 欧美另类人妖| 男女精品视频| 久久久久天天天天| 欧美一进一出视频| 亚洲少妇在线| 日韩视频不卡中文| 1000部精品久久久久久久久| 国产午夜精品视频| 国产精品久线观看视频| 欧美日韩三级在线| 欧美精品成人一区二区在线观看| 久久亚洲私人国产精品va| 欧美在线日韩在线| 亚洲欧美另类在线| 亚洲午夜未删减在线观看| 亚洲免费观看| 亚洲精品一区在线观看| 亚洲国产精品va在线观看黑人| 国产专区综合网| 国产日产欧产精品推荐色| 国产精品久久久久9999| 欧美日韩一区二区在线| 欧美精选午夜久久久乱码6080| 欧美肥婆bbw| 欧美高清视频在线播放| 欧美大片一区二区三区| 欧美不卡高清| 欧美大色视频| 欧美激情亚洲精品| 欧美国产先锋| 欧美—级在线免费片| 欧美精品在线观看播放| 欧美乱在线观看| 欧美日韩视频一区二区| 欧美揉bbbbb揉bbbbb| 欧美日韩在线精品一区二区三区| 欧美日韩精品在线观看| 欧美日韩亚洲一区二区三区在线|