沉寂 600 多天后,React 憋了個(gè)大招
React 19 革新前端開發(fā),Instagram 已率先嘗鮮。來自公眾號(hào):InfoQ 編譯 | 凌 敏、核子可樂、平川
自 2022 年 6 月發(fā)布 React 18.2 以來(React 18 于 2022 年 3 月發(fā)布),React 團(tuán)隊(duì)一直沒有發(fā)布新的穩(wěn)定版本。沉寂 600 多天后,近日,React 團(tuán)隊(duì)表示他們將要發(fā)布最新的“大版本”——React 19,目前他們正在為正式發(fā)布做準(zhǔn)備工作。據(jù)悉,React 19 將專注于提高構(gòu)建復(fù)雜 Web 應(yīng)用程序的生產(chǎn)力、性能與開發(fā)者體驗(yàn)。
值得一提的是,在上一個(gè)大版本中,服務(wù)器組件(Server Component)這個(gè)最大的特性被描述為“實(shí)驗(yàn)性的”,如今,React 團(tuán)隊(duì)已經(jīng)將 React Compiler 描述為“不再是一個(gè)研究項(xiàng)目”。此外,React 團(tuán)隊(duì)還介紹了下一個(gè)大版本 React 19 的特性,其中包括 Actions(正式名稱為 Server Actions)、資產(chǎn)加載和 Web 組件支持。
根據(jù) React Conf 2021 大會(huì)和官方 React 博客上的公告,React 19 仍處于早期開發(fā)與測(cè)試階段,很可能會(huì)在 2024 年內(nèi)的適當(dāng)時(shí)候推出。React 團(tuán)隊(duì)希望保障向下兼容性,也想讓社區(qū)能有時(shí)間為潛在的各類重大變更做好準(zhǔn)備。
React 19 新增了哪些功能?從精致的并發(fā)渲染到新穎的狀態(tài)處理機(jī)制,React 19 嘗試進(jìn)一步增強(qiáng)性能與開發(fā)者體驗(yàn)。具體來說,React 19 引入了一系列令人興奮的改進(jìn),新版本的主要亮點(diǎn)包括:
-
新的 React Compiler 編譯器:升級(jí)后的編譯器帶來 skip mode 和 selective hydration 選擇性水合等性能優(yōu)化選項(xiàng),可幫助應(yīng)用程序提升加載速度。
-
協(xié)調(diào)改進(jìn):startTransition API 等更新能夠?qū)⒐ぷ鞑鸱殖啥鄠€(gè)塊,使得復(fù)雜 UI 的響應(yīng)速度更快。
-
Strict mode 嚴(yán)格模式檢查:新的嚴(yán)格相等性檢查和刪除已棄用 API 等舉措,將確保應(yīng)用程序始終遵循最佳實(shí)踐。
-
水合與 SSR 變更:Fiber 樹復(fù)制與 useId hook 能夠更好地支持在服務(wù)器端渲染的應(yīng)用程序。
下面,我們來具體探討這些新近落地的附加功能,深入了解它們會(huì)如何重塑動(dòng)態(tài)用戶界面的開發(fā)格局。
1. React CompilerReact 團(tuán)隊(duì)已經(jīng)將 React Compiler 描述為“不再是一個(gè)研究項(xiàng)目”。根據(jù)該團(tuán)隊(duì)發(fā)布的最新消息,該編譯器現(xiàn)在“已交付 Instagram.com 生產(chǎn)應(yīng)用”,這也標(biāo)志著 React 功能的又一重大進(jìn)步。
根據(jù)帖子介紹,該團(tuán)隊(duì)已經(jīng)在“加速把它擴(kuò)展到 Meta 的其他業(yè)務(wù)面并推動(dòng)開源”,但沒有公布正式發(fā)布日期。盡管如此,React 團(tuán)隊(duì) Vercel 工程師 Andrew Clark 在推特上寫道,“到 2024 年底”,開發(fā)人員“可能就永遠(yuǎn)不需要”包括 useMemo 在內(nèi)的 API 了。

