React.cache() 请求内去重指南:服务端认证与数据库查询的 RSC 性能优化(mediago Vercel React 最佳实践)
音视频桌面应用后端【免费下载链接】mediago跨平台视频提取工具支持流媒体下载、视频下载、m3u8 下载及 B站视频下载提供 Windows 和 Mac 桌面客户端。Cross-platform video extraction tool: Supports streaming download, video download, m3u8 download, and Bilibili video download, with desktop clients for Windows and Mac.项目地址https://gitcode.com/caorushizi/mediago点击查看免费下载本篇技术指南围绕 mediago 仓库中.agents/skills/vercel-react-best-practices/技能集里的server-cache-react.md规则展开深入讲解 React Server ComponentsRSC场景下如何使用React.cache()实现单请求内去重避免同一请求中对认证会话、数据库查询等异步操作的多余重复执行。读完本文你将掌握React.cache()的命中原理浅比较 /Object.is、正确的参数形态写法、与 Next.jsfetch自动记忆化的分工边界以及它与跨请求 LRU 缓存、客户端 SWR 去重等配套规则的适用场景取舍。规则来源与定位该规则文件位于仓库的 server-cache-react.md属于.agents/skills/vercel-react-best-practices/这一面向 Agent 与 LLM 的结构化 React 最佳实践技能集。根据该技能集的 README.md所有规则按影响等级Impact与所属领域area prefix组织其中server-前缀对应第 3 节Server-Side Performance服务端性能见 _sections.md本规则的 Impact 为MEDIUMimpactDescription 明确为 deduplicates within request请求内去重标签为server, cache, react-cache, deduplication。这意味着它解决的是服务端渲染管线中的一类高频问题同一请求内组件树中不同位置多次调用同一个异步数据函数导致底层查询 / 认证被重复执行。什么是 React.cache() 与请求内去重在 React Server Components 中React.cache()用于包装异步函数使其在同一个请求request的生命周期内具备记忆化memoization能力包装后的函数被多次调用时只要参数匹配命中缓存函数体如数据库查询就只真正执行一次后续调用直接返回首次执行的结果。import { cache } from react; export const getCurrentUser cache(async () { const session await auth(); if (!session?.user?.id) return null; return await db.user.findUnique({ where: { id: session.user.id }, }); });在上述示例中getCurrentUser被cache()包装后同一请求内对它的多次调用只触发一次auth()与一次db.user.findUnique()。这正是认证检查和数据库查询从中受益最大的原因它们往往是组件树中被多个组件共享、且每次执行成本都较高的操作。从源码层面看该规则属于服务端性能类别见 _sections.md 中 Section 3 的定位Optimizing server-side rendering and data fetching eliminates server-side waterfalls and reduces response times其核心价值在于在不改变调用方代码的前提下用一行cache()包装抹平组件树内部的重复异步工作。命中原理浅比较与 Object.is要正确使用React.cache()必须先理解它的缓存键cache key判定规则React.cache()使用浅比较shallow equality即Object.is来确定是否命中缓存。这一机制直接决定了参数形态的写法要求传原始值primitive如数字、字符串按值相等比较getUser(1)与getUser(1)命中同一缓存项传内联对象每次调用都创建一个新的对象引用Object.is比较必然失败永远无法命中缓存。错误写法内联对象参数导致永远 Cache Missconst getUser cache(async (params: { uid: number }) { return await db.user.findUnique({ where: { id: params.uid } }); }); // Each call creates new object, never hits cache getUser({ uid: 1 }); getUser({ uid: 1 }); // Cache miss, runs query again这里两次getUser({ uid: 1 })虽然看起来参数值相同但每次调用都构造了全新的对象字面量引用不同Object.is判定不相等因此第二次调用依然会重新执行查询——去重完全失效。正确写法原始值参数按值命中const getUser cache(async (uid: number) { return await db.user.findUnique({ where: { id: uid } }); }); // Primitive args use value equality getUser(1); getUser(1); // Cache hit, returns cached result把对象解构为原始值参数后getUser(1)两次调用按值相等命中缓存第二次调用直接返回首次查询结果不再访问数据库。必须传对象的场景复用同一引用如果业务上确实需要传入对象那么必须保证多次调用传递同一个对象引用const params { uid: 1 }; getUser(params); // Query runs getUser(params); // Cache hit (same reference)注意这里的语义差异第一次调用真正执行查询第二次由于引用相同而命中缓存。开发时要格外留意那些在调用处内联构造参数的写法例如getUser({ uid: item.id })它们会悄悄破坏去重效果。与 Next.js fetch 记忆化的分工需要特别说明的是 Next.js 的默认行为在 Next.js 中fetchAPI 被自动扩展了请求记忆化request memoization能力——相同 URL 与相同 options 的fetch调用在单个请求内会被自动去重因此对fetch调用本身不需要再包一层React.cache()。然而服务端异步工作远不止fetch。React.cache()依然不可或缺地用于去重以下非 fetch 的异步操作数据库查询Prisma、Drizzle 等 ORM/驱动重计算heavy computations认证检查authentication checks文件系统操作file system operations任何非 fetch 的异步工作。换句话说去重原则可以概括为fetch 交给框架的自动记忆化其余所有异步工作统一交给React.cache()去重覆盖整个组件树。请求内去重 vs 跨请求缓存的边界React.cache()的生效范围严格限定在单次请求内请求结束缓存即失效。对于需要跨请求复用数据例如用户先后点击按钮 A、按钮 B两个请求都需要同一份数据的场景应使用 LRU 缓存规则见 server-cache-lru.mdimport { LRUCache } from lru-cache; const cache new LRUCachestring, any({ max: 1000, ttl: 5 * 60 * 1000, // 5 minutes }); export async function getUser(id: string) { const cached cache.get(id); if (cached) return cached; const user await db.user.findUnique({ where: { id } }); cache.set(id, user); return user; } // Request 1: DB query, result cached // Request 2: cache hit, no DB query两个规则的适用边界可以这样区分维度React.cache()LRU 缓存生效范围单次请求内跨请求、跨端点典型场景认证会话、同请求内重复 DB 查询顺序用户操作命中多个端点、数秒内复用同一数据失效方式请求结束自动失效按 TTL / max 容量淘汰此外服务端性能这一节还包含若干互补而非替代的规则静态资源与配置文件应提升到模块级加载以避免每次请求重复 I/Oserver-hoist-static-io.md通过组件组合消除服务端瀑布流server-parallel-fetching.md避免在 RSC Props 中重复序列化派生数据server-dedup-props.md。而客户端侧的数据请求去重则交给 SWR 的自动去重能力client-swr-dedup.md服务端与客户端各司其职。实战检查清单综合本规则与配套规则落地React.cache()去重时建议按以下清单自查识别去重对象优先对认证会话查询、数据库查询、重计算、文件系统读取等非 fetch 异步操作应用cache()纯fetch调用交给 Next.js 自动记忆化。参数形态优先使用原始值参数uid: number避免在调用处内联构造对象必须传对象时跨多次调用复用同一个对象引用。确认命中检查调用点是否确实存在重复调用——只有同一请求内多次调用才有去重收益。界定缓存范围数据只在单请求内复用用React.cache()需要跨请求复用则升级为 LRU带max与ttl上限防止内存无限增长。留意静态 IO字体、Logo、配置文件等静态资源直接提升到模块级从根源上消除每次请求的重复读取。小结React.cache()是 React Server Components 服务端性能优化中成本最低、收益最直接的武器之一它把认证 数据库查询这类高成本异步操作在单请求内压缩为一次执行而其全部使用要点都可以归结为两句话——用cache()包装异步数据函数用原始值或复用引用作为参数。本仓库的技能集中还提供了 LRU 跨请求缓存、模块级静态 IO、并行数据获取等配套规则可作为完整服务端性能优化方案的继续阅读入口均可在.agents/skills/vercel-react-best-practices/rules/目录下找到。赞分享音视频桌面应用后端【免费下载链接】mediago跨平台视频提取工具支持流媒体下载、视频下载、m3u8 下载及 B站视频下载提供 Windows 和 Mac 桌面客户端。Cross-platform video extraction tool: Supports streaming download, video download, m3u8 download, and Bilibili video download, with desktop clients for Windows and Mac.项目地址https://gitcode.com/caorushizi/mediago点击查看免费下载相关推荐Langfuse 服务端请求级去重实战用 React.cache() 优化认证与数据库查询Langfuse 服务端请求级去重实战用 React.cache 优化认证与数据库查询 Langfuse 的 Web 前端 web/ 基于 React 1人工智能LLMOps可观测性AI 评测LLM 网关后端前端Sanity 仓库的 Vercel React 最佳实践用 React.cache() 实现服务端单请求去重Sanity 仓库的 Vercel React 最佳实践用 React.cache 实现服务端单请求去重 本文以 Sanity 开源仓库中 vercel reCMS前端Cherry Studio 中 React.cache() 服务端请求内去重最佳实践指南Cherry Studio 中 React.cache 服务端请求内去重最佳实践指南 导读 本指南基于 CherryHQ/cherry studio https人工智能大模型AI 应用交互助手本地部署上一篇深入理解PyTorch Elastic的Rendezvous机制实现节点动态加入与退出下一篇TrumpScript代码优化技巧让你的程序更伟大创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

