🔥 개발 도구

605자
7분

React Query에는 전용 개발 도구가 있어 기쁨의 박수를 보냅니다! 🥳

React Query를 시작할 때 이 개발 도구를 곁에 두는 것이 좋습니다. React Query의 내부 작동을 시각화하여 보여주기 때문에 문제가 생겼을 때 디버깅 시간을 크게 줄일 수 있습니다.

현재 개발 도구는 React Native를 지원하지 않습니다. 개발 도구를 플랫폼에 구애받지 않게 만드는 데 도움을 주고 싶다면 알려주세요!

반가운 소식이 있습니다! React Native용 React Query 개발 도구 패키지가 새로 나왔습니다. 이제 React Native 프로젝트에 개발 도구를 직접 통합할 수 있습니다. react-native-react-query-devtools에서 자세히 알아보고 기여해 보세요.

외부 대시보드를 통해 React Query 개발 도구를 사용할 수 있는 외부 도구도 있습니다. react-query-external-sync에서 자세한 정보를 확인하고 기여해 보세요.

버전 5부터 개발 도구에서 변경 사항도 관찰할 수 있게 되었습니다.

개발 도구 설치 및 불러오기

개발 도구는 별도의 패키지로 제공되므로 따로 설치해야 합니다:

$ npm i @tanstack/react-query-devtools
# 또는
$ pnpm add @tanstack/react-query-devtools
# 또는
$ yarn add @tanstack/react-query-devtools
# 또는
$ bun add @tanstack/react-query-devtools
 
shell

Next 13+ App Dir을 사용한다면 개발 의존성으로 설치해야 작동합니다.

개발 도구는 다음과 같이 불러올 수 있습니다:

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

기본적으로 React Query 개발 도구는 process.env.NODE_ENV === 'development'일 때만 번들에 포함되므로 프로덕션 빌드에서 제외하는 것을 걱정할 필요가 없습니다.

플로팅 모드

플로팅 모드는 개발 도구를 앱에 고정된 부유 요소로 마운트하고 화면 구석에 개발 도구를 표시하거나 숨기는 토글을 제공합니다. 이 토글 상태는 localStorage에 저장되어 페이지를 새로 고쳐도 유지됩니다.

다음 코드를 React 앱의 가능한 한 높은 위치에 배치하세요. 페이지의 루트에 가까울수록 더 잘 작동합니다!

import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
 
function App() {
  return (
    <QueryClientProvider client={queryClient}>
      {/* 애플리케이션의 나머지 부분 */}
      <ReactQueryDevtools initialIsOpen={false} />
    </QueryClientProvider>
  )
}
 
typescript

옵션

  • 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 태그에 적용됩니다.
    • 개발 도구에 섀도우 DOM 대상을 전달하려면 이 옵션을 사용하세요. 그러면 스타일이 head 태그 대신 섀도우 DOM 내에 적용됩니다.

프로덕션 환경의 개발 도구

개발 도구는 프로덕션 빌드에서 제외됩니다. 그러나 프로덕션 환경에서 개발 도구를 지연 로딩하고 싶을 수 있습니다:

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
 
typescript

이렇게 하면 window.toggleDevtools()를 호출하여 개발 도구 번들을 다운로드하고 표시할 수 있습니다.

최신 번들러

번들러가 패키지 내보내기를 지원한다면 다음과 같은 가져오기 경로를 사용할 수 있습니다:

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

TypeScript를 사용하는 경우 tsconfig에서 moduleResolution: 'nodenext'를 설정해야 합니다. 이 설정은 TypeScript v4.7 이상이 필요합니다.