柚子快報(bào)邀請(qǐng)碼778899分享:React 19 新特性集合
前言:https://juejin.cn/post/7337207433868197915
新 React 版本信息
伴隨 React v19 Beta 的發(fā)布,React v18.3 也一并發(fā)布。
React v18.3相比最后一個(gè) React v18 的版本 v18.2 ,v18.3 添加了一些警告提示,便于盡早發(fā)現(xiàn)問題,從而在升級(jí) React v19 時(shí)更容易。
React 18.3 更新內(nèi)容
React 18.3 相對(duì)于 18.2 增加了對(duì)廢棄 API 的警告以及其他為 React 19 所需的更改。
React
允許向?this.refs?寫入以支持字符串?ref?的代碼模式轉(zhuǎn)換。在?StrictMode?外部使用已廢棄的?findDOMNode?時(shí),將發(fā)出警告。對(duì)使用已廢棄的測(cè)試工具方法時(shí)發(fā)出警告。在 StrictMode 外部使用已廢棄的遺留 Context 時(shí),將發(fā)出警告。在 StrictMode 外部使用已廢棄的字符串?ref?時(shí),將發(fā)出警告。對(duì)函數(shù)組件中使用已廢棄的?defaultProps?發(fā)出警告。當(dāng)在組件或元素中展開?key?時(shí),將發(fā)出警告。從測(cè)試工具中使用?act?時(shí),如果方式不當(dāng),將發(fā)出警告。
React DOM對(duì)使用已廢棄的?unmountComponentAtNode?方法時(shí)發(fā)出警告。對(duì)使用已廢棄的?renderToStaticNodeStream?方法時(shí)發(fā)出警告。
React v18 發(fā)布后,帶來了以并發(fā)特性為主的各種新 API ( startTransition / useDeferredValue 等 )、新運(yùn)作模式、及 stream SSR 上的改進(jìn)等,其相比 React v17 像是一個(gè)增量的升級(jí)版。
而 React v19 則不然,包含了 大量 細(xì)小的、或破壞性的變更(如document meta data 和asset loading)。
由于 React?v18 canary?已迭代很久,本次更新中的很多內(nèi)容屬于歷史已公布的內(nèi)容,故不會(huì)重復(fù)做展開介紹。
React v19 中的新特性 – 概述 以下是 React 19 將具有的新特性的快速概述:
烙 React 編譯器react compiler:React 正在努力實(shí)現(xiàn)一個(gè)新的編譯器。目前,Instagram 已經(jīng)在利用這項(xiàng)技術(shù),它將在未來版本的 React 中發(fā)布。
? 服務(wù)器組件react server component:經(jīng)過多年的開發(fā),React 引入了服務(wù)器組件的概念。您現(xiàn)在可以在 Next.js 中使用此功能。
? 動(dòng)作action:動(dòng)作還將徹底改變我們與 DOM 元素的交互方式。
? 文檔元數(shù)據(jù)document metadata:另一個(gè)急需改進(jìn)的方面即將到來,使開發(fā)人員能夠用更少的代碼實(shí)現(xiàn)更多功能。
? 資源加載asset loading:這將使資源能夠在后臺(tái)加載,從而改善應(yīng)用程序的加載時(shí)間和用戶體驗(yàn)。
?? Web 組件:這特別令人著迷:React 代碼現(xiàn)在將使我們能夠集成 Web 組件。我對(duì)此發(fā)展非常激動(dòng),因?yàn)樗鼘㈤_啟無數(shù)可能性。
? 增強(qiáng)型鉤子:令人興奮的新鉤子即將問世,將徹底改變我們的編碼體驗(yàn)。
新的 use() 鉤子useFormStatus() 鉤子useFormState() 鉤子useOptimistic() 鉤子
React 19 將解決 React 長(zhǎng)期存在的挑戰(zhàn)之一:過度重新渲染的問題。開發(fā)人員歷來花費(fèi)了大量時(shí)間來解決這個(gè)問題,這經(jīng)常導(dǎo)致性能問題。
對(duì)導(dǎo)致重新渲染的代碼進(jìn)行持續(xù)追蹤和優(yōu)化工作一直是工程師們的重復(fù)任務(wù)。但是有了 React 19,這個(gè)問題將得到緩解??蚣軐⒆詣?dòng)處理重新渲染,簡(jiǎn)化開發(fā)流程。
以前,開發(fā)人員依賴 useMemo()、useCallback()、memo 等技術(shù)來管理重新渲染。但是在 React 19 中,這樣的手動(dòng)干預(yù)將不再必要。
框架將在幕后智能識(shí)別和記憶代碼,從而產(chǎn)生更清晰和更有效的代碼。?
React v20 目前已知內(nèi)容:
React compiler (編譯優(yōu)化器,如 React forget )不等于 React v19 。Activity ( 原 Offscreen )可能在 React v20 推出。
V19新特性介紹
1.?React 編譯器
這是為了性能做的更新。優(yōu)化重新渲染的一種方式是手動(dòng)使用 useMemo()、useCallback() 和 memo API。根據(jù) React 團(tuán)隊(duì)的說法,這是一種“合理的手動(dòng)妥協(xié)”。他們的愿景是讓 React 管理這些重新渲染。但是 React 團(tuán)隊(duì)意識(shí)到手動(dòng)優(yōu)化很繁瑣,而社區(qū)的反饋鼓勵(lì)他們解決這個(gè)問題。因此,React 團(tuán)隊(duì)創(chuàng)建了“React 編譯器”。React 編譯器現(xiàn)在將管理這些重新渲染。React 將自動(dòng)決定何時(shí)以及如何更改狀態(tài)并更新 UI。
React Compiler,在開發(fā)者不調(diào)整任何代碼的情況下,自動(dòng)優(yōu)化項(xiàng)目性能。幫助我們?cè)诓皇褂?memo/useMemo/useCallback 的情況下,方便的處理好項(xiàng)目 re-render 的問題。你的項(xiàng)目最終只會(huì)在需要更新的地方 re-render。React Compiler 編譯之后,你的代碼并不會(huì)改變現(xiàn)有渲染機(jī)制,而是在已有機(jī)制下完成對(duì)項(xiàng)目的優(yōu)化。
React Compiler能夠?qū)eact代碼編譯成更為優(yōu)化的JavaScript代碼。這一改變能夠顯著提升React應(yīng)用的運(yùn)行效率。編譯器的引入不僅優(yōu)化了代碼的執(zhí)行時(shí)間,還減少了瀏覽器的負(fù)載,從而使應(yīng)用響應(yīng)更快,交互更流暢。
與依賴追蹤的細(xì)粒度更新不同,React Compiler 通過記憶的方式,讓組件更新只發(fā)生在需要更新的組件,從而減少大量 re-render 的組件。
但是請(qǐng)注意,React Compiler 并非全能,如果你寫的代碼過于靈活,無法被提前預(yù)判執(zhí)行行為,那么 React Compiler 將會(huì)跳過這一部分的優(yōu)化。因此好的方式是在項(xiàng)目中引入嚴(yán)格模式,在嚴(yán)格模式的指導(dǎo)下完成的開發(fā),基本都在 React Compiler 的輻射范圍之內(nèi)
例子1:在 React19 之后,不再需要使用 useMemo() 鉤子,因?yàn)?React 編譯器將自行進(jìn)行記憶。
之前:
import React, { useState, useMemo } from 'react';
function ExampleComponent() {
const [inputValue, setInputValue] = useState('');
// 緩存檢查輸入值是否為空的結(jié)果
const isInputEmpty = useMemo(() => {
console.log('檢查輸入是否為空...');
return inputValue.trim() === '';
}, [inputValue]);
return (
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="輸入一些內(nèi)容..."
/>
{isInputEmpty ? '輸入為空' : '輸入不為空'}
);
}
export default ExampleComponent;
之后:不需要再使用 useMemo 緩存值了 - React19 將在底層自行處理。
import React, { useState } from 'react';
function ExampleComponent() {
const [inputValue, setInputValue] = useState('');
const isInputEmpty = () => {
console.log('檢查輸入是否為空...');
return inputValue.trim() === '';
});
return (
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="輸入一些內(nèi)容..."
/>
{isInputEmpty ? '輸入為空' : '輸入不為空'}
);
}
export default ExampleComponent;
2. 服務(wù)器組件?
React Server Components 是 React 在探索前端邊界的又一次突破性的創(chuàng)舉。它是一種新概念組件。我們可以在構(gòu)建時(shí)運(yùn)行一次組件,以提高頁面的渲染速度。
預(yù)渲染、增量渲染、流式傳輸?shù)雀拍顚?duì)提高大型復(fù)雜項(xiàng)目的用戶體驗(yàn)有非常大的幫助。好消息是,RSC 已經(jīng)在 Next.js 中得到落地實(shí)踐。
React 19加強(qiáng)了對(duì)服務(wù)端組件(Server Components)的支持,這些組件在服務(wù)器上渲染完成后再發(fā)送到客戶端,極大地提高了頁面加載速度。
這一特性尤其適合內(nèi)容重的網(wǎng)站應(yīng)用,允許部分組件的邏輯在服務(wù)器上執(zhí)行,而不會(huì)發(fā)送相關(guān)的JavaScript到客戶端。這樣做的好處包括減少了傳輸數(shù)據(jù)量,加快了首次加載速度,并優(yōu)化了SEO。
舉個(gè)例子:
// ServerUserInfo.react.server.js
// 注意:這個(gè)文件的擴(kuò)展名為 .server.js,表示它是一個(gè)服務(wù)端組件。
import { db } from './database';
// 從數(shù)據(jù)庫中獲取用戶信息的函數(shù)
async function fetchUserData(userId) {
return db.query('SELECT * FROM users WHERE id = $1', [userId]);
}
function ServerUserInfo({ userId }) {
const userData = fetchUserData(userId);
return (
User Information
Name: {userData.name}
Email: {userData.email}
);
}
export default ServerUserInfo;
這樣我們就創(chuàng)建了一個(gè)服務(wù)端組件,它直接從數(shù)據(jù)庫獲取用戶信息,并在服務(wù)器上進(jìn)行渲染。這樣做還可以保護(hù)用戶的敏感信息,因?yàn)檫@些數(shù)據(jù)不會(huì)被發(fā)送到客戶端,同時(shí)增強(qiáng)了安全性,并且由于減少了客戶端處理邏輯,頁面加載速度更快。
在客戶端中,我們只需要引用這個(gè)組件,并在構(gòu)建時(shí)配置好相關(guān)的服務(wù)端渲染邏輯。
服務(wù)端組件帶來的額優(yōu)勢(shì):
SEO:服務(wù)器渲染的組件通過向網(wǎng)絡(luò)爬蟲提供更可訪問的內(nèi)容來增強(qiáng)搜索引擎優(yōu)化。性能提升:服務(wù)器組件有助于更快地加載頁面和改善整體性能,特別是對(duì)于內(nèi)容密集型應(yīng)用程序。服務(wù)器端執(zhí)行:服務(wù)器組件使在服務(wù)器上執(zhí)行代碼變得無縫和高效,使諸如 API 調(diào)用之類的任務(wù)變得輕松。
目前 Next.js 支持服務(wù)器端組件。React 中所有組件默認(rèn)都是客戶端的。只有當(dāng)你使用 ‘use server’ 時(shí),組件才是服務(wù)器組件 可以在同一項(xiàng)目中的任何 React 組件中導(dǎo)入 requestUsername。在導(dǎo)入服務(wù)器組件后,我們可以使用“Actions”(我們很快會(huì)學(xué)習(xí)到)執(zhí)行特定任務(wù)。
'use server';
export default async function requestUsername(formData) {
? const username = formData.get('username');
? if (canRequest(username)) {
? ? // ...
? ? return 'successful';
? }
? return 'failed';
}
3.?動(dòng)作 action
submitData 是服務(wù)器組件中的動(dòng)作。form 是一個(gè)客戶端組件,它使用 submitData 作為動(dòng)作。submitData 將在服務(wù)器上執(zhí)行??蛻舳耍╢orm)和服務(wù)器(submitData)組件之間的通信只有通過動(dòng)作屬性才能實(shí)現(xiàn)。
"use server"
const submitData = async (userData) => {
const newUser = {
username: userData.get('username'),
email: userData.get('email')
}
console.log(newUser)
}
const Form = () => {
return
}
export default Form;
相關(guān)新增的api:
新 API :useActionState 重要性:★
參考信息:useActionState 代碼例子
此 API 原名為 useFormState ,主要用于聯(lián)動(dòng)原生
表單提交,現(xiàn)代開發(fā)更多使用高級(jí)表單庫,故此特性不重要。新 API :useFormStatus 重要性:★
參考信息:useFormStatus 文檔
此 API 與 useFormState 聯(lián)動(dòng)使用,現(xiàn)代開發(fā)更多使用高級(jí)表單庫,故此特性不重要。
新 API :useOptimistic 重要性:★★
參考信息:useOptimistic 文檔
通過此 API 派生其他的 state ,從而在提交動(dòng)作時(shí),立即樂觀更新此值來優(yōu)化用戶視覺上的交互體驗(yàn)。
要實(shí)現(xiàn)樂觀更新,必然要編寫許多額外邏輯,同時(shí)現(xiàn)代請(qǐng)求庫(如 react-query 、SWR 等)早已提供了樂觀更新的功能。然而更多時(shí)候,我們沒有精力和工時(shí)來提升用戶體驗(yàn),過度提升體驗(yàn)反而會(huì)造成更多冗余的樂觀更新邏輯導(dǎo)致后續(xù)維護(hù)困難,展示 loading 已經(jīng)足夠,故此 API 不重要,若不是有心為之,則很難用到。
4. Web 組件
Web 組件允許你使用原生 HTML、CSS 和 JavaScript 創(chuàng)建自定義組件,并將它們無縫地整合到你的 Web 應(yīng)用程序中,就像它們是標(biāo)準(zhǔn) HTML 標(biāo)簽一樣。
之前,在 React 中集成 Web 組件并不簡(jiǎn)單。通常情況下,要么需要將 Web 組件轉(zhuǎn)換為 React 組件,要么安裝額外的包并編寫額外的代碼,以使 Web 組件與 React 協(xié)同工作。
React 19改進(jìn)了對(duì)Web組件的支持,使得在React項(xiàng)目中整合使用Web標(biāo)準(zhǔn)組件變得更加無縫。這使得開發(fā)者可以利用廣泛的Web組件生態(tài)系統(tǒng),而不必為了在React中使用它們而寫大量的封裝代碼。
import React from 'react';
function CustomButtonComponent() {
return (
<>
>
);
}
export default CustomButtonComponent;
在這個(gè)示例中,
可能有的同學(xué)會(huì)說,這一個(gè)自定義的標(biāo)簽有什么用呢?回答是:非常有用。
因?yàn)樵赗eact 19的現(xiàn)代Web框架中使用Web組件時(shí),
它實(shí)際上是一個(gè)Web組件——這是一種使用自定義元素、Shadow DOM、HTML模板封裝好的可重用組件。 當(dāng)你在Web應(yīng)用中使用像
這些自定義元素的行為和外觀完全由你定義的Web組件的JavaScript和CSS控制。以下假設(shè)定義了一個(gè)自定義的web組件:
class MyButton extends HTMLElement {
constructor() {
super(); // 調(diào)用父類的constructor
const shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.innerHTML = `
`;
}
}
// 定義新的自定義元素
customElements.define('my-button', MyButton);
5. 文檔元數(shù)據(jù)?
對(duì)元數(shù)據(jù)的管理變得更加簡(jiǎn)單。React 19引入了可以直接在React組件中使用HTML元數(shù)據(jù)標(biāo)簽的能力,這樣開發(fā)者就不再需要依賴如react-helmet這樣的庫來動(dòng)態(tài)更新文檔頭部信息。
1)基本元數(shù)據(jù)標(biāo)簽
考慮到 SSR 的完備性,使用第三方庫插入元信息仍然更好,所以此特性不重要。
之前:
import React, { useEffect } from 'react';
const HeadDocument = ({ title }) => {
useEffect(() => {
document.title = title;
const metaDescriptionTag = document.querySelector('meta[name="description"]');
if (metaDescriptionTag) {
metaDescriptionTag.setAttribute('content', 'New description');
}
}, [title]);
return null;
};
export default HeadDocument;
?現(xiàn)在:在 React 中以前是不可能的。唯一的方法是使用像 react-helmet 這樣的包。
function HomePage() {
return (
<>
歡迎來到我的網(wǎng)站
這里有豐富的資源和信息。
>
);
}
在這個(gè)示例中,
React 19可以處理這些標(biāo)簽,并將它們正確地渲染到HTML文檔的頭部。這種方式簡(jiǎn)化了元數(shù)據(jù)的管理,特別是在單頁面應(yīng)用中,可以更靈活地針對(duì)不同頁面設(shè)置SEO相關(guān)的元數(shù)據(jù)。
2)樣式表支持
參考信息:插入 link / meta / script / style / title 文檔說明
對(duì)于使用 webpack 等打包工具進(jìn)行模塊化開發(fā)的現(xiàn)代,除 特別的樣式覆蓋 或 異步分包、構(gòu)建工具缺陷 等原因?qū)е聦?duì)順序出現(xiàn) workaround 的需求外,一般我們?cè)跇I(yè)務(wù)項(xiàng)目?jī)?nèi)不會(huì)接觸到手動(dòng)管理標(biāo)簽的情況,故此特性不重要
在Web開發(fā)中,樣式表的管理至關(guān)重要,無論是通過外部鏈接()還是內(nèi)嵌方式()引入,都需要在 DOM 中精準(zhǔn)布局,以確保樣式優(yōu)先級(jí)得到妥善處理。然而,構(gòu)建一個(gè)能夠支持組件內(nèi)部樣式表組合的機(jī)制往往十分繁瑣,因此開發(fā)者常常面臨權(quán)衡:要么將樣式遠(yuǎn)離其依賴的組件加載,犧牲組織性;要么依賴外部樣式庫,增加額外的復(fù)雜性。
React 19 針對(duì)這一挑戰(zhàn)提供了內(nèi)置支持,不僅簡(jiǎn)化了樣式表的管理流程,還進(jìn)一步增強(qiáng)了與客戶端并發(fā)渲染和服務(wù)器端流式渲染的集成能力。通過指定樣式表的優(yōu)先級(jí),React 將自動(dòng)處理樣式表在DOM中的插入順序,確保在展示依賴于特定樣式規(guī)則的內(nèi)容之前,相關(guān)的樣式表(無論外部還是內(nèi)嵌)已經(jīng)被加載并應(yīng)用。
function ComponentOne() {
return (
{...}
)
}
function ComponentTwo() {
return (
{...}
<-- will be inserted between foo & bar
)
}
在服務(wù)端渲染過程中,React會(huì)將樣式表包含在
標(biāo)簽中,以確保瀏覽器在加載完成前不會(huì)進(jìn)行頁面繪制。如果在已經(jīng)開始流式傳輸后才發(fā)現(xiàn)樣式表,React 將確保在客戶端將樣式表插入到標(biāo)簽中,然后再展示依賴于該樣式表的Suspense邊界的內(nèi)容。在客戶端渲染過程中,React會(huì)等待新渲染的樣式表加載完成后再提交渲染結(jié)果。如果在應(yīng)用中的多個(gè)位置渲染了這個(gè)組件,React將確保樣式表在文檔中只被包含一次。
function App() {
return <>
...
>
}
對(duì)于那些習(xí)慣于手動(dòng)加載樣式表的開發(fā)者來說,React 19 的這一改進(jìn)為他們提供了一個(gè)便利的機(jī)會(huì)?,F(xiàn)在,可以將樣式表直接放在依賴它們的組件旁邊,這不僅有助于提升代碼的可讀性和可維護(hù)性,使得開發(fā)者可以更加清晰地了解每個(gè)組件的樣式依賴關(guān)系,而且還能夠確保只加載真正需要的樣式表。
此外,樣式庫和與打包器集成的樣式工具也可以采用這一新特性。即使開發(fā)者不直接渲染自己的樣式表,只要他們所使用的工具升級(jí)到支持這一功能,他們同樣能夠享受到這一改進(jìn)帶來的好處。
?3)異步腳本支持
在HTML中,普通腳本(
...
通過利用這些API,開發(fā)者可以優(yōu)化頁面的初始加載速度,減少用戶等待時(shí)間。同時(shí),在客戶端更新時(shí),預(yù)取和預(yù)加載資源也能幫助加快導(dǎo)航速度,提升用戶體驗(yàn)。無論是通過預(yù)加載字體和樣式表來減少頁面渲染阻塞,還是通過預(yù)取DNS和預(yù)連接來加速資源請(qǐng)求,這些API都為開發(fā)者提供了強(qiáng)大的工具,使資源加載更加智能和高效。
分類來看:
preconnect 、prefetchDNS 等 API 將插入 標(biāo)簽的行為命令化,但由于預(yù)加載時(shí)機(jī)越早越好,等到 React 應(yīng)用運(yùn)行后,已經(jīng)錯(cuò)過了 preconnect 的最好時(shí)機(jī),所以編寫至 HTML 內(nèi)或 SSR 仍然是首選方案,此類 API 不重要。preinit / preload 等 API 將 腳本、樣式 的加載命令化,但現(xiàn)代項(xiàng)目開發(fā)時(shí)已經(jīng)內(nèi)部模塊化,使用 await import() 等懶加載行為已足夠,故除了需要加載外部 腳本、樣式 外,此 API 也不重要。
6)與第三方腳本和擴(kuò)展的兼容性
在React 19中,對(duì)掛載過程進(jìn)行了優(yōu)化,以更好地兼容第三方腳本和瀏覽器擴(kuò)展。
在客戶端掛載時(shí),如果渲染的元素與服務(wù)器返回的HTML中的元素不一致,React會(huì)觸發(fā)客戶端的重新渲染,以確保內(nèi)容的正確性。然而,過去,若第三方腳本或?yàn)g覽器擴(kuò)展插入了某些元素,這會(huì)導(dǎo)致不匹配錯(cuò)誤并觸發(fā)不必要的客戶端渲染。
現(xiàn)在,React 19 能夠智能地跳過
和中的意外標(biāo)簽,從而避免了因這些元素引發(fā)的不匹配錯(cuò)誤。即使因?yàn)槠渌蛐枰M(jìn)行整個(gè)文檔的重新渲染,React也會(huì)保留由第三方腳本和瀏覽器擴(kuò)展插入的樣式表,確保頁面的完整性和一致性。7)水合錯(cuò)誤報(bào)告
React 19 在 react-dom 中對(duì)水合錯(cuò)誤的報(bào)告進(jìn)行了優(yōu)化。過去,在開發(fā)模式下遇到水合不匹配時(shí),系統(tǒng)往往只記錄多個(gè)錯(cuò)誤,而缺乏關(guān)于不匹配內(nèi)容的具體信息。現(xiàn)在,引入了 diff 功能,使得客戶端渲染與服務(wù)端渲染內(nèi)容之間的差異一目了然。這一改進(jìn)不僅提升了錯(cuò)誤報(bào)告的清晰度,更有助于開發(fā)者迅速定位并修復(fù)水合相關(guān)問題,從而大幅提升開發(fā)效率。
現(xiàn)在只會(huì)記錄一條包含不匹配內(nèi)容差異的消息:
8)更好的錯(cuò)誤報(bào)告
為了提供更細(xì)粒度的錯(cuò)誤處理控制,還新增了兩個(gè)根選項(xiàng)來與onRecoverableError相輔相成:
onCaughtError:當(dāng)React在錯(cuò)誤邊界中成功捕獲到錯(cuò)誤時(shí),此選項(xiàng)將被調(diào)用。onUncaughtError:當(dāng)錯(cuò)誤被拋出且未能被任何錯(cuò)誤邊界捕獲時(shí),此選項(xiàng)將被觸發(fā)。onRecoverableError:當(dāng)錯(cuò)誤發(fā)生但React能夠自動(dòng)恢復(fù)時(shí),該選項(xiàng)將起作用。
參考信息:onCaughtError?/?onUncaughtError?/?onRecoverableError?文檔說明
這些新增選項(xiàng)不僅增強(qiáng)了React的錯(cuò)誤處理能力,還賦予了開發(fā)者在不同錯(cuò)誤場(chǎng)景下執(zhí)行特定邏輯的能力。無論是進(jìn)行錯(cuò)誤日志的記錄、發(fā)送錯(cuò)誤報(bào)告,還是執(zhí)行其他自定義操作,這些選項(xiàng)都能滿足開發(fā)者的需求,幫助他們更有效地管理和應(yīng)對(duì)React應(yīng)用中的錯(cuò)誤情況。
給 React 在全局 ReactDOM.createRoot 掛載時(shí)開放了一個(gè)全局捕獲錯(cuò)誤的出口:
ReactDOM.createRoot(document.getElementById('root')!, {
onCaughtError: (error, errorInfo) => {
// ...
},
})
這可以避免在 ErrorBoundary 內(nèi)部收集錯(cuò)誤,而在全局更清真的統(tǒng)一處理(此處只是單純報(bào)告錯(cuò)誤,涉及到復(fù)雜的 ErrorBoundary 錯(cuò)誤恢復(fù)和重試,仍然需要編寫大量代碼)。
注:不可以捕獲 React 內(nèi)的異步邏輯錯(cuò)誤。
React 19 對(duì)錯(cuò)誤處理進(jìn)行了優(yōu)化,旨在消除錯(cuò)誤信息的重復(fù),并為處理捕獲和未捕獲的錯(cuò)誤提供了更多選項(xiàng)。例如,當(dāng)渲染過程中發(fā)生錯(cuò)誤并被錯(cuò)誤邊界捕獲時(shí),以前 React 會(huì)重復(fù)拋出相同的錯(cuò)誤(一次是原始錯(cuò)誤,另一次是在嘗試自動(dòng)恢復(fù)失敗后),然后調(diào)用console.error輸出錯(cuò)誤發(fā)生位置的信息。
這種處理方式導(dǎo)致每個(gè)被捕獲的錯(cuò)誤都會(huì)被報(bào)告三次:
在 React 19 中將記錄單個(gè)錯(cuò)誤,并包含所有錯(cuò)誤信息:
?
9)useRef 必須傳入默認(rèn)值 重要性:★★★
參考信息:useRef 入?yún)⒏恼f明
React v19 要求 useRef(defaultValue) 傳入一個(gè)默認(rèn)值,這會(huì)影響到所有歷史 useRef() 未設(shè)定默認(rèn)值的調(diào)用寫法。
在以前,我們往往會(huì)通過 useRef
10)React UMD 版本已被刪除 重要性:★★★
參考信息:刪除 UMD
仍有不少項(xiàng)目希望通過 external React UMD 的方式進(jìn)行一些依賴外置化加載的設(shè)計(jì),但未來 esm 是大勢(shì)所趨,故 React v19 已刪除 UMD 版本。
如還想通過外置形式使用 React ,需改為 esm 的
各種不重要的小變化
API 相關(guān)
ReactDOM.render / ReactDOM.hydrate 舊版渲染應(yīng)用 API 已被刪除( 鏈接 ) useDeferredValue 支持設(shè)定默認(rèn)值( 鏈接 )React.createFactory 已被刪除( 鏈接 )react-test-renderer/shallow 導(dǎo)出位置已被更改( 鏈接 )unmountComponentAtNode 舊版卸載節(jié)點(diǎn) API 已被刪除( 鏈接 )ReactDOM.findDOMNode API 已被刪除( 鏈接 )
特性相關(guān)
更好的 web components 支持( 鏈接 )
注:這是一個(gè)較矚目的新特性,但大多數(shù)人很少使用 web component ,故只有特定用戶群體才值得去關(guān)注。
體驗(yàn)相關(guān)
水合出現(xiàn)差異時(shí),報(bào)錯(cuò)信息更友好( 鏈接 )。優(yōu)化了控制臺(tái)錯(cuò)誤打印的格式( 鏈接 )useLayoutEffect 在服務(wù)端運(yùn)行的警告已被刪除( 鏈接 )
Class 組件相關(guān)
Class 組件的 propTypes / defaultProps 已被刪除( 鏈接 )Class 組件的 getChildContext 已被刪除( 鏈接 )Class 組件的字符串 ref="string" 已被刪除( 鏈接 )
函數(shù)組件相關(guān)
函數(shù)組件的 render() 渲染方式已被刪除( 鏈接 )
測(cè)試相關(guān)
act 函數(shù)導(dǎo)出位置已轉(zhuǎn)移至 react ( 鏈接 )react-test-renderer 已棄用( 非刪除, 鏈接 )
注:此包以前可能用于一些簡(jiǎn)單的組件測(cè)試,但現(xiàn)在已被棄用,請(qǐng)?jiān)谒?React 的測(cè)試中統(tǒng)一使用 RTL ( @testing-library/react ),這將是官方推薦的唯一測(cè)試庫。
類型相關(guān)
ReactElement 類型被調(diào)整( 鏈接 )限定 React JSX 類型的命名空間( 鏈接 )注:為了避免各種 JSX 的類型在全局沖突,Vue v3.4 也限制了自己的命名空間。useReducer 類型改進(jìn)( 鏈接 )
新增api參考
柚子快報(bào)邀請(qǐng)碼778899分享:React 19 新特性集合
參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。