React 18 RC 版本發布啦,生產環境用起來!

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。歷史面試系列

今天給大家帶來一個令人興奮的消息:React 18 RC 版本發布啦!

去年6月份 React 18 發布 alpha 版本的時候,我已經第一時間試用,并且給大家分享了一波:【第一批吃螃蟹】試用 React 18 !

不過 alpha 畢竟還是屬于內部測試版本,可能還包括一些 bug,功能也有很多沒放出來,大家不能在生產里去用。

這次發布的是 RC 版本(Release Candidate候選版本):基本和最終發布的 stable 版本一樣,功能上不會再有太大變化,也更加穩定,大家可以嘗試在生產環境里用起來了 ~

安裝

安裝最新的 React 18 RC 版本:

npm?install?react@rc?react-dom@rc

客戶端渲染 API 的更新

如果你是第一次安裝 React 18 ,可能會在控制臺看到一個警告:

Use createRoot instead. Until you switch to the new API, your app will behave as if it’s running React 17. Learn more: https://reactjs.org/link/switch-to-createroot

這是因為 React 18 中引入了一個新的 Root API,它支持了最新的 concurrent renderer,讓你可以自己決定是否啟用并發渲染的能力。

//?以前
import?{?render?}?from?'react-dom';
const?container?=?document.getElementById('app');
render(<App?tab="home"?/>,?container);//?現在
import?{?createRoot?}?from?'react-dom/client';
const?container?=?document.getElementById('app');
const?root?=?createRoot(container);
root.render(<App?tab="home"?/>);

同時,unmountComponentAtNode 也改為了 root.unmount

//?以前
unmountComponentAtNode(container);//?現在
root.unmount();

另外,React 還將之前 render 函數的回調函數干掉了,因為通常它在配合 Suspense 一起使用的時候得不到預期的效果:

//?以前
const?container?=?document.getElementById('app');
ReactDOM.render(<App?tab="ConardLiHome"?/>,?container,?()?=>?{console.log('rendered');
});//?現在
function?AppWithCallbackAfterRender()?{useEffect(()?=>?{console.log('rendered');});return?<App?tab="ConardLiHome"?/>
}const?container?=?document.getElementById('app');
const?root?=?ReactDOM.createRoot(container);
root.render(<AppWithCallbackAfterRender?/>);

還有一點, 如果你之前用了帶 hydrate 的服務端渲染,需要升級到:hydrateRoot

//?以前
import?{?hydrate?}?from?'react-dom';
const?container?=?document.getElementById('app');
hydrate(<App?tab="home"?/>,?container);//?現在
import?{?hydrateRoot?}?from?'react-dom/client';
const?container?=?document.getElementById('app');
const?root?=?hydrateRoot(container,?<App?tab="home"?/>);

服務端渲染 API 的更新

在這個版本中,React 為了完全支持服務端的 Suspense 和流式SSR,改進了 react-dom/serverAPI,舊的 Node.js 流式 API 將會被完全棄用:

  • renderToNodeStream 棄用???,使用時將發出警告。

  • 對應新版 Node 環境的流式傳輸 API 為:renderToPipeableStream

另外,React 在這個版本還引入了新的 renderToReadableStream 來支持 Deno、Cloudflare worker 等其他環境的流式 SSRSuspense

renderToString、renderToStaticMarkup 這兩個 API 還可以繼續用,但是對 Suspense 支持就不那么友好了。

想了解更多,可以看 React 18 官方工作組的博客:https://github.com/reactwg/react-18/discussions/22

批處理

React 中的批處理簡單來說就是將多個狀態更新合并為一次重新渲染,由于設計問題,在 React 18 之前,React 只能在組件的生命周期函數或者合成事件函數中進行批處理。默認情況下,Promise、setTimeout 以及其他異步回調是無法享受批處理的優化的。

//?React?18?之前function?handleClick()?{setCount(c?=>?c?+?1);setName('ConardLi');//?在合成事件中,享受批處理優化,只會重新渲染一次
}setTimeout(()?=>?{setCount(c?=>?c?+?1);setName('ConardLi');//?不會進行批處理,會觸發兩次重新渲染
},?1000);

React 18 開始,如果你使用了 createRoot,所有的更新都會享受批處理的優化,包括Promise、setTimeout 以及其他異步回調函數中。

