Vite + TanStack Start 工程栈
基于 Vite、TanStack Start 与 SSP UI Registry 构建高性能客户端应用
为什么选择这一栈
Vite + TanStack Start 聚焦于极致的开发体验与客户端渲染效率,利用 Vite 的快速启动与热更新,以及 TanStack 系列(Router、Query、Start)提供的文件路由、数据管理和执行模型。本指南结合 SSP UI Registry 的能力,快速搭建具备主题、多语言、数据访问层与工程化保障的现代前端栈。
首次出现的缩写会在括号内说明,方便团队成员对齐概念:
- CSR(Client-Side Rendering):在浏览器执行渲染逻辑,适合高度交互、即时响应的应用。
- TTRPC(TanStack Router Page Component):TanStack Start 中通过路由文件定义的页面组件,与 Loader/Action 搭配使用。
技术栈速览
🏗️ 核心框架
| 技术 | 版本 | 说明 |
|---|---|---|
| Vite | 7+ | 极速构建工具 |
| TanStack Start | latest | 文件路由、Server Functions、Selective SSR |
| TanStack Router | latest | 类型安全路由 |
| TanStack Query | 5.90+ | 数据获取与缓存 |
| React | 19+ | 最新并发特性 |
| TypeScript | 5.9+ | 类型安全 |
🎨 样式与 UI
| 技术 | 版本 | 说明 |
|---|---|---|
| Tailwind CSS | v4 | 原子化 CSS |
| tw-animate-css | 1.4+ | Tailwind 动画扩展 |
| Radix UI | latest | 无障碍基础组件 |
| Base UI | 1.0+ | Radix 团队新一代组件 |
| Lucide React | latest | 图标库 |
| shadcn/ui | - | 组件模板 |
📦 状态与数据
| 技术 | 版本 | 说明 |
|---|---|---|
| TanStack Query | 5.90+ | 数据请求与缓存 |
| Zustand | 5+ | 轻量状态管理 |
| nuqs | 2.8+ | URL 状态同步 |
| Zod | v4 | Schema 校验与类型推导 |
🛠️ 工程化
| 技术 | 版本 | 说明 |
|---|---|---|
| Biome | 2.3.10 | Lint + Format |
| Vitest | latest | 单元测试 |
| Testing Library | latest | 组件测试 |
🌍 国际化与主题
| 技术 | 说明 |
|---|---|
| react-i18next + i18next | 组件级多语言支持 |
| shadcn/ui Vite Dark Mode | 基于 Context + CSS 变量的主题切换 |
✨ 增强能力
| 技术 | 说明 |
|---|---|
| sonner | Toast 通知 |
SSP Registry 能力引用
本栈推荐使用以下 Registry 能力:
| 类型 | 名称 | 说明 | 文档 |
|---|---|---|---|
| 🪝 Hook | use-cancelable-query | 可取消的 TanStack Query 封装 | 查看 |
| 📦 Item | make-api-request | 类型安全的 API 请求层 | 查看 |
| 📦 Item | zustand | Zustand 配置模板 | 查看 |
| 📦 Item | nuqs | URL 状态管理配置 | 查看 |
| 📦 Item | biome | Biome 规则配置 | 查看 |
| 📦 Item | agents-markdown | AI Coding 协作规范 | 查看 |
栈组成概览
| 能力 | 推荐工具 | 作用 |
|---|---|---|
| 框架 | Vite 7 + TanStack Start | 提供文件路由、Server Functions 与选择性 SSR |
| 数据管理 | TanStack Router + TanStack Query | 统一路由、数据加载与缓存策略 |
| 样式体系 | Tailwind CSS v4 + SSP Theme | 下载 ssp-style.json 后自动增量更新 src/App.css |
| UI 组件 | 符合 shadcn Registry 规范的能力(shadcn/ui、本 Registry、21st.dev 等) | 复用基础组件与 Block,提高 UI 交付效率 |
| 多主题 | shadcn/ui Vite Dark Mode | 基于 Context + CSS 变量的主题切换 |
| 国际化 | react-i18next | 在 Vite 环境下提供组件级与 hook 级的多语言支持 |
| 数据访问 | make-api-request + use-cancelable-query | 定义类型安全、具备缓存控制的数据访问层 |
| URL 状态 | nuqs | 类型安全的 URL 查询参数管理 |
| 状态管理 | zustand | 轻量的全局状态存储,与 React 组件友好 |
| 类型/校验 | zod | Schema 校验 + TypeScript 类型推导 |
| 动效 | motion(Framer Motion 官方包) | 控制页面与组件动效 |
| 质量保障 | @biomejs/biome | 统一 Linter 与 Formatter,保障代码质量 |
项目初始化与依赖
- 按照 TanStack Start 官方 Quick Start 使用 CLI 或示例仓库创建项目。
- Tailwind CSS v4 默认通过
src/App.css维护主题与 Design Token,无需额外配置文件。 - 包管理工具依团队规范选择(Bun、pnpm、npm 均可),建议通过 Registry CLI 下载 SSP 能力,避免在文档中硬编码包版本。
样式与主题整合(SSP Theme)
- 在本站点下载
ssp-style.json,执行后将自动增量更新src/App.css。 - 多主题(包括暗色模式)参考 shadcn/ui Vite Dark Mode 实现:
- 创建
src/components/theme-provider.tsx,基于 Context 管理主题状态 - 通过
document.documentElement.classList切换darkclass - 将
ssp-style.json中的变量映射到:root与.dark
- 创建
UI 与 Block 组件实践
- 通过 shadcn/ui CLI 或其他兼容 Registry 下载基础组件,在
src/components/ui目录维护。 - 从 SSP UI Registry 引入增强组件或 Block(例如
gh-stargazers-button),用于骨架屏、营销组件等场景。 - 建议建立
src/components/registry.ts聚合导出常用组件,方便在路由页面与可重用模块中引用。
国际化(react-i18next)
- 参考
react-i18next官方文档 配置语言资源与 Provider。 - 在 TanStack Start 中,可在
src/app.tsx或src/routes/__root.tsx中包裹I18nextProvider,并使用useTranslationHook 提供文案。 - 建议将语言资源存放于
src/locales/<language>.json,并结合 Loader 在路由加载时注入。
数据访问层:make-api-request + use-cancelable-query
这两个 Registry 能力组合与 TanStack Query 的 Loader API 一起构成数据访问层。详细文档参阅 Make API Request Item。
import { makeApiRequest } from "@/registry/ssp/item/make-api-request/base"
import { ProductApi } from "@/registry/ssp/item/make-api-request/example/index.template"
export const fetchProducts = () => makeApiRequest(ProductApi.getProducts)import { createFileRoute } from "@tanstack/react-router"
import { useQuery } from "@tanstack/react-query"
import { useCancelableQuery } from "@/hook/use-cancelable-query"
import { fetchProducts } from "@/lib/http/product"
export const Route = createFileRoute("/products")({
component: ProductsPage,
})
function ProductsPage() {
const [queryOptions, controller] = useCancelableQuery({
key: ["products"],
fetcher: fetchProducts,
})
const { data, isLoading, error } = useQuery(queryOptions)
if (isLoading) return <p>Loading…</p>
if (error) return <p>Failed to load</p>
return (
<div>
<button onClick={() => controller.abort()}>Cancel request</button>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
)
}
use-cancelable-query可统一错误处理、重试策略与缓存键格式,建议在项目中建立标准化的 Query factory。
状态管理与动效
zustand:参阅 Zustand Item 文档,在src/stores中维护轻量状态,与 TanStack Router 结合可实现全局会话、偏好设置等逻辑。motion:在src/components/motion中封装动画组件,配合 TanStack Router 的TransitionAPI 实现页面切换效果。
Schema 校验与类型推导
- 使用
zod定义表单、接口与配置 Schema,与make-api-request结合自动推导类型。 - 在 Loader 与 Action 中引入 Schema 校验,可减少客户端与服务端代码重复。
工程化与质量保障
- 使用
@biomejs/biome统一 Lint 与格式化,参阅 Biome Item 文档。 - 建议在
package.json中配置bun run lint、bun run format,并在 Vitepre-commit或 CI/CD 流程中执行。 - Vite 插件生态可按需引入(如
vite-tsconfig-paths、@tanstack/router-vite-plugin),保持项目结构清晰。
部署与运维建议
- 托管平台:TanStack Start 支持在 Netlify、Vercel、Cloudflare Workers 等平台部署。参考官方部署指南配置构建命令与输出目录,确保 SSR/Edge 功能与缓存策略正常工作。
- 容器化(Dockerize):自托管时可使用多阶段 Dockerfile 打包 Vite/TanStack Start 应用,流程与 Next.js 类似:
- 使用 Node 18+/Bun 基础镜像;
- 安装依赖并执行
vite build或tanstack dev build; - 将输出的
.output(或自定义 SSR 产物)复制到运行镜像; - 配置运行脚本为
node .output/server/index.mjs或bun .output/server/index.mjs。
具体 Dockerfile 可结合团队模板或 Registry Item 扩展,本节留作后续补充实际示例。
Checklist
- 已应用 SSP Theme 并验证明暗主题切换。
- 常用 UI、Block、Hook、Item 能力已通过 Registry 引入。
-
make-api-request+use-cancelable-query建立标准数据访问层。 - 国际化策略(如
react-i18next)已完成配置并通过官方示例验证。 - Biome 与 Zod 校验纳入 CI/CD 流程。
- Page Transition、重点交互已使用
motion定义动效。 - 目标平台部署验证通过,并评估容器化部署方案。
完成以上步骤后,即可获得一套高性能、可扩展、同时具备主题与国际化能力的 Vite + TanStack 工程栈,为各类客户端驱动的业务场景提供扎实基座。