框架
版本

开发者工具

挥手欢呼吧,因为 React Query 自带了专门的开发者工具!🥳

当您开始 React Query 之旅时,您会希望这些开发者工具在您身边。它们有助于可视化 React Query 的所有内部工作原理,如果您遇到困难,它们可能会为您节省数小时的调试时间!

对于 Google Chrome 用户:有一个第三方 Chrome 扩展程序可用于直接在 Chrome 开发者工具中调试 TanStack Query。它提供与特定于框架的开发者工具包相同的功能。在此处查看:TanStack Query DevTools

对于 React Native 用户:有一个第三方原生 macOS 应用程序可用于在任何基于 js 的应用程序中调试 React Query。跨设备实时监控查询。在此处查看:rn-better-dev-tools

请注意,从版本 5 开始,开发者工具也支持观察变更。

安装并导入开发者工具

开发者工具是一个独立的包,您需要安装它:

bash
npm i @tanstack/react-query-devtools
npm i @tanstack/react-query-devtools

或者

bash
pnpm add @tanstack/react-query-devtools
pnpm add @tanstack/react-query-devtools

或者

bash
yarn add @tanstack/react-query-devtools
yarn add @tanstack/react-query-devtools

或者

bash
bun add @tanstack/react-query-devtools
bun add @tanstack/react-query-devtools

对于 Next 13+ App Dir,您必须将其作为开发依赖项安装才能使其正常工作。

您可以这样导入开发者工具:

tsx
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'

默认情况下,React Query Devtools 仅在 process.env.NODE_ENV === 'development' 时包含在捆绑包中,因此您无需担心在生产构建期间排除它们。

浮动模式

浮动模式会将开发者工具作为固定浮动元素挂载到您的应用程序中,并在屏幕一角提供一个切换按钮以显示和隐藏开发者工具。此切换状态将存储在 localStorage 中并在重新加载后记住。

将以下代码尽可能高地放置在您的 React 应用程序中。它离页面根部越近,效果就越好!

tsx
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      {/* 您的应用程序的其余部分 */}
      <ReactQueryDevtools initialIsOpen={false} />
    </QueryClientProvider>
  )
}
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      {/* 您的应用程序的其余部分 */}
      <ReactQueryDevtools initialIsOpen={false} />
    </QueryClientProvider>
  )
}

选项

  • initialIsOpen: Boolean
    • 如果希望开发者工具默认打开,请将此项设置为 true
  • buttonPosition?: "top-left" | "top-right" | "bottom-left" | "bottom-right" | "relative"
    • 默认为 bottom-right
    • 用于打开和关闭开发者工具面板的 React Query 徽标的位置
    • 如果为 relative,则按钮放置在您渲染开发者工具的位置。
  • position?: "top" | "bottom" | "left" | "right"
    • 默认为 bottom
    • React Query 开发者工具面板的位置
  • client?: QueryClient,
    • 使用此选项可使用自定义 QueryClient。否则,将使用最近上下文中的 QueryClient。
  • errorTypes?: { name: string; initializer: (query: Query) => TError}[]
    • 使用此选项可预定义一些可以在查询���触发的错误。当从 UI 中切换该错误时,将调用初始化程序(使用特定查询)。它必须返回一个 Error。
  • styleNonce?: string
    • 使用此选项可将 nonce 传递给添加到文档头部的样式标签。如果您使用内容安全策略 (CSP) nonce 来允许内联样式,则此选项很有用。
  • shadowDOMTarget?: ShadowRoot
    • 默认行为会将开发者工具的样式应用于 DOM 中的 head 标签。
    • 使用此选项可将 shadow DOM 目标传递给开发者工具,以便样式将应用于 shadow DOM 内部,而不是 light DOM 中的 head 标签内部。

嵌入式模式

嵌入式模式会将开发工具显示为应用程序中的固定元素,因此您可以在自己的开发工具中使用我们的面板。

将以下代码尽可能高地放置在您的 React 应用程序中。它离页面根部越近,效果就越好!

tsx
import { ReactQueryDevtoolsPanel } from '@tanstack/react-query-devtools'

function App() {
  const [isOpen, setIsOpen] = React.useState(false)

  return (
    <QueryClientProvider client={queryClient}>
      {/* 您的应用程序的其余部分 */}
      <button
        onClick={() => setIsOpen(!isOpen)}
      >{`${isOpen ? '关闭' : '打开'} 开发工具面板`}</button>
      {isOpen && <ReactQueryDevtoolsPanel onClose={() => setIsOpen(false)} />}
    </QueryClientProvider>
  )
}
import { ReactQueryDevtoolsPanel } from '@tanstack/react-query-devtools'

function App() {
  const [isOpen, setIsOpen] = React.useState(false)

  return (
    <QueryClientProvider client={queryClient}>
      {/* 您的应用程序的其余部分 */}
      <button
        onClick={() => setIsOpen(!isOpen)}
      >{`${isOpen ? '关闭' : '打开'} 开发工具面板`}</button>
      {isOpen && <ReactQueryDevtoolsPanel onClose={() => setIsOpen(false)} />}
    </QueryClientProvider>
  )
}

选项

  • style?: React.CSSProperties
    • 开发者工具面板的自定义样式
    • 默认值:{ height: '500px' }
    • 示例:{ height: '100%' }
    • 示例:{ height: '100%', width: '100%' }
  • onClose?: () => unknown
    • 关闭开发者工具面板时调用的回调函数
  • client?: QueryClient,
    • 使用此选项可使用自定义 QueryClient。否则,将使用最近上下文中的 QueryClient。
  • errorTypes?: { name: string; initializer: (query: Query) => TError}[]
    • 使用此选项可预定义一些可以在查询中触发的错误。当从 UI 中切换该错误时,将调用初始化程序(使用特定查询)。它必须返回一个 Error。
  • styleNonce?: string
    • 使用此选项可将 nonce 传递给添加到文档头部的样式标签。如果您使用内容安全策略 (CSP) nonce 来允许内联样式,则此选项很有用。
  • shadowDOMTarget?: ShadowRoot
    • 默认行为会将开发者工具的样式应用于 DOM 中的 head 标签。
    • 使用此选项可将 shadow DOM 目标传递给开发者工具,以便样式将应用于 shadow DOM 内部,而不是 light DOM 中的 head 标签内部。

生产环境中的开发者工具

开发者工具在生产构建中被排除。但是,在生产环境中延迟加载开发者工具可能是可取的:

tsx
import * as React from 'react'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import { Example } from './Example'

const queryClient = new QueryClient()

const ReactQueryDevtoolsProduction = React.lazy(() =>
  import('@tanstack/react-query-devtools/build/modern/production.js').then(
    (d) => ({
      default: d.ReactQueryDevtools,
    }),
  ),
)

function App() {
  const [showDevtools, setShowDevtools] = React.useState(false)

  React.useEffect(() => {
    // @ts-expect-error
    window.toggleDevtools = () => setShowDevtools((old) => !old)
  }, [])

  return (
    <QueryClientProvider client={queryClient}>
      <Example />
      <ReactQueryDevtools initialIsOpen />
      {showDevtools && (
        <React.Suspense fallback={null}>
          <ReactQueryDevtoolsProduction />
        </React.Suspense>
      )}
    </QueryClientProvider>
  )
}

export default App
import * as React from 'react'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import { Example } from './Example'

const queryClient = new QueryClient()

const ReactQueryDevtoolsProduction = React.lazy(() =>
  import('@tanstack/react-query-devtools/build/modern/production.js').then(
    (d) => ({
      default: d.ReactQueryDevtools,
    }),
  ),
)

function App() {
  const [showDevtools, setShowDevtools] = React.useState(false)

  React.useEffect(() => {
    // @ts-expect-error
    window.toggleDevtools = () => setShowDevtools((old) => !old)
  }, [])

  return (
    <QueryClientProvider client={queryClient}>
      <Example />
      <ReactQueryDevtools initialIsOpen />
      {showDevtools && (
        <React.Suspense fallback={null}>
          <ReactQueryDevtoolsProduction />
        </React.Suspense>
      )}
    </QueryClientProvider>
  )
}

export default App

这样,调用 window.toggleDevtools() 将下载开发者工具包并显示它们。

现代打包工具

如果您的打包工具支持包导出,您可以使用以下导入路径:

tsx
const ReactQueryDevtoolsProduction = React.lazy(() =>
  import('@tanstack/react-query-devtools/production').then((d) => ({
    default: d.ReactQueryDevtools,
  })),
)
const ReactQueryDevtoolsProduction = React.lazy(() =>
  import('@tanstack/react-query-devtools/production').then((d) => ({
    default: d.ReactQueryDevtools,
  })),
)

对于 TypeScript,您需要在 tsconfig 中设置 moduleResolution: 'nodenext',这至少需要 TypeScript v4.7。