name: tanstack-router description: TanStack Router 类型安全、基于文件的路由库,适用于 React。用于单页应用(SPA)、集成 TanStack Query、Cloudflare Workers,或遇到开发者工具、类型安全、加载器、Vite 打包错误。 license: MIT allowed-tools: [Bash, Read, Write, Edit] metadata: version: 1.0.0 author: Claude Skills 维护者 last-verified: 2025-11-07 production-tested: true keywords: - tanstack router - react router - type-safe routing - file-based routing - client-side routing - spa routing - route loaders - data loading - navigation - vite plugin - cloudflare workers - tanstack query integration - typescript routing - route params - nested routes - code splitting
TanStack Router 技能
使用 TanStack Router 构建类型安全、基于文件的路由,针对 React 单页应用(SPA),优化用于 Cloudflare Workers 部署。
何时使用此技能
自动触发提及以下内容时:
- “TanStack Router”或“类型安全路由”
- “基于文件的路由”或“路由配置”
- 强调 TypeScript 的“React 路由”
- “路由加载器”或“路由中的数据加载”
- “Cloudflare Workers 路由”
在以下情况下使用此技能:
- 构建具有类型安全导航的单页应用(SPA)
- 实现基于文件的路由(类似于 Next.js)
- 需要路由级数据加载
- 将路由与 TanStack Query 集成
- 部署到 Cloudflare Workers
- 想要比 React Router 更好的 TypeScript 支持
快速开始
安装
bun add @tanstack/react-router @tanstack/router-devtools
bun add -d @tanstack/router-plugin
最新版本: v1.134.13(已验证 2025-11-07)
Vite 配置
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { TanStackRouterVite } from '@tanstack/router-plugin/vite'
export default defineConfig({
plugins: [
TanStackRouterVite(), // 必须在 react() 之前
react(),
],
})
基本设置
// src/routes/__root.tsx
import { createRootRoute, Outlet } from '@tanstack/react-router'
export const Route = createRootRoute({
component: () => (
<div>
<nav>
<Link to="/">主页</Link>
<Link to="/about">关于</Link>
</nav>
<hr />
<Outlet />
</div>
),
})
// src/routes/index.tsx
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/')({
component: () => <h1>主页</h1>,
})
// src/routes/about.tsx
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/about')({
component: () => <h1>关于页面</h1>,
})
// src/main.tsx
import { createRouter, RouterProvider } from '@tanstack/react-router'
import { routeTree } from './routeTree.gen' // 自动生成
const router = createRouter({ routeTree })
function App() {
return <RouterProvider router={router} />
}
主要特性
1. 类型安全导航
// 完全类型化!
<Link to="/posts/$postId" params={{ postId: '123' }} />
// 如果路由不存在,TypeScript 错误
<Link to="/invalid-route" /> // ❌ 错误!
2. 路由加载器(数据获取)
// src/routes/posts.$postId.tsx
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params }) => {
const post = await fetchPost(params.postId) // 完全类型化!
return { post }
},
component: ({ useLoaderData }) => {
const { post } = useLoaderData()
return <h1>{post.title}</h1>
},
})
3. TanStack Query 集成
import { queryOptions } from '@tanstack/react-query'
const postQueryOptions = (postId: string) =>
queryOptions({
queryKey: ['posts', postId],
queryFn: () => fetchPost(postId),
})
export const Route = createFileRoute('/posts/$postId')({
loader: ({ context: { queryClient }, params }) =>
queryClient.ensureQueryData(postQueryOptions(params.postId)),
component: () => {
const { postId } = Route.useParams()
const { data: post } = useQuery(postQueryOptions(postId))
return <h1>{post.title}</h1>
},
})
常见错误及解决方案
错误 1:开发者工具依赖解析
问题: 构建失败,找不到 @tanstack/router-devtools-core。
解决方案:
bun add @tanstack/router-devtools
错误 2:Vite 插件顺序
问题: 路由未自动生成。
解决方案: TanStackRouterVite 必须在 react() 之前:
plugins: [
TanStackRouterVite(), // 第一个!
react(),
]
错误 3:类型注册缺失
问题: Link to 未类型化。
解决方案:
// src/routeTree.gen.ts 是自动生成的
// 在 main.tsx 中导入以注册类型
import { routeTree } from './routeTree.gen'
错误 4:加载器未运行
问题: 导航时加载器函数未调用。
解决方案: 确保路由导出 Route:
export const Route = createFileRoute('/path')({ loader: ... })
错误 5:使用表单时的内存泄漏
问题: 使用 TanStack Form + Router 时生产环境崩溃。
解决方案: 这是一个已知问题(#5734)。变通方法:使用 React Hook Form 替代,或等待修复。
Cloudflare Workers 部署
Vite 配置
import { defineConfig } from 'vite'
import { TanStackRouterVite } from '@tanstack/router-plugin/vite'
import { cloudflare } from '@cloudflare/vite-plugin'
export default defineConfig({
plugins: [
TanStackRouterVite(),
react(),
cloudflare(),
],
})
API 后端模式
// functions/api/posts.ts
export async function onRequestGet({ env }) {
const { results } = await env.DB.prepare('SELECT * FROM posts').all()
return Response.json(results)
}
// 客户端路由
export const Route = createFileRoute('/posts')({
loader: async () => {
const posts = await fetch('/api/posts').then(r => r.json())
return { posts }
},
})
模板
所有模板在 ~/.claude/skills/tanstack-router/templates/:
- package.json - 依赖项和版本
- vite.config.ts - Vite 插件设置
- basic-routes/ - 基于文件的路由结构
- route-with-loader.tsx - 数据加载示例
- query-integration.tsx - TanStack Query 模式
- nested-routes/ - 布局模式
- cloudflare-deployment.md - Workers 设置指南
参考文档
深度指南在 ~/.claude/skills/tanstack-router/references/:
- file-based-routing.md - 路由结构约定
- type-safety.md - TypeScript 模式
- data-loading.md - 加载器和 TanStack Query
- cloudflare-workers.md - 部署指南
- common-errors.md - 所有 7+ 错误及解决方案
- migration-guide.md - 从 React Router 迁移
与现有技能集成
适用于:
- tanstack-query - 推荐用于数据获取
- tanstack-table - 从路由显示数据
- cloudflare-worker-base - API 后端
- tailwind-v4-shadcn - UI 样式
令牌效率
无技能时: ~10k 令牌,40-50 分钟,3-4 个错误 有此技能时: ~4k 令牌,15-20 分钟,0 个错误 节省: 60% 令牌,65% 时间
生产验证
已测试环境:
- React 19.2, Vite 6.0, TypeScript 5.8
- Cloudflare Workers(Wrangler 4.0)
- TanStack Query v5.90.7
堆栈兼容性:
- ✅ Cloudflare Workers + 静态资源
- ✅ TanStack Query 集成
- ✅ TypeScript 严格模式
最后更新: 2025-11-07 库版本: @tanstack/react-router v1.134.13