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://www.pswp.cn/web/83630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt 双缓冲案例对比

双缓冲 1.双缓冲原理 单缓冲&#xff1a;在paintEvent中直接绘制到屏幕&#xff0c;绘制过程被用户看到 双缓冲&#xff1a;先在redrawBuffer绘制到缓冲区&#xff0c;然后一次性显示完整结果 代码结构 单缓冲&#xff1a;所有绘制逻辑在paintEvent中 双缓冲&#xff1a;绘制…

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

ParaGraphX [特殊字符]

https://github.com/stevechampion1/paragraphx 一个基于 JAX 的、为 CPU/GPU 加速而生的超高性能图算法库。 ParaGraphX 是一个实验性的 Python 库&#xff0c;旨在利用 JAX 的即时编译 (JIT) 和大规模并行计算能力&#xff0c;为经典的图算法提供惊人的性能提升。我们的目标…

如何用4 种可靠的方法更换 iPhone(2025 年指南)

Apple 每年都会发布新版本的 iPhone。升级到新 iPhone 是一种令人兴奋的体验&#xff0c;但转移所有宝贵数据的想法有时会让人感到畏惧。幸运的是&#xff0c;我们准备了 4 种有效的更换 iPhone 的方法&#xff0c;让你可以毫不费力地更换到你的新 iPhone。 此外&#xff0c;您…

GitLab 拉取变慢的原因及排查方法

前言&#xff1a;在软件开发的快节奏世界里&#xff0c;高效协作与快速交付是制胜关键。然而&#xff0c;当开发团队兴高采烈地投入工作&#xff0c;却发现从GitLab拉取代码的速度慢如蜗牛&#xff0c;那种沮丧感简直能瞬间浇灭热情。在分布式开发环境中&#xff0c;这种情况时…

落水人员目标检测数据集(猫脸码客第253期)

落水人员目标检测&#xff1a;科技守护生命之舟 一、背景与意义 随着人类海洋活动和水上活动的日益频繁&#xff0c;海上与水域安全事故频发。每年都会开展大量的海上救援行动&#xff0c;以搜救数以万计的落难人员。在水上活动区域&#xff0c;如水库、河道等&#xff0c;溺…

JAVA_强制类型转换:

类型范围大的变量&#xff0c;不可以直接赋值给类型变量小的变量 需要进行强制类型转换&#xff1a; 想要完成类型范围大的变量传给类型范围小的变量需要先创建一个新的变量&#xff08;类型与方法的形参类型要相同&#xff09;。将类型范围大的变量前面加上&#xff08;转换类…

打卡第44天:无人机数据集分类

重复以下内容 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a; 并拆分成多个文件 import os import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader,…

个人网站大更新,还是有个总站比较好

个人网站大更新&#xff0c;还是有个总站比较好 放弃了所有框架&#xff0c;用纯htmlcssjs撸了个网站&#xff0c;这回可以想改啥改啥了。 选择了黑紫作为主色调&#xff0c;暂时看着还算可以。 为什么不用那些框架了 几个原因&#xff1a; 尝试用vuepress、vitepress、not…

高精度算法详解:从原理到加减乘除的完整实现

文章目录 一、为什么需要高精度算法二、高精度算法的数据结构设计2.1 基础工具函数2.2 高精度加法实现2.3 高精度减法实现2.4 高精度乘法实现2.5 高精度除法实现 三、完整测试程序四、总结 一、为什么需要高精度算法 在编程中&#xff0c;处理极大数值是常见需求&#xff0c;例…

排序--计数排序

一,引言 计数排序是一种针对整数数据的高效排序算法。其主要流程可分为三个步骤&#xff1a;首先计算整数数据的数值范围&#xff1b;接着按大小顺序统计各数值的出现次数&#xff1b;最后根据统计结果输出排序后的数据序列。 二,求最值 遍历现有数据&#xff0c;获取最大值…

Kubernetes安全机制深度解析(四):动态准入控制和Webhook

#作者&#xff1a;程宏斌 文章目录 动态准入控制什么是准入 Webhook&#xff1f; 尝试准入Webhook先决条件编写一个准入 Webhook 服务器部署准入 Webhook 服务即时配置准入 Webhook对 API 服务器进行身份认证 Webhook 请求与响应Webhook 配置匹配请求-规则匹配请求&#xff1a…

WDK 10.0.19041.685,可在32位win7 sp1系统下搭配vs2019使用,可以编译出xp驱动。

(14)[驱动开发]配置环境 VS2019 WDK10 写 xp驱动 (14)[驱动开发]配置环境 VS2019 WDK10 写 xp驱动_microsoft visual 2019 wdk-CSDN博客文章浏览阅读3k次&#xff0c;点赞8次&#xff0c;收藏17次。本文介绍了如何在VS2019环境下安装和配置Windows Driver Kit(WDK)&#xff0…

论坛系统自动化测试

1、项目背景与测试目标 系统定位 论坛系统作为典型的高并发Web应用&#xff0c;需支持用户注册、登录、发帖、评论、私信及个人中心管理等核心功能&#xff0c;是用户公开交流与信息共享的核心平台。其稳定性与响应效率直接影响用户体验及平台活跃度。 测试必要性 功能可靠性&…

ChipWhisperer教程(一)

一、ChipWhisperer介绍 ChipWhisperer 是一个完整的开源工具链&#xff0c;用于学习嵌入式设备上的侧信道攻击并验证这些设备的侧信道抗性。ChipWhisperer主要用于功耗分析&#xff0c;利用设备功耗泄露的信息进行攻击&#xff0c;也可用于故障攻击&#xff08;电压和时钟毛刺…

【持续更新】计算机网络试题

问题1 请简要说明TCP/IP协议栈的四层结构&#xff0c;并分别举出每一层出现的典型协议或应用。 答案 应用层&#xff1a;ping,telnet,dns 传输层&#xff1a;tcp,udp 网络层&#xff1a;ip,icmp 数据链路层&#xff1a;arp,rarp 问题2 下列协议或应用分别属于TCP/IP协议…

短剧系统开发:打造高效、创新的短视频娱乐平台 - 从0到1的完整解决方案

一、短剧市场迎来爆发式增长 - 不容错过的万亿级蓝海 随着5G技术的普及和移动互联网的深度渗透&#xff0c;短剧市场正在经历前所未有的爆发式增长。根据权威机构艾瑞咨询最新发布的《2023年中国网络短剧行业发展报告》显示&#xff1a; 市场规模&#xff1a;2023年中国短剧市…

ChipWhisperer教程(三)

——CW305目标板的波形采集 一、目标板介绍 CW305 是一款独立的 FPGA 目标板&#xff0c;搭载的FPGA芯片为Xilinx Artix-7系列。 它具有与 FPGA 通信的 USB 接口、为 FPGA 提供时钟的外部 PLL、编程 VCC-INT 电源以及用于故障注入环境的二极管保护。 CW305 电路板有多种配置&…

django中如何解析content-type=application/json的请求

django中如何解析content-typeapplication/json的请求 本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 往期文章回顾: …

Chainlink VRF 深度解析与实战

背景 在区块链的去中心化应用中&#xff0c;随机性是一个常见但难以实现的需求。例如&#xff0c;区块链游戏需要随机决定战斗结果&#xff0c;NFT 项目需要随机分配稀有属性&#xff0c;去中心化抽奖需要公平选择获奖者。然而&#xff0c;传统的链上随机数生成方法&#xff0…