DeepPCB标注格式深度解析:x1,y1,x2,y2,type与6大缺陷类别ID详解

DeepPCB标注格式深度解析:x1,y1,x2,y2,type与6大缺陷类别ID详解

DeepPCB标注格式深度解析:x1,y1,x2,y2,type与6大缺陷类别ID详解 【免费下载链接】DeepPCB A PCB defect dataset. 项目地址: https://gitcode.com/gh_mirrors/de/DeepPCB 想快速上手 DeepPCB 数据集吗?本文用最短篇幅讲透它的标注格式&#xff1a…

2026/9/25 8:21:38 阅读更多 →
Edge浏览器优化实战:从闪退、内存高到IE模式与开发者模式全解

Edge浏览器优化实战:从闪退、内存高到IE模式与开发者模式全解

这段时间我收到不少私信,都在问类似的问题:Edge浏览器到底还能不能用?为什么每次点开都慢吞吞、内存占用高,有时候还莫名其妙闪退,甚至一打开就跳转到2345网址导航。还有人直接把Edge和Chrome对比,搜“谷歌…

2026/9/25 8:21:38 阅读更多 →
图书管理系统总体设计:核心表结构、权限模型与建表实践

图书管理系统总体设计:核心表结构、权限模型与建表实践

简介:面向软件工程课程设计与系统分析场景的《图书管理系统》总体设计文档,适合高校计算机专业学生和软件设计初学者参考。文档依照软件工程规范组织,系统阐述需求规定、运行环境、基本设计概念与处理流程,覆盖图书添加、删除、修…

