React 19 beta 終于來了,但其中一些非常棒的功能卻因困惑和溝通不暢而黯然失色。
React 19 beta 可以隨時發布,但現在選擇在 2024 年 3 月 25 日發布實屬最佳,因為開發世界暫時沒有其他重大事件。
一些開發者對這次發布持樂觀態度,但也有許多人擔心此次版本中沒有提到編譯器。
React 編譯器是 React 團隊長時間實驗的工具,目前用于運行 Instagram,并且預計很快會發布。開發者們對編譯器的期望很高,因為它將減少手動記憶化的需求,這是一項耗時且容易出錯的 React 修補工作。有了編譯器,React 將更善于判斷何時需要更新 UI,何時不需要,從而提升性能。
但我們仍不確定編譯器何時能正式發布??赡茉谖逶?,也許是 2024 年或 2026 年?希望它能在新 GTA 發布前上線!
SPA(單頁應用)愛好者可能對這些消息不太滿意,因為 React 仍在繼續推進對服務器端特性的支持。
其實,SPA 并不適合描述這類應用程序。任何認為應用和 API 應該完全分開的開發者都可能不喜歡 React 正在推進的方向。
use server 和 actions 引入了一個新的思維模式,在這一模式下,可以在服務器或瀏覽器中無縫運行代碼,除非明確指定其他方式。
這種新的思維模式通過 actions 得到了擴展,能夠處理待處理和錯誤狀態。
然而,這個新模型在博客文章中解釋得并不清楚,容易讓 React 開發者感到困惑。
這也可以理解,因為新的 React 文檔建議開發者使用基于 React 的框架,而不是直接使用 React。但另一方面,這也使得直接使用 React 的開發者面臨困難局面。
我們有了新的 hooks 和表單操作,可以直接從表單元素級別獲取表單狀態。
新的 API 可以通過 use 函數調用來掛起功能,還提供了服務器組件。
React 團隊需要付出大量努力來向新手程序員解釋這些復雜內容。
但也有一些不錯的方面。
forwardRef 現在將被替換,你可以直接用 ref 傳遞組件元素。這是一個讓人意外的好變化。
現在提供上下文時,你無需使用 Context.Provider
,而是直接使用 Context
。示例如下:
const ThemeContext = createContext('');function App({children}) { return ( <ThemeContext value="dark"> {children} </ThemeContext> ); }
通過在組件卸載時清理關聯的 refs,可以確保沒有懸掛的引用或潛在的內存泄漏。
<input ref={(ref) => { // 當 ref 被創建時,執行一些初始化操作 if (ref) { // 初始化代碼,例如,添加事件監聽器或設置屬性 } // 返回清理函數,在元素被移除時調用 return () => { // 清理代碼,例如,移除事件監聽器或重置屬性 }; }}/>
另一個值得注意的改進是,現在支持從任意組件動態更新 <meta> 標簽。
import { Helmet } from "react-helmet";function BlogPost({ post }) { return ( <article> <Helmet> <title>{post.title}</title> <meta name="author" content="Josh" /> <link rel="author" /> <meta name="keywords" content={post.keywords} /> </Helmet> <h1>{post.title}</h1> <p>Eee equals em-see-squared...</p> </article> );}
現在,在組件級別添加樣式將不會出現任何問題。React 將在顯示組件之前加載樣式表,這也為懶加載樣式提供了可能性:
function ComponentOne() { return ( <Suspense fallback="loading..."> <link rel="stylesheet" href="foo" precedence="default" /> <link rel="stylesheet" href="bar" precedence="high" /> <article class="foo-class bar-class"> {...} </article> </Suspense> )}
在 React 19 中,你將能夠在組件中使用函數預加載資源,而不是在 HTML 中通過 HTML 標簽預加載。
import { prefetchDNS, preconnect, preload, preinit } from 'react-dom'function MyComponent() { preinit('https://.../path/to/some/script.js', {as: 'script' }) // loads and executes this script eagerly preload('https://.../path/to/font.woff', { as: 'font' }) // preloads this font preload('https://.../path/to/stylesheet.css', { as: 'style' }) // preloads this stylesheet prefetchDNS('https://...') // when you may not actually request anything from this host preconnect('https://...') // when you will request something but aren't sure what}
React 團隊仍在努力支持 HTML 自定義元素。雖然目前還沒有針對 React 19 beta 的官方測試結果,但根據 React 博客的說法,它是符合測試標準的。
PropTypes 是 React 團隊做出的一個奇怪決策,當時他們完全忽略了 TypeScript 的存在。
幸運的是,PropTypes 在 2017 年被棄用,現在處理它們的代碼已從 React 中移除。這意味著在代碼庫中保留這些怪物般的工具已經沒有意義了。如果想要了解自己正在使用的類型,至少需要將代碼庫重寫為 TypeScript。
React 19 beta 已經發布,但這并不意味著你必須立刻更新。我建議等待正式發布。然而,你可以先安裝 React 18.3.0。它和 18.2.0 類似,但會顯示關于在 React 19 中將被廢棄的功能的提示信息。
因此,你可以提前做好準備。
你可以在 npm 上找到 React 19 beta 和 React 18.3.0 版本的構建包。
React 19 beta 的源碼暫時不可用。
本文鏈接:http://www.tebozhan.com/showinfo-26-87480-0.html開發者對 React 19 Beta 發布感到困惑
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 一文徹底搞明白組合模式