TanStack 生态深化

共 21 题
#

1. TanStack Query v5 的 Suspense 集成与 Streaming SSR,如何与 React 19 / Solid.js 的并发渲染深度协同?

A useSuspenseQuery 与 useQuery 完全等价,只是改名
B Query v5 移除了 Suspense 支持
C Suspense 模式只支持客户端渲染,SSR 下不可用
D useSuspenseQuery 让查询挂起由 Suspense 接管,配合服务端 prefetch 与流式补发可在 SSR 下避免二次请求与水合闪烁 ✓ 正确答案
#

2. Query 请求去重与取消,同一 key 并发请求合并、AbortController 竞态处理与页面卸载取消

A 同一 key 的并发请求会各自独立发起并各自缓存
B 同 key 请求合并共享一个查询实例,queryFn 消费 signal 即可被取消,卸载时可按需批量 cancelQueries ✓ 正确答案
C AbortController 只能取消 fetch,无法取消 axios 请求
D 组件卸载后查询请求会自动取消,无需任何处理
#

3. TanStack Router 的 Type-Safe Routing,完全类型安全的参数、loader、search params 如何成为新项目默认?

A 类型安全只覆盖路径参数,search params 仍需手写解析
B Type-Safe Routing 依赖 Babel 插件在运行时转换
C routeTree.gen.ts 代码生成使路径参数、search params 与 loader 数据全链路类型安全,并可结合 Zod 做运行时兜底 ✓ 正确答案
D loader 的返回值无法被类型推导
#

4. TanStack Router 的 useLoaderData 与 TanStack Query 都能取数缓存,二者分工边界(路由预取 vs 组件数据)如何划分?

A loader 数据无法进入 Query 缓存,必然重复请求
B 两者职责重叠,选其一即可
C loader 负责路由级骨架数据与导航预取,Query 负责可复用可失效的组件数据,loader 中可 prefetchQuery 预热 Query 缓存 ✓ 正确答案
D 使用 useLoaderData 后就不需要 Query 了
#

5. TanStack Query v5 的 staleTime 与 gcTime 语义差异,缓存失效与乐观更新如何设计?

A staleTime 控制缓存保留时长,gcTime 控制数据新鲜度
B staleTime 决定数据新鲜期内是否重新请求,gcTime 决定无订阅缓存何时被回收,两者语义正交 ✓ 正确答案
C gcTime 为 0 时数据永远不过期
D 设置 staleTime 后 invalidateQueries 将失效
#

6. TanStack Table v8 的 Headless 模式与百万行数据的虚拟滚动工程实践

A Headless 模式让表格逻辑与渲染解耦,百万行数据通过只渲染视口行的虚拟滚动保持性能 ✓ 正确答案
B 虚拟滚动可以解决所有表格性能问题,无需其他优化
C TanStack Table 自带完整 UI,无法自定义样式
D 虚拟滚动会破坏排序与过滤功能
#

7. TanStack Start 的全栈能力(loader/actions/server functions)与传统 Next.js 的对比与迁移成本?

A TanStack Start 与 Next.js 使用完全相同的 RSC 模型
B TanStack Start 不支持类型安全的数据流
C 从 Next.js 迁移到 TanStack Start 可以零改动
D TanStack Start 以 loader/actions/server functions 提供全栈能力,基于 Vite 与标准 fetch,与 Next.js 的 RSC/Server Actions 模型不同,迁移成本取决于数据层与路由层改造量 ✓ 正确答案
#

8. TanStack Query 的缓存与失效,staleTime/refetch 策略?

A 所有查询都应设置 staleTime: Infinity 以减少请求
B staleTime 定义新鲜期,过期后按窗口聚焦/挂载/重连等触发 refetch,策略应按数据特性分类配置并结合 invalidate 保证写后一致 ✓ 正确答案
C refetchOnWindowFocus 无法关闭
D invalidateQueries 只是清除缓存,不会触发重新请求
#

9. TanStack Query 的乐观更新与回滚?

A 乐观更新成功后无需与服务器对齐
B 乐观更新失败时只能刷新页面恢复
C onMutate 中取消在途请求并保存快照,onError 回滚,onSettled 失效对齐,形成完整的乐观更新闭环 ✓ 正确答案
D 乐观更新会破坏缓存,应始终避免
#

10. TanStack Query 的持久化缓存(persistQueryClient),异步 persister、shouldDehydrateQuery 过滤与缓存版本迁移在离线场景的工程价值?

A 异步 persister 避免阻塞主线程,shouldDehydrateQuery 过滤敏感与低价值数据,buster 版本号在结构不兼容时丢弃旧缓存 ✓ 正确答案
B 持久化后数据永远不会过期,无需后台重取
C 持久化缓存只能使用 localStorage 同步存储
D shouldDehydrateQuery 决定缓存写入内存的速度
#

11. v5 structural sharing,查询数据引用稳定性的渲染优化价值与需要关闭的场景

A structural sharing 会深拷贝每次查询结果
B 开启 structural sharing 后数据将无法被更新
C structural sharing 只在服务端渲染时生效
D structural sharing 复用未变分支的引用,提升 memo 化组件的命中率,但遇到 Date/class 实例等非纯 JSON 数据或全量变化的大数据时应考虑关闭 ✓ 正确答案
#

12. enabled 控制的串行依赖查询与 placeholderData 占位数据衔接,避免加载态闪烁

A placeholderData 只能传静态值,无法复用旧数据
B enabled: false 的查询会立即报错
C enabled 控制依赖未就绪时不发请求,placeholderData(如 keepPreviousData)在等待期续显旧数据,二者配合避免串行依赖的加载闪烁 ✓ 正确答案
D 使用 placeholderData 后 enabled 将不再生效
#

13. TanStack Start Server Functions 的序列化边界与安全暴露面,不可序列化参数与调用权限控制

A Server Functions 可以传输任意 JavaScript 对象包括函数与循环引用
B 只要函数定义在服务端目录,客户端就无法直接调用
C 参数与返回值须 JSON 可序列化,File/Date 等需显式转换;serverFn 是公开端点,鉴权与输入校验必须在服务端执行 ✓ 正确答案
D 客户端校验通过即可保证安全,无需服务端鉴权
#

14. TanStack Form 的类型化表单与 Zod 校验的深度集成

A TanStack Form 的表单状态是 any 类型,无法类型安全
B Zod 只能用于提交时校验,无法做字段级校验
C TanStack Form 必须搭配非受控组件使用
D useForm 泛型贯穿字段状态,zodValidator 把 schema 接入字段与表单级校验并自动映射错误信息 ✓ 正确答案
#

15. Query 键结构与缓存更新,列表-详情联动失效、无限滚动的缓存管理最佳实践?

A 分层键结构让前缀失效批量命中,详情共享列表前缀实现联动失效,无限滚动缓存按页存储并局部更新 ✓ 正确答案
B useInfiniteQuery 无法手动更新已加载的页数据
C 详情查询必须使用独立命名空间,不能与列表共享前缀
D queryKey 只是数组,顺序与内容不影响缓存命中
#

16. TanStack Table 与虚拟滚动,大数据量表格?

A 虚拟滚动后所有行仍在 DOM 中,只是视觉隐藏
B 虚拟滚动与排序过滤冲突,排序时需关闭虚拟化
C Table 负责行模型逻辑,虚拟滚动只渲染视口行,行高测量与 sticky 表头同步是工程要点 ✓ 正确答案
D 使用虚拟滚动时表格必须固定行高,无法处理动态内容
#

17. TanStack 表单与验证,受控与性能?

A 任何字段变化都会触发整个表单重渲染
B 大表单应关闭所有校验以保证性能
C 受控表单无法使用 TanStack Form,必须用非受控模式
D 字段独立状态与按需订阅让单字段变化只重渲染该字段,配合校验防抖与异步取消应对大表单性能问题 ✓ 正确答案
#

18. TanStack 生态的架构,Query/Table/Router 协作?

A 三者必须绑定使用,缺一不可
B Table 内部必须直接调用 Router 完成排序
C Router 负责导航与路由级预取、Query 负责数据缓存、Table 负责表格逻辑,表格状态可由 search params 承载实现 URL 即状态 ✓ 正确答案
D Query 的缓存数据无法被 Router 的 loader 复用
#

19. TanStack Query 的服务端缓存与 SSR?

A 服务端与客户端可以共享同一个 queryClient 实例
B SSR 场景无法使用 Query 的缓存功能
C 服务端每请求创建独立 queryClient 并 prefetch,dehydrate 序列化缓存由客户端 hydrate 恢复且按新鲜数据处理,避免二次请求 ✓ 正确答案
D hydrate 后的缓存数据一律视为过期,必须重新请求
#

20. TanStack Router 的基于文件的路由(file-based routing)与 routeTree.gen.ts 代码生成在类型安全路由的工程实践?

A 路由参数无法从文件名推导,只能运行时获取
B routeTree.gen.ts 是手写维护的路由配置文件
C 文件路由的命名约定映射路径结构,routeTree.gen.ts 自动生成类型安全路由树,支撑 Link/useParams/useLoaderData 的编译期类型检查 ✓ 正确答案
D 使用文件路由后就不能再用代码生成
#

21. TanStack Router 路由级代码分割(route.lazy)与导航 pending 状态最小化

A route.lazy 按需拆分路由 chunk,结合 Link 预取预热与 pendingComponent 骨架屏最小化导航等待 ✓ 正确答案
B route.lazy 会一次性加载全部路由代码
C 使用 lazy 后导航必须等待完整加载才能响应
D 代码分割只影响数据请求,不影响组件包体