tanstack-start · tanstack-skills — скилл для Claude Code: что делает и как установить
Скилл помогает создавать и сопровождать приложения на фреймворке TanStack Start с потоковым SSR, серверными функциями и маршрутизацией.
npx skills add tanstack-skills/tanstack-skills --skill tanstack-start -a claude-codeЧто делает tanstack-start
Скилл даёт ассистенту инструкции по разработке на фреймворке TanStack Start. В основе стека лежат TanStack Router, сборщик Vinxi (Vite и Nitro), а также пакет @tanstack/react-start. Инструмент обучает модель правильно организовывать структуру папок app/routes, настраивать файл app.config.ts и генерировать дерево маршрутов в routeTree.gen.ts.
Для бэкенда скилл описывает создание RPC-вызовов через createServerFn с валидацией данных через Zod, цепочки createMiddleware для контекста авторизации и API-маршруты через createAPIFileRoute. Для рендеринга задаются правила стриминга с разделением критических и отложенных данных через defer и Suspense.
Фреймворк находится в статусе Release Candidate, поэтому поддержка React Server Components пока в активной разработке. Серверные функции обязаны возвращать только сериализуемые данные и не могут захватывать клиентские переменные из замыканий, иначе сборка завершится ошибкой.
Какие задачи решает
- настроить потоковый SSR с отложенной загрузкой данных через defer
- создать типобезопасные серверные функции с валидацией через Zod
- организовать файловую маршрутизацию и контекст авторизации в middleware
- сконфигурировать пресеты развёртывания Nitro для Node.js или бессерверных сред
Примеры запросов агенту
- Настрой серверную функцию с методом POST и валидацией Zod для создания пользователя
- Добавь middleware проверки сессии пользователя и передай user в контекст
- Сделай маршрут дашборда с потоковым SSR и компонентом Suspense для медленных данных
Как установить tanstack-start
1Через Skills CLI (Vercel)
npx skills add tanstack-skills/tanstack-skills --skill tanstack-start -a claude-code2Вручную: положить файлы
~/.claude/skills/tanstack-start/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/tanstack-start/
1Через Skills CLI (Vercel)
npx skills add tanstack-skills/tanstack-skills --skill tanstack-start -a codex2Вручную: положить файлы
.agents/skills/tanstack-start/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add tanstack-skills/tanstack-skills --skill tanstack-start -a cursor2Вручную: положить файлы
.cursor/skills/tanstack-start/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install tanstack-skills/tanstack-skills tanstack-start2Вручную: положить файлы
.github/skills/tanstack-start/SKILL.md1Через Skills CLI (Vercel)
npx skills add tanstack-skills/tanstack-skills --skill tanstack-start -a gemini-cli2Командой платформы
gemini skills install https://github.com/tanstack-skills/tanstack-skills --path plugins/tanstack-start/skills/tanstack-startВручную: положить файлы
.devin/skills/tanstack-start/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add tanstack-skills/tanstack-skills --skill tanstack-start -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора12
Другие версии tanstack-start
Похожие
Рядом в теме «Фронтенд и UI»
Всё по теме «Фронтенд и UI» →Вопросы о tanstack-start
Как установить tanstack-start в Claude Code?
Выполните команду npx skills add tanstack-skills/tanstack-skills --skill tanstack-start -a claude-code. Файл навыка сохранится по пути ~/.claude/skills/tanstack-start/SKILL.md.
Что делает скилл tanstack-start?
Он предоставляет агенту правила и примеры кода для работы с TanStack Start: от файлового роутинга и middleware до серверных RPC-функций и деплоя через пресеты Nitro.
Поддерживает ли фреймворк React Server Components?
Поддержка RSC находится в активной разработке. Разработчики планируют выпустить её как обратно совместимое дополнение в ветке v1.x.
Исходный текст
SKILL.md · MIT
---
name: tanstack-start
description: Full-stack React framework powered by TanStack Router with SSR, streaming, server functions, and deployment to any hosting provider.
---
# TanStack Start Skills
## Overview
TanStack Start is a full-stack React framework built on TanStack Router, powered by Vite and Nitro (via Vinxi). It provides server-side rendering, streaming, server functions (RPC), middleware, API routes, and deploys to any platform via Nitro presets.
**Package:** `@tanstack/react-start`
**Router Plugin:** `@tanstack/router-plugin`
**Build Tool:** Vinxi (Vite + Nitro)
**Status:** RC (Release Candidate)
**RSC Support:** React Server Components support is in active development and will land as a non-breaking v1.x addition
## Installation & Project Setup
```bash
npx @tanstack/cli create my-app
# Or manually:
npm install @tanstack/react-start @tanstack/react-router react react-dom
npm install -D @tanstack/router-plugin typescript vite vite-tsconfig-paths
```
### Project Structure
```
my-app/
app/
routes/
__root.tsx # Root layout
index.tsx # / route
posts.$postId.tsx # /posts/:postId
api/
users.ts # /api/users API route
client.tsx # Client entry
router.tsx # Router creation
ssr.tsx # SSR entry
routeTree.gen.ts # Auto-generated route tree
app.config.ts # TanStack Start config
tsconfig.json
package.json
```
### Configuration (`app.config.ts`)
```typescript
import { defineConfig } from '@tanstack/react-start/config'
import viteTsConfigPaths from 'vite-tsconfig-paths'
export default defineConfig({
vite: {
plugins: [
viteTsConfigPaths({ projects: ['./tsconfig.json'] }),
],
},
server: {
preset: 'node-server', // 'vercel' | 'netlify' | 'cloudflare-pages' | etc.
},
tsr: {
appDirectory: './app',
routesDirectory: './app/routes',
generatedRouteTree: './app/routeTree.gen.ts',
},
})
```
## Server Functions (`createServerFn`)
Server functions provide type-safe RPC calls between client and server.
### Basic Server Functions
```typescript
import { createServerFn } from '@tanstack/react-start'
// GET (data fetching, cacheable)
const getUsers = createServerFn()
.handler(async () => {
const users = await db.query.users.findMany()
return users
})
// POST (mutations, side effects)
const createUser = createServerFn({ method: 'POST' })
.validator((data: { name: string; email: string }) => data)
.handler(async ({ data }) => {
const user = await db.insert(users).values(data).returning()
return user
})
```
### With Zod Validation
```typescript
import { z } from 'zod'
const updateUser = createServerFn({ method: 'POST' })
.validator(
z.object({
id: z.string(),
name: z.string().min(1),
email: z.string().email(),
})
)
.handler(async ({ data }) => {
// data is fully typed: { id: string; name: string; email: string }
return await db.update(users).set(data).where(eq(users.id, data.id))
})
```
## Middleware
### Creating Middleware
```typescript
import { createMiddleware } from '@tanstack/react-start'
const loggingMiddleware = createMiddleware().handler(async ({ next }) => {
console.log('Request started')
const result = await next()
console.log('Request completed')
return result
})
```
### Auth Middleware with Context
```typescript
const authMiddleware = createMiddleware().handler(async ({ next }) => {
const request = getWebRequest()
const session = await getSession(request)
if (!session?.user) {
throw redirect({ to: '/login' })
}
// Pass typed context to handler
return next({ context: { user: session.user } })
})
```
### Chaining Middleware
```typescript
const adminMiddleware = createMiddleware()
.middleware([authMiddleware])
.handler(async ({ next, context }) => {
// context.user is typed from authMiddleware
if (context.user.role !== 'admin') {
throw redirect({ to: '/unauthorized' })
}
return next({ context: { isAdmin: true } })
})
// Usage
const adminAction = createServerFn({ method: 'POST' })
.middleware([adminMiddleware])
.handler(async ({ context }) => {
// context: { user: User; isAdmin: boolean }
return { success: true }
})
```
## API Routes (Server Routes)
```typescript
// app/routes/api/users.ts
import { createAPIFileRoute } from '@tanstack/react-start/api'
export const APIRoute = createAPIFileRoute('/api/users')({
GET: async ({ request }) => {
const users = await db.query.users.findMany()
return Response.json(users)
},
POST: async ({ request }) => {
const body = await request.json()
const user = await db.insert(users).values(body).returning()
return new Response(JSON.stringify(user), { status: 201 })
},
})
```
## SSR Strategies
### Streaming SSR (Default)
```typescript
export const Route = createFileRoute('/dashboard')({
loader: async () => ({
criticalData: await fetchCriticalData(),
deferredData: defer(fetchSlowData()),
}),
component: Dashboard,
})
function Dashboard() {
const { criticalData, deferredData } = Route.useLoaderData()
return (
<div>
<CriticalSection data={criticalData} />
<Suspense fallback={<Loading />}>
<Await promise={deferredData}>
{(data) => <SlowSection data={data} />}
</Await>
</Suspense>
</div>
)
}
```
## Deployment
### Supported Platforms (Nitro Presets)
```typescript
// app.config.ts
export default defineConfig({
server: {
preset: 'node-server', // Self-hosted Node.js
// preset: 'vercel', // Vercel
// preset: 'netlify', // Netlify
// preset: 'cloudflare-pages', // Cloudflare Pages
// preset: 'aws-lambda', // AWS Lambda
// preset: 'deno-server', // Deno Deploy
// preset: 'bun', // Bun
},
})
```
## Best Practices
1. **Use validators for all server function inputs** - runtime safety and TypeScript inference
2. **Compose middleware** for cross-cutting concerns (auth, logging, rate limiting)
3. **Use `createServerFn` GET** for data fetching (cacheable, preloadable)
4. **Use `createServerFn` POST** for mutations and side effects
5. **Use `beforeLoad`** for route-level auth guards
6. **Use `defer()`** for non-critical data to improve TTFB
7. **Set `defaultPreload: 'intent'`** on the router for instant navigation
8. **Co-locate server functions** with the routes that use them
## Common Pitfalls
- Server functions cannot close over client-side variables (they're extracted to separate bundles)
- Data returned from server functions must be serializable
- Forgetting `await` in loaders leads to streaming issues
- Importing server-only code in client bundles causes build errors
- Missing `declare module '@tanstack/react-router'` loses all type safety
© tanstack-skills · MIT · tanstack-skills/tanstack-skills