2026/9/25 8:21:38 阅读更多 →

最新新闻

MySQL表空间传输:从原理到实战,把大表迁移从小时级压缩到分钟级

MySQL表空间传输:从原理到实战,把大表迁移从小时级压缩到分钟级

老规矩,先给结论:MySQL自带的表空间传输(Transportable Tablespace)功能,是处理“单表或一批表快速换实例”最好用的手段之一,尤其在数据量已经上到几十GB、几百GB,mysqldump导出导入慢到让人抓…

2026/9/25 13:12:40 阅读更多 →
联合储能的配电网优化调度与新能源消纳能力评估研究

联合储能的配电网优化调度与新能源消纳能力评估研究

一个必须直面的现实:新能源装机冲上去之后,配电网为何最先“消化不良”这几年干配电网规划的人应该都有同样感受:分布式光伏、分散式风电、用户侧储能的接入申请像雪片一样涌过来,手头配电网的承载力评估还没做完,下一…

2026/9/25 13:12:40 阅读更多 →
NodeGui 中的 QMimeData 类详解:在拖放与剪贴板场景中传递 MIME 数据

NodeGui 中的 QMimeData 类详解:在拖放与剪贴板场景中传递 MIME 数据

桌面应用跨平台 【免费下载链接】nodegui A library for building cross-platform native desktop applications with Node.js and CSS 🚀. React NodeGui : https://react.nodegui.org and Vue NodeGui: https://vue.nodegui.org 项目地址: https://git…

2026/9/25 13:12:39 阅读更多 →
迅雷下载慢的根源排查:NAT类型、UPnP与连接数优化指南

迅雷下载慢的根源排查:NAT类型、UPnP与连接数优化指南

迅雷这类下载工具的速度问题,几乎每个用过的人都遇到过。同一个资源,有人跑满带宽,有人卡在几百KB,差距往往不在资源本身,而在几个容易被忽略的环节:网络地址转换(NAT)类型、UPnP端口…

2026/9/25 13:12:39 阅读更多 →
Django Ninja 查询参数(Query Parameters)完全指南:类型转换、默认值与 Schema 封装

Django Ninja 查询参数(Query Parameters)完全指南:类型转换、默认值与 Schema 封装

后端API设计 【免费下载链接】django-ninja 💨 Fast, Async-ready, Openapi, type hints based framework for building APIs 项目地址: https://gitcode.com/gh_mirrors/dj/django-ninja 点击查看 免费下载 本篇指南聚焦 Django Ninja 中 GET 查询参数…

2026/9/25 13:12:39 阅读更多 →
苏州品清装饰硬装服务怎么样,专业吗

苏州品清装饰硬装服务怎么样,专业吗

在苏州,一栋别墅往往承载着一个家庭半生的积蓄与期许。然而真正让业主辗转难眠的,常常不是选房那一刻,而是装修开始之后:效果图上美轮美奂的空间,落地后却面目全非;土建、硬装、园林、软装分属不同团队,出了…

2026/9/25 13:11:39 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →