作者:Dominik Dorfmeister,发布于 2023 年 10 月 17 日。
大约一年前,我们宣布了 TanStack Query v5 的路线图,此后整个团队一直致力于该版本的开发。因此,我们非常高兴地宣布,今天就是这一天:经过 91 个 alpha 版本、35 个 beta 版本和 16 个候选版本,TanStack Query v5.0.0 终于发布了!🎉
v5 版本延续了 v4 版本的旅程,力求使 TanStack Query 更小(v5 版本比 v4 版本小约 20%)、更好用且更直观。此版本的主要重点之一是围绕精简和简化我们提供的 API。
作为一个重大的破坏性变更,我们从代码库中移除了大部分重载,统一了您使用 useQuery 和其他 Hook 的方式。这是我们想要在 v4 版本中完成的事情,但 TypeScript 的限制 阻止了我们这样做。TypeScript 在 TS 4.7 中解决了这个问题,因此我们能够移除所有用于使用不同数量参数调用 useQuery 的重载。这是一个巨大的 DX 胜利,因为具有重载的方法通常会产生非常糟糕的 TypeScript 错误消息。
这是 v5 版本中最大的破坏性变更,但我们认为这是值得的。API 现在更加一致 —— 你始终只需传递一个对象。为了减轻手动更改所有出现位置的痛苦,在过去的几个月里,我们一直努力让每个人都为即将到来的这一变更做好准备。文档已更改为使用新的 API,并且我们在 eslint 包中发布了一个可自动修复的 eslint 规则。此外,v5 还附带了 一个 codemod 来帮助进行过渡。
除此之外,我们将 cacheTime 重命名为 gcTime,以更好地反映其作用;将 keepPreviousData 与 placeholderData 合并;将 loading 状态重命名为 pending;并从 useQuery 中移除了回调函数。所有这些更改都使 v5 成为对新入门者来说最一致和最佳的版本。
要了解有关破坏性变更的更多信息,请查看我们的迁移指南。
当然,v5 也加载了令人惊叹的新功能 🚀
通过利用从 useMutation 返回的 variables,享受全新的、简化的乐观更新执行方式,而无需编写手动更新缓存的代码。有关更多详细信息,请查看乐观更新文档
正如在 这个两年前的 issue 中看到的那样,一个经常被请求的功能终于在 v5 中实现了:现在你可以访问所有 mutation 的状态,这要归功于新的 useMutationState hook,状态在组件之间共享。
没错 - 用于数据获取的 suspense 不再是实验性的,而是完全支持的。React Query 附带了新的 useSuspenseQuery、useSuspenseInfiniteQuery 和 useSuspenseQueries hooks。查看 suspense 文档 以了解与非 suspense 版本的差异。
v5 还为 nextJs 中的服务器端 suspense 带来了实验性集成,统一了两个世界的优点:react-query-next-experimental 适配器允许我们编写一个单独的 useSuspenseQuery,它将尽早启动数据获取:在服务器端,在 SSR 期间。然后,它将结果流式传输到客户端,在那里它将自动放入缓存中,从而为我们提供 React Query 的所有交互性和数据同步功能。
无限查询现在可以一次预取多个页面,并且你可以选择指定缓存中存储的最大页面数量。
Query devtools 已使用框架无关的方式从头重写,使其可用于所有适配器。它们还获得了 UI 改进和一些新功能,例如缓存内联编辑和浅色模式。
另一个来自 2021 年的长期讨论强调了细粒度持久化的重要性,以及 PersistQueryClient 插件不具备的即时恢复功能(尤其是在移动开发中)。在 v5 中,我们现在有了一个新的 experimental_createPersister 插件,允许你单独持久化查询。
既然我们有了一种统一的方式来调用 useQuery(仅使用一个对象作为参数),我们也可以在其之上构建更好的抽象。新的 queryOptions 函数为我们提供了一种类型安全的方式,可以在 useQuery 和命令式方法(如 queryClient.prefetchQuery)之间共享我们的查询定义。最重要的是,它可以使 queryClient.getQueryData 也具有类型安全性。
我们希望您会像我们享受构建 v5 一样享受使用它。剩下的就是感谢所有使此版本成为可能的人。无论您是核心贡献者,还是实现了路线图中的 issue,或者您在文档中修复了错别字,或者对 alpha 版本提供了反馈:每一次贡献都很重要!正是这些人使这个库变得伟大,我们很荣幸拥有如此出色的社区。❤️