//?React?18?function?handleClick()?{setCount(c?=>?c?+?1);setName('ConardLi');//?只會重新渲染一次
}setTimeout(()?=>?{setCount(c?=>?c?+?1);setName('ConardLi');//?只會重新渲染一次
},?1000);

如果你有特殊的渲染需求,不想進行批處理,也可以使用 flushSync 手動退出:

import?{?flushSync?}?from?'react-dom';function?handleClick()?{flushSync(()?=>?{setCounter(c?=>?c?+?1);});//?更新?DOMflushSync(()?=>?{setFlag(f?=>?!f);});//?更新?DOM
}

想了解更多可以看 React 18 官方工作組的博客:https://github.com/reactwg/react-18/discussions/21

用于第三方庫的 API

React 18 的更新機制對于很多第三方 React 庫都是阻斷性的,如果想要適配 React 18,這些庫可能要通過下面這些 API 做一些改造:

  • useId 是一個新的 Hook,用于在客戶端和服務端生成唯一id,同時避免 hydration 的不兼容,這可以解決 React 17 以及更低版本的問題。

  • useSyncExternalStore 是一個新的 Hook,它允許外部存儲通過強制同步更新來支持并發讀取。推薦把這個新的 API 推薦應用到任何與 React 外部狀態集成的庫。

  • useInsertionEffect 是一個新的 Hook,它可以解決 CSS-in-JS 庫在渲染中動態注入樣式的性能問題。

放棄對 IE 的支持

e98bfcefe15ef81277737b22c98d49ce.png

在這個版本中,React 正式放棄了對 Internet Explorer 的支持。如果你的業務在 IE 還有用戶,只能繼續使用 React 17 及以下的版本了~。

如果大家想了解更多內容,歡迎查看 React 官方博客:https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html

327d5ab9cac449749c2c8b8d05992490.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助3000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

161c43ec1b122cc85d16110cf8be826f.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274844.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274844.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阿拉伯語排版設計_針對說阿拉伯語的用戶的測試和設計

阿拉伯語排版設計Let me start off with some data to put things into perspective “Why?”讓我從一些數據入手&#xff0c;以透視“為什么&#xff1f;”的觀點。 Arabic is the 5th most spoken language worldwide, with 420 million speakers, and is an official lang…

CMMI簡介

CMMI&#xff08;Capability Maturity Model Integration&#xff09;即能力成熟度模型集成 什么是CMMI CMMI是CMM模型的最新版本。早期的CMMI&#xff08;CMMI-SE/SW/IPPD&#xff09;1.02版本是應用于軟件業項目的管理方法&#xff0c;SEI在部分國家和地區開始推廣和試用。隨…

SVN:“SVN”不是內部命令,解決方法

1、安裝完TortoiseSVN-1.6.16.21511-x64-svn-1.6.17.msi 2、在運行窗口cmd---svn&#xff0c;提示&#xff1a; “SVN” 不是內部命令 郁悶&#xff0c;小有糾結 解決方法&#xff1a;安裝Slik-Subversion-1.6.17-x64.msi 命令行窗口關閉&#xff0c;再次打開命令行窗口&#x…

7個月,4000+人,500+源碼筆記,誠邀你參加源碼共讀~

大家好&#xff0c;我是若川。按照從易到難的順序&#xff0c;前面幾期&#xff08;比如&#xff1a;validate-npm-package-name、axios工具函數&#xff09;很多都只需要花2-3小時就能看完&#xff0c;并寫好筆記。但收獲確實很大。開闊視野、查漏補缺、升職加薪。已經有400筆…

火焰和煙霧的訓練圖像數據集_游戲開發者是煙霧和鏡子的大師

火焰和煙霧的訓練圖像數據集Video games are incredible. They transport us to new worlds, allow us to partake in otherwise impossible situations, and empower us in our every day lives. Games can make us feel like a part of something bigger than ourselves, per…

平衡樹SPLAY

一個比線段樹代碼還要又臭又長的數據結構&#xff0c;各式各樣的函數&#xff0c;咱也不知道別人怎么記住的&#xff0c;咱也不敢問 SPLAY的性質 1.某個節點的左子樹全部小于此節點&#xff0c;右子樹全部大于此節點 2.中序遍歷splay輸出的序列是按從小到大的順序 &#xff08;…

