React Router 的服务器端渲染 (SSR) 允许在将 HTML 发送到客户端之前在服务器上渲染 React 组件。本文档解释了 React Router 的 SSR 架构、数据加载策略、水合(hydration)过程以及“迷雾”(Fog of War)路由发现等高级功能。有关平台特定服务器集成的信息,请参阅 平台适配。
React Router 的服务器端渲染系统允许您的应用程序
该框架处理服务器与客户端之间的协调、数据获取管理以及从服务器渲染的 HTML 到交互式客户端应用程序的平滑过渡的复杂性。
来源
React Router 的 SSR 架构涉及多个关键组件在服务器和客户端环境中协同工作。
服务器端渲染过程从由 createRequestHandler 处理的 HTTP 请求开始,该函数确定请求的类型并进行相应处理。文档请求会渲染完整的 HTML 文档,而数据请求则获取路由加载器的数据。然后客户端对服务器渲染的 HTML 进行水合(hydration),以创建交互式应用程序。
来源
React Router 的 SSR 核心是 createRequestHandler 函数,该函数处理传入的 HTTP 请求。
请求处理程序
createRequestHandler 函数接受一个 ServerBuild 对象,其中包含您的路由和应用程序配置。
此函数返回一个请求处理程序,可与 Node.js、Express、Cloudflare Workers 或其他服务器环境一起使用。
来源
React Router 为服务器端渲染实现了一种优化的数据加载策略,称为“单次抓取”(Single Fetch)。
单次抓取策略
来源
单次抓取策略通过几个函数实现:
getSingleFetchDataStrategy:创建用于优化数据加载的数据策略函数。singleFetchLoaderNavigationStrategy:处理导航的数据加载。singleFetchLoaderFetcherStrategy:处理 fetchers 的数据加载。singleFetchActionStrategy:处理表单提交和其他操作。来源
水合(Hydration)是将服务器渲染的 HTML 通过附加事件监听器和 React 状态变为交互式组件的过程。
在水合过程中
HydrationState 类型代表从服务器传递到客户端的数据。
这包括:
loaderData:由路由加载器加载的数据。actionData:表单操作的结果。errors:渲染过程中遇到的任何错误。来源
React Router 提供了一个 HydrateFallback 组件,该组件在客户端水合过程中显示。这个组件允许您在完整的交互式组件就绪之前显示一个轻量级的加载状态。
来源
React Router 在服务器端渲染期间实现了“迷雾”(Fog of War)方法来进行路由发现和懒加载。
迷雾(Fog of War)提供:
/__manifest 端点按需请求其他路由。来源
React Router 支持服务器端渲染 (SSR) 和单页应用 (SPA) 模式。
| 功能 | SSR 模式 | SPA 模式 |
|---|---|---|
| 初始渲染 | 服务器 | 仅客户端 |
| 数据加载 | 服务器和客户端 | 仅客户端 |
| 搜索引擎优化 | 优化 | 有限 |
| 初始加载性能 | 通常更快 | 初始加载较慢 |
| 路由加载器 | 在服务器上运行 | 仅在客户端运行 |
| 构建配置 | ssr: true | ssr: false |
React Router 还支持在使用 SPA 模式处理动态路由的同时,预渲染静态路由。
这种混合方法允许您:
来源
React Router 在服务器端渲染期间提供了强大的错误处理功能。
当服务器渲染过程中发生错误时:
路由可以定义一个 ErrorBoundary 组件,该组件负责在发生错误时进行渲染。
来源
React Router 的 SSR 功能可以通过平台适配集成到各种服务器环境中。
React Router 提供了各种平台适配,用于集成 Node.js、Express 和 Cloudflare Workers 等不同服务器环境。有关这些集成的详细信息,请参阅 平台适配。
来源
React Router 的服务器端渲染 (SSR) 功能提供了多种性能优势,但也伴随着一些需要考虑的因素。
| 方面 | 优点 | 考量因素 |
|---|---|---|
| 首次字节时间 (TTFB) | 由于服务器处理,可能较慢 | 初始 HTML 包含内容 |
| 首次内容绘制时间 (FCP) | 由于内容包含在初始 HTML 中,所以更快 | 服务器必须在发送响应之前完成所有渲染 |
| 可交互时间 (TTI) | FCP 和 TTI 之间的差距通常更长 | 客户端必须在可交互之前下载并执行 JavaScript |
| 数据加载 | 消除了客户端数据获取的瀑布效应 | 服务器必须在响应之前获取所有数据 |
| 打包大小 | 通过代码分割和“战争迷雾”可以做得更小 | 数据水合 (Hydration) 需要 JavaScript 来处理可交互组件 |
来源
React Router 的服务器端渲染功能提供了一个强大的解决方案,用于构建高性能和对 SEO 友好的应用程序。通过将 SSR 与诸如单一数据获取 (Single Fetch) 和诸如“战争迷雾” (Fog of War) 的渐进式加载技术相结合,React Router 能够实现高效的服务器渲染应用程序,并使其能够顺利地过渡到客户端交互。
该框架的灵活架构能够适应各种服务器环境,并支持完全 SSR 和带预渲染的混合方法。了解 SSR 流程、数据水合流程和优化技术将帮助您构建高效的应用程序,并提供最佳的用户体验。