来自边缘的流式 SSR
使用 ReadableStream 流式传输 React 的 HTML 输出,使浏览器能够立即绘制有意义的内容
来自边缘的流式 SSR 是 CoddyKit 上的免费 React Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
流式传输的优势
当服务器以流式方式传输 HTML 时,浏览器会分块接收并渲染内容,而不是等待完整文档。这意味着用户可以看到并交互页面中已经可见的部分——页眉、导航、主视觉区域——同时依赖较慢数据的部分仍在加载。
带有 bootstrapScripts 的 renderToReadableStream
向 renderToReadableStream 传入 bootstrapScripts 会告诉 React 客户端 JS 代码包所在的位置。React 会在流末尾注入脚本标签,让浏览器加载代码包并调用 hydrateRoot,使页面随着各个部分完成流式传输而变得可交互。
组件树中的 Suspense 边界
React 的流式传输依赖 Suspense 边界,将组件树拆分成可以独立传输的部分。Suspense 边界内等待数据的组件(通过抛出 Promise)会先以占位内容传输,随后完成解析并在稍后传输真实内容。
onShellReady:何时开始流式传输
onShellReady 回调在非挂起的 HTML 外壳(Suspense 边界之外的所有内容)准备好进行流式传输时触发。这是设置 HTTP 状态码和响应标头,然后调用 pipe(res) 或开始从 ReadableStream 读取的正确时机。
为什么必须先设置状态码
HTTP 状态码和标头必须在响应正文开始之前发送。由于流式传输在 onShellReady 时开始,任何错误处理逻辑(设置状态 500、重定向)都必须在外壳开始传输之前执行——一旦开始流式传输,状态码就会锁定。
错误处理:onShellError
onShellError 在外壳准备好之前发生致命错误时触发——例如,顶层组件(位于任何 Suspense 边界之外)发生错误。此时外壳不会进行流式传输,您应返回静态错误页面或重定向到错误路由。
错误处理:onError
onError 对 Suspense 边界内可恢复的错误触发。React 仍可传输页面的其余部分;出错的边界会渲染其错误回退界面。使用 onError 进行日志记录:将错误捕获到可观测性平台,而不要中止流。
渐进式增强与超时
如果 Suspense 边界的数据耗时过长,请先流式传输外壳,并让该边界在客户端完成水合。请实现一个超时机制:5 秒后,如果该边界尚未解析完成,就终止该流;客户端将通过 useEffect 自行获取数据。
Cloudflare Workers 流式传输机制
Workers 运行时会将 ReadableStream 直接作为响应体传递。Cloudflare 的基础设施会在 React 生成每个数据块时,将其转发到用户的浏览器,而不会缓存整个文档。这意味着,请求到达后数毫秒内,HTML 的首个字节就会离开边缘节点。
中止:控制长时间流
renderToReadableStream 会返回一个用于中止的控制器函数。如果请求被取消(例如用户离开当前页面),调用这个函数会阻止 React 继续渲染和处理数据。这样可以避免对孤立请求进行无效计算,并将 Worker 的 CPU 使用量控制在合理范围内。
端到端延迟概况
采用边缘流式传输后,完整的延迟链路如下:5 毫秒(请求发送到最近的边缘节点)+ 2 毫秒(Worker 冷启动)+ 8 毫秒(外壳渲染)= 首字节耗时 15 毫秒。用户的浏览器会先从外壳中渲染 LCP 元素,同时页面的其余部分继续在后台传输。
onShellReady 的触发时机
在流式传输 SSR 的过程中,onShellReady 回调究竟会在什么时候触发?
课程回顾
边缘流式 SSR 会分块传输 HTML,通过立即发送外壳来改善 FCP 和 LCP。Suspense 边界将组件树划分为可以独立传输的部分。onShellReady 是开始传输的信号——调用它之前请先设置状态码。onShellError 处理致命故障,onError 处理可恢复故障,而中止操作可以避免在请求取消后继续浪费工作。
常见问题解答
「来自边缘的流式 SSR」课时是免费的吗?
是的 — 「来自边缘的流式 SSR」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「来自边缘的流式 SSR」这节课中我会学到什么?
使用 ReadableStream 流式传输 React 的 HTML 输出,使浏览器能够立即绘制有意义的内容 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「来自边缘的流式 SSR」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。