POJ 2696 計算表達式的值

時間限制: 1000ms內存限制:65536kB描述有些語言中表達式的運算符使用字符串表示&#xff0c;例如用mul代表*&#xff0c;用div代表/&#xff0c;用add代表&#xff0c;用sub代表-&#xff0c;用mod代表%。輸入第一行為表達式的個數n。其余n行每行一個表達式&#xff0c;表達式由…

為支持兩個語言版本,我基于谷歌翻譯API寫了一款自動翻譯的 webpack 插件

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列本文來…

全球 化 化_全球化設計

全球 化 化重點 (Top highlight)Designing for a global audience can feel daunting. Do you localize your product? Or, do you internationalize your product? And what does that even entail?為全球觀眾設計可能會令人生畏。 您是否將產品本地化&#xff1f; 還是您將…

springMVC_數據的處理過程

1、DispatcherServlet&#xff1a;作為前端控制器&#xff0c;負責分發客戶的請求到 Controller 其在web.xml中的配置如下&#xff1a; <servlet><servlet-name>dispatcherServlert</servlet-name><servlet-class>org.springframework.web.servlet.Dis…

面試體驗:Facebook 篇(轉)

http://www.cnblogs.com/cathsfz/archive/2012/11/05/facebook-interview-experience.html 2012-11-05 08:20 by Cat Chen, 23266閱讀, 121評論, 收藏, 編輯 Google、Microsoft 和 Yahoo 都是去年的事情了&#xff0c;接下來說說今年…

JavaScript 新增兩個原始數據類型

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列JavaS…

axure低保真原型_如何在Google表格中創建低保真原型

axure低保真原型Google Sheets is a spreadsheet, just like Microsoft Excel.Google表格是一個電子表格&#xff0c;就像Microsoft Excel一樣。 Most people associate it with calculating numbers. But Google Sheets is actually great for organizing your ideas, making…

Weblogic EJB 學習筆記(3)精

編輯實體bean的高級課程 1. 怎樣開發主健類 ejb的主健類主要用做持久存儲和ejb容器中的唯一標識符. 通常主健類的字段直接映射到數據庫中的主健字段. 如果主健只是由單個實體bean字段組成.且其數據類型是基本的java類.如string,則bean作者不必開發自定義的主健類. 只需要在配置…

Lerna 運行流程剖析

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列Lerna…

手動創建線程池 效果會更好_創建更好的,可訪問的焦點效果

手動創建線程池 效果會更好Most browsers has their own default, outline style for the :focus psuedo-class.大多數瀏覽器對于&#xff1a;focus psuedo-class具有其默認的輪廓樣式。 Chrome’s default outline styleChrome瀏覽器的默認輪廓樣式 This outline style is cr…

C++builder enum類型

C/C code #pragmaoption push -b-enumTThreadPriority { tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical }; //這是字節型的.理論上說這是可能的最小整形.可以是1Byte, 2Bytes, 4Bytes...#pragmaoption pop#pragmaoption push -benumTThreadPriori…

chrome瀏覽器世界之窗瀏覽器的收藏夾在哪?

今天心血來潮&#xff0c;用一個查重軟件刪除重復文件&#xff0c;結果把chrome瀏覽器和世界之窗瀏覽器的收藏夾給刪除了&#xff0c;導致我保存的好多網頁都沒有了&#xff0c;在瀏覽器本身和網上都沒有找到這兩個瀏覽器默認的收藏夾在哪個位置&#xff0c;只好用DiskGenius 把…

Vue3究竟好在哪里 等推薦

話不多說&#xff0c;這一次花了幾小時精心為大家挑選了30余篇好文&#xff0c;供大家閱讀學習&#xff0c;提升自己的技術視野以及擴展自己的知識儲備。本文閱讀技巧&#xff0c;先粗看標題&#xff0c;感興趣可以都關注一波&#xff0c;一起共同進步。前端從進階到入院框架原…

eazy ui 復選框單選_UI備忘單:單選按鈕,復選框和其他選擇器

eazy ui 復選框單選重點 (Top highlight)Pick me! Pick me! No, pick me! In today’s cheat sheet we will be looking at selectors and how they differ. Unlike most of my other cheat sheets, this will focus on two components (radio buttons and checkboxes) side by…