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 和其他钩子的方式。这是我们想在 v4 中做的事情,但是 TypeScript 的一个限制 阻止了我们这样做。TypeScript 在 TS 4.7 中解决了这个问题,因此我们能够删除所有用于以不同数量的参数调用 useQuery 的重载。这是一个巨大的开发者体验提升,因为带有重载的方法通常会有相当糟糕的 TypeScript 错误消息。
这是 v5 中最大的突破性更改,但我们认为这是值得的。API 现在更加一致——您总是只传递一个对象。为了减轻手动更改所有出现次数的痛苦,我们在过去几个月中一直努力让每个人为即将到来的更改做好准备。文档已更改为使用新的 API,并且我们在 eslint 包中发布了一个可自动修复的 eslint 规则。此外,v5 还附带了一个 codemod 来帮助过渡。
除此之外,我们将 cacheTime 重命名为 gcTime 以更好地反映其作用,将 keepPreviousData 与 placeholderData 合并,将 loading 状态重命名为 pending,并从 useQuery 中删除了回调。所有这些更改使 v5 成为对新手而言最一致和最佳的版本。
要阅读有关重大更改的更多信息,请查看我们的迁移指南。
当然,v5 也加载了许多令人惊叹的新特性 🚀:
通过利用从 useMutation 返回的 variables,享受一种全新的、简化的执行乐观更新的方式,而无需手动编写更新缓存的代码。有关更多详细信息,请查看乐观更新文档
一个经常被请求的特性,如这个两年前的 issue 所示,终于在 v5 中实现了:借助新的 useMutationState 钩子,您现在可以访问所有突变的状态,并在组件之间共享。
没错——用于数据获取的 suspense 不再是实验性的,而是完全支持的。React Query 附带了新的 useSuspenseQuery、useSuspenseInfiniteQuery 和 useSuspenseQueries 钩子。请查看 suspense 文档以了解与非 suspense 版本的区别。
v5 还为 nextJs 中的服务器端 suspense 提供了实验性集成,统一了两全其美的优点:react-query-next-experimental 适配器允许我们编写单个 useSuspenseQuery,它将尽早在服务器端(SSR 期间)启动数据获取。然后它会将结果流式传输到客户端,并在客户端自动放入缓存,从而为我们提供 React Query 的所有交互性和数据同步功能。
无限查询现在可以一次预取多个页面,并且您还可以选择指定存储在缓存中的最大页面数量。
Query 开发工具已从头开始以与框架无关的方式重写,以便所有适配器都可以使用它们。它们还进行了 UI 改造并添加了一些新功能,例如缓存内联编辑和浅色模式。
另一个始于 2021 年的长期讨论强调了细粒度持久化和即时恢复功能(尤其对于移动开发而言)的重要性,而 PersistQueryClient 插件不具备这些功能。在 v5 中,我们现在有了一个新的 experimental_createPersister 插件,允许您单独持久化查询。
既然我们有了一种统一的方式来调用 useQuery(仅使用一个对象作为参数),我们也可以在此基础上构建更好的抽象。新的 queryOptions 函数为我们提供了一种类型安全的方式,可以在 useQuery 和诸如 queryClient.prefetchQuery 之类的命令式方法之间共享我们的查询定义。最重要的是,它还可以使 queryClient.getQueryData 类型安全。
我们希望您会像我们喜欢构建 v5 一样喜欢使用它。我们还要感谢所有使此版本成为可能的人。无论您是核心贡献者,还是实现了路线图中的某个问题,或者您在文档中修复了一个拼写错误,或者对 alpha 版本提供了反馈:每一次贡献都很重要!是这些人让这个库变得伟大,我们很幸运拥有这样一个了不起的社区。❤️