TanStack Start:从Router到全栈框架

1. TanStack Start 在 TanStack 生态里的位置

你可以把 TanStack Start 理解成:把 TanStack Router + TanStack Query + React 打包成一个“有主见的全栈壳”,帮你从 SPA 升级到 SSR/SSG 的全栈应用。

官方简介里就强调了它是基于 TanStack Router 的全栈框架壳子(包括 SSR、静态预渲染、server functions 等)tanstack start 官网

1.1 组合关系:Router / Query / Start

TanStack Start 自身并不重新发明路由或数据获取,它做的是“组合”和“约束”:

层级角色你写的代码主要长什么样
React 组件纯 UIfunction UserList() { ... }
TanStack Query数据获取与缓存useQuery({ queryKey: ["users"], queryFn: getUsers })
TanStack Router路由、布局、数据预取file-based routing 下的 routes/users.tsx
TanStack Start执行模型、SSR/SSG、server functions、构建app.config, app/routes, app/server/functions

机制上:

  • Router 决定“在哪个 URL 下渲染哪个页面组件”
  • Query 决定“在这个页面里,数据怎么拉、怎么缓存”
  • Start 决定“这些代码在什么环境(浏览器/Node/Edge)以什么模式(SSR/SSG/SPA)执行”

参考 LogRocket 的 TanStack Start 总览 可以看到,它基本是“给 TanStack Router 装了一个执行平台”。

1.2 一个可以运行的最小示例(概念级)

假设你有一个展示用户列表的页面:

tsx// app/routes/users.tsx import { createFileRoute } from '@tanstack/react-router' import { useQuery } from '@tanstack/react-query' import { getUsers } from '../server/functions/getUsers' export const Route = createFileRoute('/users')({ component: UsersPage, }) function UsersPage() { const { data, isLoading } = useQuery({ queryKey: ['users'], queryFn: () => getUsers(), // 注意:这里调用的是 server function }) if (isLoading) return <div>Loading...</div> return ( <ul> {data?.map((u: any) => <li key={u.id}>{u.name}</li>)} </ul> ) } ts// app/server/functions/getUsers.ts 'use server' export async function getUsers() { // 这里运行在 server runtime,可以访问 DB / 私钥等 return [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, ] }

关键点:

  • routes/users.tsx文件路由:文件 → 路由
  • UsersPage 是页面(React 组件)
  • useQuery 是 Query hook,用于获取数据
  • getUsersserver function,只在服务端执行

这一条链条就是后面你要画的“高层架构图”的骨架。

1 / 6