React 工程師 Andrew Clark 預(yù)計(jì),到 2024 年底就不再需要 useMemo 了。也就是說,到那時(shí)所有人都可以使用 React Compiler 了。
React Compiler 通過引入優(yōu)化編譯器解決了狀態(tài)變量時(shí)過度重新渲染的問題。與手動(dòng)記憶化(manual memoization)不同,這款編譯器會(huì)在狀態(tài)發(fā)生變化時(shí)自動(dòng)對(duì) UI 中的特定部分進(jìn)行重新渲染,從而消除代碼混亂。React Compiler 遵循 JavaScript 與 React 運(yùn)行規(guī)則,可保障安全性與性能。開發(fā)人員能夠使用 Strict Mode 嚴(yán)格模式與 React ESLint 插件驗(yàn)證編寫的代碼。
根據(jù)該團(tuán)隊(duì)發(fā)布的最新消息,這款編譯器已經(jīng)在 Instagram.com 上得到生產(chǎn)應(yīng)用,即將被整合進(jìn) Meta 界面當(dāng)中,后續(xù)開源版本亦在籌備當(dāng)中。
2. Actions另一個(gè)新特性是 Action,用于管理從客戶端發(fā)送到服務(wù)器的數(shù)據(jù),比如表單元素。該團(tuán)隊(duì)解釋說,“當(dāng)使用 action 時(shí),React 將為你管理數(shù)據(jù)提交的生命周期,提供像 useFormStatus 和 useFormState 這樣的鉤子來訪問表單動(dòng)作的當(dāng)前狀態(tài)和響應(yīng)”。
Actions 允許開發(fā)者將函數(shù)傳遞給 DOM 元素,例如:
<form action={search}><input name="query" /><button type="submit">Search</button></form>
這項(xiàng)操作函數(shù)可以靈活實(shí)現(xiàn)同步或者異步操作。開發(fā)者能夠使用標(biāo)準(zhǔn) JavaScript 在客戶端上定義該函數(shù),也可使用“use server”指令在服務(wù)器上定義。React 則負(fù)責(zé)在使用某項(xiàng)操作時(shí)管理數(shù)據(jù)提交生命周期,提供 useFormStatus 和 useFormState 等 hooks 來訪問當(dāng)前表單操作的狀態(tài)與響應(yīng)。
import { useFormStatus } from "react-dom";import action from './actions';function Submit() {const status = useFormStatus();return <button disabled={status.pending}>Submit</button>}export default function App() {return (<form action={action}><Submit /></form>);}
import { useFormState } from "react-dom";async function increment(previousState, formData) {return previousState + 1;}function StatefulForm({}) {const [state, formAction] = useFormState(increment, 0);return (<form>{state}<button formAction={formAction}>Increment</button></form>)}
默認(rèn)情況下,Actions 會(huì)在轉(zhuǎn)換內(nèi)提交,從而在處理過程中保持當(dāng)前頁面的交互性。通過支持異步函數(shù),在轉(zhuǎn)換中引入 async/awat 可以顯示待處理的 UI,并利用 isPending 狀態(tài)在異步請(qǐng)求(例如數(shù)據(jù)獲取)期間發(fā)出正在進(jìn)行的處理信號(hào)。
3. React CanaryCanary 標(biāo)志著 React 在開發(fā)方法層面的轉(zhuǎn)變。在以往 Meta 內(nèi)部研究和開發(fā)功能的傳統(tǒng)方法不同,Canary 強(qiáng)調(diào)通過社區(qū)協(xié)作公開構(gòu)建以完善 React Labs 系列博文中介紹的功能。這種方法將確保用戶在早期開發(fā)階段就了解即將推出的功能,全程關(guān)注并逐步適應(yīng)功能的最終版本,而不再直接通過穩(wěn)定版發(fā)布硬性接受完善的功能選項(xiàng)。
React Canary 所涵蓋的功能包括 React Server Components 服務(wù)組件、Asset Loading 資產(chǎn)加載、Document Metadata 文檔元數(shù)據(jù)與 Actions 操作函數(shù)等。
指令
“use client”與“use server”是為全棧 React 框架設(shè)計(jì)的捆綁器功能。它們負(fù)責(zé)標(biāo)記兩種環(huán)境之間的“分割點(diǎn)”:“use client”指示捆綁器生成〈script〉標(biāo)簽(例如 Astro Island),而“use server”則告知捆綁器生成 POST 端點(diǎn)(例如 tRPC Mutations)。二者配合將編寫出可復(fù)用組件,借此將客戶端交互與相關(guān)服務(wù)器端邏輯結(jié)合起來。
Document Metadata 文檔元數(shù)據(jù)
React 19 新曾對(duì)組件樹內(nèi)任意位置上渲染 <title>、<meta> 和元數(shù)據(jù) <link> 標(biāo)記的支持能力。它們?cè)谒协h(huán)境中均以相同方式實(shí)現(xiàn),包括純客戶端代碼、SSR 與 RSC。這將為 React Helmet 等創(chuàng)新功能庫提供了內(nèi)置支持。
Actions
Actions 操作函數(shù)用于管理從客戶端到服務(wù)器的數(shù)據(jù)發(fā)送。開發(fā)者可以向〈form/〉等元素添加操作函數(shù),使用 useFormStatus 訪問狀態(tài),使用 useFormState 處理結(jié)果,并使用 useOptimistic 積極更新 UI。
import { useOptimistic } from 'react';function AppContainer() {const [optimisticState, addOptimistic] = useOptimistic(state,// updateFn(currentState, optimisticValue) => {// merge and return new state// with optimistic value});}
如何使用 React Canary:
//for npmnpm install react react-dom//for yarnyarn add react react-dom
相較于直接修改當(dāng)前生產(chǎn)依賴項(xiàng),為其創(chuàng)建專用的測(cè)試環(huán)境顯然更加可取。這種方法既能為開發(fā)者提供實(shí)踐反饋,也不會(huì)導(dǎo)致實(shí)時(shí)應(yīng)用程序遭遇中斷。
至于 React Server Component 呢?最新發(fā)布的信息中并沒有提及,文檔仍然將其描述為實(shí)驗(yàn)性的,但 Vercel Next.js 中已經(jīng)包含。官方建議開發(fā)人員使用一種框架,團(tuán)隊(duì)似乎更愿意在這種情況下考慮服務(wù)器組件。文檔中寫道,“我們希望在一兩年內(nèi),本頁上列出的所有框架都能完全支持這些特性”,包括服務(wù)器組件。
React 開發(fā)者需要做哪些準(zhǔn)備?總的來說,React 19 是一次令人興奮的更新,帶來眾多新功能。通過規(guī)劃和測(cè)試,大多數(shù)應(yīng)用程序應(yīng)該可以順利完成升級(jí)。React 團(tuán)隊(duì)也在努力平衡新功能與穩(wěn)定性,幫助開發(fā)人員建立起卓越的用戶體驗(yàn)。
目前,React 團(tuán)隊(duì)仍在權(quán)衡應(yīng)在 19 版本中引入哪些調(diào)整。以下是網(wǎng)友推測(cè)可能的后續(xù)版本升級(jí)方向:
-
React 20 將引入新的 Profiler API 以進(jìn)行性能跟蹤。請(qǐng)?zhí)崆伴喿x說明文檔并做好準(zhǔn)備。
-
后續(xù) React 版本將不斷增強(qiáng)嚴(yán)格模式,因此強(qiáng)烈建議大家即使并非強(qiáng)制要求,也應(yīng)采用嚴(yán)格模式檢查。
-
React 團(tuán)隊(duì)計(jì)劃繼續(xù)改進(jìn)開發(fā)者體驗(yàn)、DevTools、測(cè)試等,感興趣的朋友可以關(guān)注官方博客并隨時(shí)獲取動(dòng)態(tài)。
在最終結(jié)果發(fā)布前,開發(fā)者可以通過以下方式為新版本做好準(zhǔn)備:
-
關(guān)注涉及潛在重大變更的 React 博文和說明文檔。
-
首先在非關(guān)鍵項(xiàng)目上試用 React 19 beta。
-
提前更新 React 技能與工具。
-
關(guān)注關(guān)于穩(wěn)定性和候選版本的公告。
可能發(fā)生重大變化的關(guān)鍵領(lǐng)域,包括錯(cuò)誤邊界、生命周期方法 API,以及從渲染屬性到 hooks 的各類變更。更多詳細(xì)信息將在發(fā)布期間逐步公開,但 React 團(tuán)隊(duì)將努力避免那些不必要的重大變更。
參考鏈接:
https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024
https://dev.to/gbengacode/react-19-is-here-oha
https://daily.dev/blog/react-19-everything-you-need-to-know-in-one-place
https://devclass.com/2024/02/22/react-19-introduced-and-forget-compiler-now-in-production-at-instagram-but-not-yet-widely-available/
?
