You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ReactDOM.render is no longer supported in 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
// Beforeimport{hydrate}from'react-dom';constcontainer=document.getElementById('app');hydrate(<Apptab="home"/>,container);// Afterimport{hydrateRoot}from'react-dom/client';constcontainer=document.getElementById('app');constroot=hydrateRoot(container,<Apptab="home"/>);// Unlike with createRoot, you don't need a separate root.render() call here.
今天,我们发布了 React 18 RC 版本。正如我们在 React Conf 上分享的那样,React 18 基于 concurrent 模式,带来了更多能力,同时提供了渐进升级的方法。在这篇文章中,我们会一步一步的带您升级到 React 18。
安装
使用
@rc
标签来安装最新版 React客户端渲染 API 更新
当你首次安装 React 18 的时候,你会看到如下警告
React 18 提供了更合理的初始化 API,使用该 API,会自动启用 concurrent 模式:
同时我们将卸载方法从
unmountComponentAtNode
修改为root.unmount
:我们移除了
ReactDOM.render
函数的callback
,因为当使用 Suspense 的时候,它会有问题:最后,如果你使用 hydration 来实现了 SSR,需要将
hydrate
替换为hydrateRoot
:更多信息可见 Replacing render with createRoot
SSR API 更新
在 React 18 中,为了支持服务端的 Suspense 和流式 SSR,优化了
react-dom/server
的 API。使用以下 API,将会抛出警告:
renderToNodeStream
:废弃 ⛔️️相反,对于 Node 环境中的流式传输,请使用:
renderToPipeableStream
:新增 ✨我们还引入了一个新的 API,以在现代边缘运行时环境支持流式 SSR 和 Suspense,例如 Deno 和 Cloudflare workers:
renderToReadableStream
:新增 ✨下面的两个 API 可以继续使用,但是不支持 Suspense:
renderToString
:限制renderToStaticMarkup
:限制下面的 API 没有变化:
renderToStaticNodeStream
更多信息可见Upgrading to React 18 on the server、New Suspense SSR Architecture in React 18
自动批处理 Automatic Batching
在 React 18 之前,只能在 React 自己的事件机制中使用批处理,而在 Promise、setTimeout、原生事件等场景下,是不能使用批处理的。
React 18 支持了更多场景下的批处理,以提供更好的性能。
使用
createRoot
初始化 React 18 之后,所有的状态更新,会自动使用批处理,不关心应用场景。这是一个 break change,但是我们希望这能提升你的产品性能。当然,你仍然可以使用
flushSync
来手动取消批处理,强制同步执行:更多信息可见 Automatic batching for fewer renders in React 18
三方库 API
在 React 18 中,我们和三方库作者合作,定义了一些新的 API,以满足三方库在 concurrent 模式下特定场景的诉求。比如 styles 管理、外部状态管理、可访问性(accessibility)等场景。
为了支持 React 18,一些三方库可能需要用到下面的 API:
useId
是一个新的 Hook,支持在客户端和服务端生成唯一的 ID,同时避免hydration
的不兼容。它可以解决在 React 17 及更低版本一直存在的问题。在 React 18 中,这个问题尤为重要,因为流式 SSR 返回的 HTML 片段是无序的。更多信息可见 Intent to Ship: useIduseSyncExternalStore
是一个新的 Hook,允许外部状态管理器,强制立即同步更新,以支持并发读取。这个新的 API 推荐用于所有 React 外部状态管理库。详情见 useSyncExternalStore overview post、useSyncExternalStore API detailsuseInsertionEffect
是一个新的 Hook,它可以解决 CSS-in-JS 库在渲染中动态注入样式的性能问题。除非你已经构建了一个 CSS-in-JS 库,否则我们不希望你使用它。这个 Hook 执行时机在 DOM 生成之后,Layout Effect 执行之前。更多信息可见 Library Upgrade Guide for styleReact 18还为 concurrent 渲染引入了新的 API,例如
startTransition
和useDeferredValue
,在即将发布的稳定版本中会分享更多相关内容。严格模式 Strict Mode
未来,我们希望添加一个功能,允许 React 保存组件的状态,但移除 UI 部分。比如在返回旧的页面时,React 立即恢复之前的内容。为此,React 将使用之前保留的状态重新加载组件。
这个功能会给 React 项目带来非常好的体验,但要求组件支持 state 不变的情况下,组件多次卸载和重载。
为了检查出不合适的组件写法,React 18 在开发模式渲染组件时,会自动执行一次卸载,再重新加载的行为,以便检查组件是否支持 state 不变,组件卸载重载的场景。
在以前,React 加载组件的逻辑为:
在 React 18 严格模式的开发环境,React 会模拟卸载并重载组件:
更多信息可见: Adding Strict Effects to Strict Mode 、How to Support Strict Effects
配置测试环境
当你第一次在测试用例中使用
createRoot
时候,你会看到以下警告:为了修复这个问题,你需要在执行用例之前设置
globalThis.IS_REACT_ACT_ENVIRONMENT
为true
。这个标记告诉 React,它在一个类似单元测试的环境中运行。如果你忘了使用 act,React 将打印一些有用的警告。
你也可以将标志设置为 false 来告诉 React 不需要 act。 这对于模拟浏览器环境的端到端测试很有用。
当然,我们希望测试库会自动为您加上这个配置。 例如,下一个版本的 React Testing Library 内置了对 React 18 的支持,无需任何额外配置。
更多信息可见:More background on the the act testing API and related changes
移除了 IE 支持
在此版本中,React 将放弃对 Internet Explorer 的支持。我们进行此更改是因为 React 18 中引入的新功能是基于现代浏览器开发的,部分能力在 IE 上是不支持的,比如 microtasks。
如果您需要支持 Internet Explorer,我们建议您继续使用 React 17。
其它变更
The text was updated successfully, but these errors were encountered: