К основному содержанию
правило

nextjs-tanstack-query — правило для Cursor

Задаёт стандарты связки Next.js App Router и TanStack Query v5. Направляет Cursor при настройке гидратации кэша, серверных мутаций и оптимистичных обновлений интерфейса.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/nextjs-tanstack-query.mdc
Открыть на GitHub

Что делает nextjs-tanstack-query

Правило задаёт стандарты для Next.js App Router и TanStack Query v5. Серверные компоненты получают данные напрямую без вызова хуков. Начальное состояние передаётся на клиент через prefetchQuery и обёртку HydrationBoundary. Для каждого серверного запроса создаётся свой QueryClient. Повторное использование инстанса на сервере приведёт к утечке данных между пользователями.

В клиентских компонентах запрещены прямые вызовы fetch. Запросы оформляются через фабрики queryOptions. Мутации вызывают Server Actions внутри mutationFn и сбрасывают кэш через invalidateQueries. Для оптимистичного интерфейса описан откат состояния через onError.

Правило отслеживает пути app/**/*.tsx, app/**/*.ts, src/app/**/*.tsx и src/queries/**/*. Все компоненты с хуками библиотеки помечаются директивой 'use client'.

Какие задачи решает

  • настроить гидратацию серверного кэша TanStack Query в компонентах
  • организовать мутации данных через Server Actions
  • внедрить оптимистичные обновления интерфейса с откатом ошибок
  • создать фабрики запросов через queryOptions

Примеры запросов агенту

  • Сделай серверный компонент в app/posts/page.tsx с предзагрузкой постов через prefetchQuery и HydrationBoundary
  • Напиши мутацию для createPost через Server Action с инвалидацией кэша списка
  • Добавь оптимистичное обновление для updatePost с сохранением предыдущего состояния на случай ошибки

Как установить nextjs-tanstack-query

Вручную: положить файлы

.cursor/rules/nextjs-tanstack-query.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о nextjs-tanstack-query

Как установить nextjs-tanstack-query в Cursor?

Сохраните файл правила по пути .cursor/rules/nextjs-tanstack-query.mdc в корне проекта. Редактор автоматически применит указанные инструкции к подходящим файлам.

Что делает правило nextjs-tanstack-query?

Оно обучает Cursor архитектурным шаблонам интеграции TanStack Query v5 в Next.js App Router. Правило предотвращает утечки данных и подсказывает корректный синтаксис предзагрузки.

Почему нельзя переиспользовать QueryClient на сервере?

Один общий экземпляр сохраняет данные предыдущих запросов и отдаёт их другим пользователям. Правило требует создавать новый QueryClient на каждый серверный запрос.

Исходный текст

nextjs-tanstack-query.mdc · CC0-1.0
---
description: "Next.js App Router combined with TanStack Query v5 — HydrationBoundary pattern, Server Actions as mutations, optimistic updates, and infinite scroll"
globs: ["app/**/*.tsx", "app/**/*.ts", "src/app/**/*.tsx", "src/queries/**/*"]
alwaysApply: false
---
You are an expert in Next.js App Router, TanStack Query v5, TypeScript, and combining server components with client-side data fetching.

## Architecture
- Server Components fetch data directly — no TanStack Query needed there
- TanStack Query lives in Client Components for interactive, real-time, or mutation-driven data
- Hydrate the Query cache from server to avoid client waterfalls on first load
- Use React Server Components for initial page data; TanStack Query for mutations + polling + optimistic UI

## Provider Setup
```tsx
// providers/query-provider.tsx
'use client'
export function QueryProvider({ children }: { children: React.ReactNode }) {
  const [queryClient] = useState(() => new QueryClient({
    defaultOptions: { queries: { staleTime: 60 * 1000 } },
  }))
  return (
    <QueryClientProvider client={queryClient}>
      {children}
      <ReactQueryDevtools initialIsOpen={false} />
    </QueryClientProvider>
  )
}
```

## Server Prefetch + HydrationBoundary Pattern
```tsx
// app/posts/page.tsx  (Server Component)
export default async function PostsPage() {
  const queryClient = new QueryClient()
  await queryClient.prefetchQuery(postsQueryOptions())
  return (
    <HydrationBoundary state={dehydrate(queryClient)}>
      <PostsList />
    </HydrationBoundary>
  )
}

// app/posts/_components/posts-list.tsx  (Client Component)
'use client'
export function PostsList() {
  const { data: posts } = useQuery(postsQueryOptions())  // reads from pre-populated cache
  return <ul>{posts?.map(p => <li key={p.id}>{p.title}</li>)}</ul>
}
```

## queryOptions Factory
```ts
export const postsQueryOptions = (filters?: PostFilters) =>
  queryOptions({
    queryKey: ['posts', 'list', filters],
    queryFn: () => fetch('/api/posts').then(r => r.json()),
  })
```

