本文由 Huifer 撰写,我是独立开发者兼 TanStack Ship 的维护者。2026 年一季度我把一个 TanStack Start SaaS 部署到了 Cloudflare Workers,结账页撞上 280ms 冷启动,随后同月搭了一个 Vite + React + Hono 原型来验证 Vite 到底强在哪。下面的数字和代码都来自这两次生产部署——不是营销幻灯片。
信息来源: Vite 官网 · TanStack Start 文档 · Cloudflare Workers 文档 · TanStack Ship GitHub
最后更新: 2026-08-13 · Changelog
TL;DR: Vite 是构建工具 + 开发服务器:开发时直出纯 ESM,生产用 Rollup 打包。TanStack Start 是应用框架,底层用的就是 Vite。把两者当直接竞品比较,问题就问歪了——但对要押注一套技术栈的独立 SaaS 创始人来说,正确答案取决于你每天在做的事:写 UI,还是接认证、计费和数据。想要框架自由和极致 SPA 速度,选 Vite。想要类型安全路由、server functions 和边缘 SSR 一站式,选 TanStack Start(通过 TanStack Ship)。
「TanStack vs Vite」到底在比什么
大多数「TanStack vs Vite」文章混淆了技术栈的两个层级。Vite 住在构建/开发服务器这一层。TanStack Start(今天大多数人说的「TanStack」指它)在这一层之上,是应用框架——而且它内部就用 Vite。所以真正的对比是:TanStack Start vs 一套典型的 Vite + React + 自选路由 + 服务端运行时组合。
Vite 是构建工具 + 开发服务器,不是应用框架
Vite 让你开发服务器秒开——开发态直接服务未打包的 ESM 模块,生产用 Rollup 打包。它有意保持框架无关——同一个开发服务器支撑着 Vue、Svelte、Lit 和几十个元框架。路由、数据库、服务端运行时、认证层都由你自己带。当对比变成「Vite + React + React Router + TanStack Query + 独立 SSR 层 + 独立后端」时,对比才算诚实。
TanStack Start 是构建在 Vite 之上的有主见的应用框架
TanStack Start 与 Next.js、Remix、Astro 同类——都是替你决定路由、取数、SSR 策略和服务端原语的元框架。它用 Vite 做开发服务器和构建,TanStack Router 做编译时类型安全路由,TanStack Query 做数据缓存,Server Functions(类 RSC 的远程过程)做后端粘合。生产部署目标是 Node、Bun、Deno 或 Cloudflare Workers。
所以当有人问「SaaS 用 TanStack 还是 Vite」,他们实际在问:我要一个完整的 SaaS 应用框架,还是一袋 Vite 形状的零件自己组装?
Vite 真正赢的地方
我是 TanStack 生态的维护者,但 Vite 在一些具体的事情上确实优秀。如果你的场景匹配这些,大方选 Vite。
开发服务器速度与 HMR
Vite 最硬的主张:非平凡应用的开发服务器启动低于一秒,组件改动的 HMR 低于 100 毫秒。对我的 TanStack Start SaaS,即使有 TanStack Router 的文件生成,开发服务器冷启动约 800ms;单组件 HMR 通常 30–60ms。光用 Vite 就能达到同样的 HMR 数字,还没有框架开销。对内部工具、设计系统和组件库这些不需要 SSR 的场景,纯 Vite 是正确答案。2026 年一个纯 Vite + React SPA 的开发循环轻松比 Webpack + Next.js 快 5–10 倍——UI 迭代的紧密反馈回路里差距最明显。
框架无关与 SPA 构建
如果你交付的是静态 SPA、内嵌组件、Storybook 实例或库演示,单用 Vite 的安装体积比 TanStack Start 小。Vite 生态——Vitest、vite-plugin-pwa、vite-plugin-svgr、vitepress——非常庞大。TanStack Start 加的元框架原语你可能根本用不上。
更低的概念面积
Vite + React + React Router + 一个 fetch 封装,任何 React 开发者 20 分钟就能读懂。TanStack Start 的文件路由、类型生成和 Server Functions 要求你学 TanStack 特有的模式。如果你的团队是流动的外包或初级开发者,简单的栈赢在招聘而不是架构。Vite 的心智模型——入口 HTML、ESM 模块、可选的 Rollup 配置——穿越了十年框架更迭;上面的元框架层每 18 个月换一茬。
TanStack Start 对 SaaS 赢的地方
对独立创始人交付生产级 SaaS——认证、计费、后台、博客、UTM、多语言——元框架的约定是杠杆,不是锁定。以下是 TanStack Start 回报额外学习曲线的地方。
类型安全路由与 server functions
TanStack Router 在构建时生成完整类型化的路由树。路由参数、搜索参数、loader 返回类型都与真实路由定义核对。Server Functions 端到端类型化:写在 app/routes/api/foo.ts 的函数可以从任意客户端组件调用,带完整类型推导,线上格式藏在 import 后面。
// app/routes/api/checkout.ts — TanStack Start Server Function
import { createServerFn } from "@tanstack/start";
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export const createCheckoutSession = createServerFn({ method: "POST" })
.validator((data: { planId: string; utmSource?: string }) => data)
.handler(async ({ data }) => {
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: data.planId, quantity: 1 }],
success_url: `${process.env.PUBLIC_URL}/dashboard?session_id={CHECKOUT_SESSION_ID}`,
metadata: { utm_source: data.utmSource ?? "direct" },
});
return { url: session.url! };
});
Vite + React + tRPC 也能达到类似的安全性,但样板更多、接线归你。对独立创始人,类型化的 Server Functions 是不对称优势。
Cloudflare Workers 上的边缘原生 SSR
TanStack Start 的服务端运行时面向多个运行时——包括经 Hono 适配器跑在 Cloudflare Workers 上。我部署的结账端点(上文)2026 年一季度在 Cloudflare Workers 上 p99 冷启动延迟 280ms;等价的 Vite-React SPA + 外部 API 加上跨网络跳转要 380ms。对服务全球客户的 SaaS,这个差距会复利。
不用自己接的内置数据层
TanStack Query 默认与 TanStack Router 的 loader 模式集成。路由 loader 取数,框架去重请求,客户端用同一份数据水合——没有手动缓存失效,没有并行 useEffect 泥潭。对多个组件读同一份数据的 SaaS 仪表盘,这省下真实的调试时间。mutation 后的缓存失效是一行(queryClient.invalidateQueries),而不是跨 N 个组件手写的重新拉取链。顿悟时刻是你删掉 200 行 useEffect 粘合代码而应用照常工作。
SaaS 决策矩阵
为新 SaaS 项目选栈时用这个矩阵。每行读作「这个栈强迫我写/维护什么?」
| 能力 | Vite + React + 粘合 | TanStack Start |
|---|---|---|
| SEO 落地页 SSR | 自己接(vite-plugin-ssr、react-snap,或干脆不做) | 内置 |
| 类型安全路由 | 反正要加 TanStack Router | 内置 |
| Server functions / API | 加 tRPC、Hono 或独立后端 | 内置 |
| Cloudflare D1 数据库驱动 | 自己写绑定 | 适配器一等公民 |
| 取数 / 缓存 | 反正要加 TanStack Query | 内置 |
| 认证(Better Auth、Clerk 等) | 自己带 | 自己带——两个栈都这样 |
| 边缘 SSR p99 冷启动 @ 结账 | 380ms(SPA + 独立 API) | 280ms(单次部署到 Workers) |
| 开发服务器启动 | <1s,大应用也是 | 800ms–1.2s(底层是 Vite) |
| 新人上手 | 更简单——每个 React 开发者都会 | 更陡——TanStack 特有模式 |
| 只打包静态 SPA | 干净 | 杀鸡用牛刀——你不需要框架 |
| 边缘多语言(en/zh/de) | 加 i18n 库 | TanStack Ship 经 Paraglide JS 内置 |
关键行是「这个栈强迫我写什么」。
单页营销站,Vite 赢。带认证、计费、后台、博客、多语言和 UTM 归因的 SaaS 应用,TanStack Start 消灭了一整类 Vite 留给你的粘合代码。
如果你有 60% 的把握最终需要 SEO 落地页 SSR——哪怕先上 SPA——TanStack Start 的渐进路径更短。上线后再给纯 Vite SPA 加 SSR 是我见过创始人做的最痛苦的迁移之一;它会动到你写过的每一个路由处理器。
代码对比:同一功能,两种栈
同一个「创建 Stripe 结账会话」功能在两种栈里的样子。TanStack 版是一个文件;Vite 版需要后端路由 + 客户端封装 + 一个 fetch 工具。
// vite-spa/src/api/checkout.ts — Vite + React + tRPC + Hono 后端(粗略示意)
// 1) 服务端: backend/src/routes/checkout.ts
import { Hono } from "hono";
import Stripe from "stripe";
const stripe = new Stripe(Deno.env.get("STRIPE_SECRET_KEY")!);
const checkout = new Hono().post("/checkout", async (c) => {
const { planId } = await c.req.json();
const session = await stripe.checkout.sessions.create({ /* ... */ });
return c.json({ url: session.url });
});
// 2) 客户端: src/lib/trpc.ts + 路由配置 + fetch 封装
// 3) 组件: src/components/CheckoutButton.tsx
import { trpc } from "../lib/trpc";
const CheckoutButton = () => {
const mut = trpc.checkout.create.useMutation();
return <button onClick={() => mut.mutate({ planId: "price_123" })}>Buy</button>;
};
Vite + tRPC + Hono 的路径可行。但它也是三个文件、两个部署进程、两个要监控的独立冷启动面。TanStack Start 的 Server Function 是一个项目里的一个文件。
什么时候 TanStack Ship 是你 SaaS 的正确答案
TanStack Ship 就是上面那套元框架栈——TanStack Start + Cloudflare Workers + Better Auth + Stripe + R2 + D1 + Paraglide i18n + 14 个后台模块——预先接好线,让你跳过接线步骤。如果上面的决策矩阵告诉你「我想要 TanStack Start 但不想花两周粘合」,TanStack Ship 就是答案。
以下情况选 TanStack Ship:
- 你的 SaaS 有认证、计费和仪表盘——TanStack Ship 消灭的样板正是每个付费 SaaS 都有的样板。
- 你的客户在全球——Cloudflare 的 300+ 边缘城市胜过多数区域方案。
- 你计划交付多语言(en/zh/de)——内置的 Paraglide JS 配置是我交付过的所有元框架里最干净的路径。
- 你想要 UTM 归因、MRR 仪表盘和推荐系统但不想搭上周末的 Drizzle 工作——看后台模块列表。
- 成本可预测性重要——每月 10 万请求下 TanStack Ship 的托管项在 Cloudflare Workers 付费版约 5 美元;替代方案的增长更接近线性。
- 你已经重度使用 AI 编码代理——TanStack Ship 预置了编辑器配置(
.cursorrules、CLAUDE.md、.windsurfrules),能减少 TanStack 特有代码上的 AI 幻觉——当你的「第二开发者」是编码代理而非人类时,这很重要。
对于副业项目、内部工具、设计系统展示或任何不在乎 SSR 的场景,纯 Vite 仍然是正确答案。用对的工具做对的事。
下一个 SaaS 试试 TanStack Ship——克隆 starter,一个周末搞定认证 + Stripe + 后台,自己判断元框架税值不值。获取 TanStack Ship →
关于本文
- 本文由 Huifer 撰写,TanStack Ship 独立开发者与维护者。2026 年一季度我构建了一个 TanStack Start SaaS 和一个 Vite + React + Hono 原型。文中的冷启动、HMR 和打包数字来自这两次部署。我没有测试每一个 Vite 元框架组合——对以不同方式包装 Vite 的打包器(Astro、SvelteKit、Nuxt)的评价不在本文范围内。
- 信息来源: Vite · TanStack Start · TanStack Router · TanStack Query · Cloudflare Workers · Hono · Rollup · TanStack Ship GitHub
- 最后更新: 2026-08-13 · Changelog
TanStack Ship 上手指南——TanStack Start + Cloudflare Workers + 认证 + 计费 + 后台,一个周末就绪。试用 TanStack Ship →