React 19.3: Adds a browser() API, Giving Client-Only Rendering a First-Class Name

TL;DR · AI 摘要
React 19.3 新增 browser() API,通过 Suspense 机制实现客户端专用组件的优雅退出,解决 SSR 渲染冲突问题。
核心要点
- browser() API 使组件在 SSR 时暂停渲染,避免 hydration mismatch
- 需配合 Suspense 边界使用,客户端渲染时返回 undefined
- Next.js 用户可替代 dynamic({ ssr: false }) 方案
结构提纲
按章节快速跳转。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- React 19.3 新特性
- browser() API
- SSR 退出机制
- Suspense 边界依赖
- 条件渲染实现
- 解决的痛点
- localStorage 读取冲突
- window 对象缺失
- 时区信息获取
- 生态影响
- 替代 Next.js dynamic API
- 框架兼容性提升
金句 / Highlights
值得收藏与分享的关键句。
use(browser()) 在服务器渲染时暂停组件,客户端渲染时返回 undefined
该 API 消除原有通过 typeof window 检查导致的 hydration mismatch
开发者评价该方案是 '解决客户端专用组件问题的最清晰方式'
React 19.3:新增 browser() API,为仅客户端渲染赋予正式名称 - InfoQ
InfoQ 首页 News React 19.3:新增 browser() API,为仅客户端渲染赋予正式名称
Web 开发
QCon AI 波士顿(2027年7月8-9日):AI 原型已成功运行。生产环境会发生什么?
React 19.3:新增 browser() API,为仅客户端渲染赋予正式名称
2026年10月12日 2分钟阅读
作者:
- Daniel Curtis
#### 关注我们
YouTube
232K 粉丝
26K 粉丝
新
RSS
19K 读者
X
57.1k 粉丝
21K 点赞
Bluesky
收听本文 -
0:00
音频准备就绪
您的浏览器不支持音频元素。
正常
1.25x
1.5x
喜欢
新下拉阅读列表
- 阅读列表
React 19.3 于9月9日通过 npm 发布,与稳定的视图转换和片段引用一同推出,新增了一个较小但广受好评的功能:react-dom 的 browser() API,允许组件正式退出服务器端渲染。分享文档的 Aurora Scharff 宣布该功能现已上线,可通过 Canary 渠道使用,开发者通过 use() 传递该值,组件在服务器端会暂停渲染。
该功能解决的问题对所有进行 SSR 的开发者都耳熟能详。读取 localStorage、window 或设备时区的组件无法在服务器端生成有意义的 HTML,而现有的变通方法笨拙。开发者要么在 effect 中切换 mounted 标志,要么用 typeof window !== 'undefined' 保护渲染,这种模式一旦服务器和首次客户端渲染结果不一致,就会导致水合不匹配。
新 API 取代了这两种方式:
import { use } from 'react';
import { browser } from 'react-dom';
function LocalTime() {
use(browser());
return <p>{new Intl.DateTimeFormat().resolvedOptions().timeZone}</p>;
}在服务器端渲染期间,use(browser()) 会阻止组件渲染,并在 HTML 中显示最近的 Suspense 边界后备内容。在浏览器中它返回 undefined,因此组件在水合后会正常渲染。该 API 必须从客户端组件中调用,并且必须位于 Suspense 边界内,否则服务器渲染会失败。由于 use() 可以在条件语句后调用,组件仅在必要时才会延迟渲染,例如数据钩子在 loader 提供 initialData 时在服务器端渲染,否则退出。React 还新增了 onBrowserBailout 回调和可选的 reason 参数,以便团队准确报告服务器渲染被跳过的具体位置。
该功能首次以 React 核心 PR 的形式实现,This Week in React 将其描述为“消除服务器端错误抑制的笨拙变通方法”。在跟踪该功能的文档问题中,一位贡献者表示:“对 browser() API 非常兴奋,因为它以更清晰的方式解决了仅客户端组件的问题。” 一位开发者在谈及该功能时称,条件数据获取版本是“我见过的最干净的解决方案,用于回答‘是否应在服务器端获取数据’的问题”。
该方法还缩小了与框架特定逃生舱的差距。Next.js 用户长期以来一直使用 next/dynamic 的 dynamic(() => import('./C'), { ssr: false }),而 Astro 提供了 client:only 指令,但两者都依赖于各自的打包工具。browser() 将该能力直接集成到 React 中,因此可以与任何 SSR 设置兼容,而不仅限于单一框架。
升级是标准的 [email protected] 和 [email protected] 版本更新,遵循 React 19 升级指南。不过 use reference 仍将 browser() 标记为仅限金丝雀渠道,因此在生产环境依赖前请确认您的发布渠道。
React 是一个开源的 JavaScript 库,用于构建用户界面。它最初由 Facebook 创建,现在由 Meta 及其庞大的贡献者社区共同维护。它推广了基于组件的模型,该模型将 UI 描述为状态的函数,并为 Next.js 和 Remix 等服务端和全栈框架,以及通过 React Native 的原生应用提供了基础支持。自 2013 年首次发布以来,它已成为最广泛使用的前端工具之一。近期版本进一步强化了服务端渲染、Suspense 以及浏览器() API 所依赖的并发特性。
作者部分的主要包装器
关于作者
章节标题
每位作者的主要包装器
#### Daniel Curtis
显示更多
显示更少
#### 本内容属于 Web 开发主题
##### 相关主题:
- 开发
- JavaScript
- 服务端渲染
- Next.js
- Web 开发
- React
- 相关编辑内容
- 相关赞助商 《实用智能体编码实践手册》
- 相关赞助商 大规模自动化代码转换。修复漏洞、迁移框架、现代化所有仓库中的遗留代码。免费试用 Moderne
InfoQ 新闻通讯
每周二发送上周 InfoQ 内容摘要。加入超过 250,000 名高级开发者的社区。查看示例
我们保护您的隐私。