## Server Actions as mutationFn
```tsx
// app/posts/actions.ts
'use server'
export async function createPost(data: { title: string; body: string }) {
  const post = await db.post.create({ data })
  revalidatePath('/posts')
  return post
}

// usage in Client Component
const mutation = useMutation({
  mutationFn: createPost,
  onSuccess: () => queryClient.invalidateQueries({ queryKey: ['posts', 'list'] }),
})
```

## Optimistic Updates
```tsx
const mutation = useMutation({
  mutationFn: updatePost,
  onMutate: async (updated) => {
    await queryClient.cancelQueries({ queryKey: ['posts', 'detail', updated.id] })
    const previous = queryClient.getQueryData(['posts', 'detail', updated.id])
    queryClient.setQueryData(['posts', 'detail', updated.id], (old: Post) => ({ ...old, ...updated }))
    return { previous }
  },
  onError: (_, updated, ctx) => {
    queryClient.setQueryData(['posts', 'detail', updated.id], ctx?.previous)
  },
  onSettled: (_, __, updated) => {
    queryClient.invalidateQueries({ queryKey: ['posts', 'detail', updated.id] })
  },
})
```

## Key Rules
- Create a **new** `QueryClient` per request in Server Components — never reuse across requests
- Create **one** `QueryClient` per browser session via `useState` in the provider
- Always wrap server-prefetched subtrees in `HydrationBoundary`
- Mark all components using TanStack Query hooks with `'use client'`
- Never call `fetch` directly in Client Components — always go through `queryFn`

© PatrickJS · CC0-1.0 · PatrickJS/awesome-cursorrules

Похожие правила IDE

Все правила IDE по теме «Фронтенд и UI» →
winui3 официальный github Правило задаёт рекомендации для WinUI 3 и Windows App SDK: от XAML и потоков до окон и MVVM. Пригодится, чтобы Copilot учитывал особенности настольных приложений Windows. ★ 40 451звёзд репо vue официальный github Правило задаёт Copilot стандарты Vue 3: Composition API, <script setup>, реактивность, Pinia и Vue Router. Пригодится, когда агент пишет компоненты в вашем стиле. ★ 40 451звёзд репо tanstack-start-shadcn-tailwind официальный github Правило задаёт Copilot стек TanStack Start, Shadcn/ui и Tailwind CSS и требует валидировать внешние данные через Zod. ★ 40 451звёзд репо tailwind-v4-vite официальный github Правило помогает подключить Tailwind CSS v4 к проекту на Vite через официальный плагин. Пригодится и для новой установки, и при переходе с v3. ★ 40 451звёзд репо svelte официальный github Направляет GitHub Copilot на стандарты Svelte 5 и SvelteKit 2: руны вместо старых сторов, типизация компонентов и безопасная работа с SSR. ★ 40 451звёзд репо power-bi-custom-visuals-development официальный github Правило для GitHub Copilot, которое подсказывает агенту, как писать кастомные визуалы Power BI на React, D3.js и TypeScript. ★ 40 451звёзд репо

Из того же набора234

Весь набор →
nextjs-vercel-typescript-cursorrules-prompt-file Правило для Cursor, которое задаёт стиль кода и структуру проекта на Next.js с TypeScript, Vercel middleware и KV-базой. ★ 41 024звёзд репо nextjs-vercel-supabase-cursorrules-prompt-file Правило задаёт контекст для веб-приложения BA Copilot на Next.js с Vercel AI, Supabase и рендерингом схем BPMN. Помогает агенту придерживаться App Router и единого стека. ★ 41 024звёзд репо nextjs-typescript-tailwind-cursorrules-prompt-file Правило для Cursor, которое задаёт агенту стандарты проекта на Next.js, TypeScript и Tailwind CSS. Пригодится, когда нужно, чтобы новый код ложился в существующую структуру. ★ 41 024звёзд репо nextjs-typescript-cursorrules-prompt-file Правило для Cursor задаёт стек Next.js с TypeScript и порядок работы агента: план, стиль кода, формат ответа. Пригодится, если вы пишете фронтенд на Next.js. ★ 41 024звёзд репо nextjs-tanstack-query-cursorrules-prompt-file Правило задаёт паттерны для Next.js App Router и TanStack Query v5: гидратация кэша, Server Actions и оптимистичные обновления. ★ 41 024звёзд репо nextjs-tailwind-typescript-apps-cursorrules-prompt Правило для Cursor, которое настраивает ассистента на Next.js, Tailwind CSS и TypeScript. Оно задаёт порядок работы: сначала план в псевдокоде, потом код. ★ 41 024звёзд репо nextjs-supabase-shadcn-pwa-cursorrules-prompt-file Задаёт стандарты стека Next.js 15+, Supabase и Shadcn UI для Cursor. Вводит лимит на 150 строк в файле и строгий регламент ведения заметок сборки. ★ 41 024звёзд репо nextjs-seo-dev-cursorrules-prompt-file Правило задаёт Cursor контекст для разработки Next.js с SEO-ориентиром, комментариями и фиксированными настройками проекта. ★ 41 024звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой