SuperAPI AI 工具集

trpc

通用与其它

查看项目

更新于 10-16 03:46

技能介绍

用途:本技能用于在编写或审查 tRPC 代码时,纠正模型对 tRPC v11 的错误默认假设。每一条规则都指出它纠正的具体错误默认,不覆盖模型已经做对的部分。内容固定于 tRPC v11,依据 11.18.0(2026-06-17)验证;目前没有 v12,但部分 API 已标记 @deprecated,注明将在 v12 移除且当前仍在发布。同行依赖:typescript >=5.7.2、@tanstack/react-query ^5.80.3、react >=18.2.0。

适用时机:当代码导入 initTRPC、createTRPCContext、createTRPCOptionsProxy、createTRPCReact、createTRPCClient、httpBatchLink、httpSubscriptionLink、splitLink、fetchRequestHandler、createCallerFactory 或 TRPCError,或使用 .input()/.output()/.use()/.query()/.mutation()/.subscription() 定义过程时;当用户反馈“类型全是 any”“失效不生效”“contextMap[utilName] 不是函数”“transformer 属性位置变了”“仪表盘 414/413”“订阅连不上”“预取不水合”“每个过程都 404”时;从 tRPC v10 迁移,或审查按 v10 时代示例编写的代码(收益最高的场景,因为推荐的 React 客户端已改变而旧代码往往仍能编译);为已有路由添加首个订阅、首个文件上传或首个 RSC 预取(v11 在这些场景完全替换了 v10 做法);以及审查随应用增长而变得有问题的批处理客户端。不适用于:通用 TanStack Query 语义;Zod schema 的编写与迁移;tRPC handler 之外的 Next.js App Router 路由、流式与缓存;通用 TypeScript 类型收窄与泛型。

规则分类与要点: React 客户端(client-):基于 @trpc/tanstack-react-query 构建数据获取,createTRPCReact 现为经典路径;新 proxy 上没有 useUtils(),需用 queryClient 加 pathFilter()/queryFilter() 做失效;getQueryKey() 不在新 proxy 上,查询键通过 queryKey()/pathKey()/infiniteQueryKey() 获得;新 proxy 上没有 .useSubscription(),改用 @trpc/tanstack-react-query 的 subscriptionOptions() 传给 useSubscription。 v10 到 v11 漂移(mig-):六个 experimental_* 上传 API 已移除,FormData 是 splitLink 背后的原生输入;AnyRouter 等类型导出改名,inferRouterInputs/Outputs 未变;rawInput 为 undefined,输入是惰性的,需 await getRawInput();TS 下限 5.7.2,编辑器使用不同 TS 版本会静默让所有类型变成 any。 路由与过程构建(proc-):中间件中裸 next() 会让 ctx.user 保持可空,守卫被 ! 强转掉;在 .input() 之前调用 .use() 会让中间件面对未校验输入;每个应用只应有一个 initTRPC.create(),实例不匹配会让 mergeRouters 运行时抛错;只有对象 schema 会合并,其他类型会静默替换先前的解析器;experimental_standaloneMiddleware 已弃用且无法声明 .input(),应使用 .concat()。 错误与校验(err-):解析器分发是有序的,仅处理 Zod 的 errorFormatter 对 Valibot/Effect(StandardSchemaV1Error)和 ArkType(ArkErrors)会返回 null;.output() 返回解析后的值,会剥离未知键,其失败是 500 而非 4xx;.optional() 游标只在失效后才返回 400,应使用 .nullish();不显式设置 isDev 时,边缘运行时会把 error.data.stack 发给每个客户端。 链接、传输与序列化(link-):transformer 已移入链接内部,为消除 branded 类型错误而删除它会在运行时破坏 Date;httpBatchLink 直接拒绝订阅操作;maxItems 与 maxURLLength 默认是 Infinity,需与服务端 maxBatchSize 配套;批处理加无差别 responseMeta 缓存会让 CDN 把一个用户的数据发给另一个用户;httpBatchStreamLink 在流式开始后无法设置响应头,且不是默认;批处理链接传的是 { opList } 而非 { op },解构错误会让每个请求 401;全局 express.json() 会在 tRPC 读取前耗尽流;endpoint 是 tRPC 剥离的前缀,不匹配会让每个过程 404。 SSR、RSC 与服务端调用(rsc-):模块作用域 QueryClient 会把一个用户的缓存送给下一个请求;没有 pending 覆盖,void prefetchQuery 永远不会到达客户端;直接调用 caller 的结果不会进入缓存,客户端会再次全部拉取;嵌套 caller 会重建上下文并重跑整个中间件链,应共享逻辑而非调用 caller。 订阅与流式(sub-):observable() 已弃用待移除,只有生成器能获得 tracked() 的重连与续传;connectionParams 会把令牌序列化进查询字符串,并进入每个能看到它的日志;ping.enabled 默认 false,空闲 SSE 流会被代理回收并表现为网络不稳;在附加监听器之前拉取历史,只会在生产负载下丢事件。

使用方式:当某个决策出现时阅读对应参考文件。每条规则先指出它纠正的错误默认,再给出规范做法,仅在错误做法是真实陷阱时展示错误/正确对比。两个优先捷径:审查或迁移现有 tRPC 代码时从 client- 和 mig- 开始,旧代码常常仍能编译所以没有提示指向它们,而其他规则都继承它们;加固已能工作的代码时,安全相关的规则是 link-gate-cache-headers、rsc-query-client-per-request、err-set-isdev-explicitly、proc-input-before-use 与 sub-keep-credentials-out-of-urls。相关技能:tanstack-query(tRPC React 客户端委托的查询层,本技能假设其缓存语义)、zod(校验器编写与 Zod 4 漂移)、typescript(tRPC 推断之外的通用类型工作)。