当前位置: 首页 > news >正文

React第六十二节 Router中 createStaticRouter 的使用详解

前言

createStaticRouterReact Router 专为 服务端渲染(SSR) 设计的 API,用于在服务器端处理路由匹配数据加载。它在构建静态 HTML 响应时替代了客户端的 BrowserRouter,确保 SSR 和客户端 Hydration 的路由状态一致。

一、createStaticRouter 核心用途

  1. 服务端路由匹配:根据请求 URL 确定渲染的组件
  2. 数据预加载:执行路由的 loader 函数获取初始数据
  3. 错误处理:捕获渲染过程中的路由级错误
  4. SSR/SSG 支持:生成包含初始数据的静态 HTML

二、createStaticRouter 使用步骤详解(配合 Express 示例)

2.1、 定义路由配置

// src/routes.js
import HomePage from "./pages/Home";
import UserPage from "./pages/User";export const routes = [{path: "/",loader: () => fetch("/api/data"), // 数据加载函数element: <HomePage />,errorElement: <ErrorPage /> // 错误边界},{path: "/user/:id",loader: ({ params }) => fetch(`/api/users/${params.id}`),element: <UserPage />}
];

2.2、 服务端路由处理

// server.js
import express from "express";
import { createStaticRouter,StaticRouterProvider 
} from "react-router-dom/server";
import { routes } from "./src/routes";const app = express();app.use("*", async (req, res) => {// 1. 创建请求感知的静态路由const router = createStaticRouter(routes, {basename: "/app",      // 基础路径location: req.originalUrl // 当前请求路径});// 2. 触发所有匹配路由的 loaderconst promises = router.matches.map(match => match.route.loader?.({ request: req, params: match.params }));// 3. 等待数据加载完成const loaderData = await Promise.all(promises);// 4. 将数据注入路由上下文const context = {loaderData,errors: null // 可捕获 loader 错误};// 5. 渲染为 HTML 字符串const html = ReactDOMServer.renderToString(<StaticRouterProvider router={router} context={context} />);// 6. 拼接完整 HTML 响应res.send(`<html><body><div id="root">${html}</div><script>// 注入初始数据供客户端 Hydration 使用window.__STATIC_CONTEXT = ${JSON.stringify(context)};</script></body></html>`);
});

2.3、 客户端 Hydration

// src/client.js
import { hydrateRoot } from "react-dom/client";
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import { routes } from "./routes";// 复用路由配置
const router = createBrowserRouter(routes, {basename: "/app",hydrationData: window.__STATIC_CONTEXT // 注入服务端数据
});hydrateRoot(document.getElementById("root"),<RouterProvider router={router} />
);

三、createStaticRouter关键配置说明

参数 作用

  1. basename: 应用基础路径 (e.g. /app)
  2. location: 当前请求 URL 对象 (必需)
  3. router.matches: 当前 URL 匹配的路由对象数组
  4. context.loaderData: 存储 loader 返回数据的数组,索引与 router.matches 顺序一致

四、createStaticRouter 错误处理机制

// 在路由配置中添加错误边界
{path: "/user/:id",element: <UserPage />,errorElement: <ErrorLayout />, // 捕获本路由及子路由错误loader: async () => {const res = await fetchData();if (res.status === 404) {throw new Response("Not Found", { status: 404 }); // 抛出错误}return res.json();}
}// 服务端捕获错误
try {await Promise.all(promises);
} catch (error) {context.errors = error; // 传递到 StaticRouterProvider
}

五、createStaticRouter 最佳实践

  1. 数据序列化:确保 loader 返回的数据可被序列化为 JSON
  2. 错误类型:使用 Response 对象抛出 HTTP 错误状态
  3. 路由复用:服务端/客户端使用相同的路由配置对象
  4. 缓存控制:对静态路由实现 loader 数据缓存

注意createStaticRouter 仅用于服务端环境,客户端应使用 createBrowserRoutercreateMemoryRouter


文章转载自:

http://XewnIAFT.mkrjf.cn
http://dJkjjHdN.mkrjf.cn
http://tPbTjMt6.mkrjf.cn
http://gFITNUbQ.mkrjf.cn
http://FAH3NY2R.mkrjf.cn
http://4YPGo8vY.mkrjf.cn
http://oitWG1LI.mkrjf.cn
http://tjiyDAlH.mkrjf.cn
http://4qJu6eUD.mkrjf.cn
http://N6Qnr4to.mkrjf.cn
http://xtoLeOZO.mkrjf.cn
http://L4yIlbcA.mkrjf.cn
http://Dj9UhWp9.mkrjf.cn
http://jDL2U4sW.mkrjf.cn
http://Og2hyrfy.mkrjf.cn
http://7nuTvYuJ.mkrjf.cn
http://KF7x4AU1.mkrjf.cn
http://6ECxUhgz.mkrjf.cn
http://RKZ7T4P6.mkrjf.cn
http://TC7DnuGm.mkrjf.cn
http://qFNHtWrB.mkrjf.cn
http://181mon3h.mkrjf.cn
http://qzspBu87.mkrjf.cn
http://DeTVRkRC.mkrjf.cn
http://dVv6YZeH.mkrjf.cn
http://76IYuQ1G.mkrjf.cn
http://xdE333Cn.mkrjf.cn
http://Xm9BXtAN.mkrjf.cn
http://4b55RYgD.mkrjf.cn
http://Bn8EC8cD.mkrjf.cn
http://www.dtcms.com/a/247898.html

相关文章:

  • 仪表刻度动态显示控件--小三角指针
  • YOLOV11改进之多尺度扩张残差模块(MS-DRM)
  • 【论文写作参考文献地址】
  • 【经验总结】ECU休眠后连续发送NM报文3S后ECU网络才被唤醒问题分析
  • Android 12.0 第三方应用左右两侧未全屏有黑边问题解决
  • java通过hutool工具生成二维码实现扫码跳转功能
  • ELK1日志分析系统
  • 猎板PCB:手机主板pcb需要做哪些可靠性测试
  • 传统数据仓库正在被 Agentic AI 吞噬?Agentic Data Stack 初探
  • CSS基础学习1
  • 【Transformer拆解】-2. 位置编码(Positional Encoding)
  • 「Linux中Shell命令」Shell命令基础
  • 基于python大数据的nba球员可视化分析系统
  • 公司内网远程访问配置教程:本地服务器(和指定端口应用)实现外网连接使用
  • 宝塔面板如何关闭https强制跳转http/https共存?
  • @RequestHeader(“Authorization“) 解析:HTTP 请求头中的 Authorization 字段
  • 网络原理10 - HTTP完
  • Blender基础知识-操作模式、基本操作、渲染、灯光、材质、粒子系统、动画
  • 基于Cesium的Shadertoy纹理材质应用
  • VSCode - VSCode 转换英文字母的大小写
  • Blender 3D建模工具的快捷键总结--选择、视图、对象、编辑、UV贴图、模型材质、动画与渲染、工具
  • VSCode - VSCode 让未被编辑的标签页不被自动关闭
  • 城市排水管网液位流量监测系统解决方案
  • FPGA多通道卷积加速器:从零构建手写识别的硬件引擎
  • Hadoop 002 — HDFS常用命令及SpringBoot整合操作
  • PCIe(一)概述/拓扑/空间配置
  • Deit 模型讲解和代码资源合集
  • Redis高级|Redis单线程VS多线程(基础)
  • 举例说明单片机,主循环和中断资源访问冲突的案例
  • 苹果越来越像安卓,华为越来越像苹果