本文由 Huifer 撰写,Solo 开发者兼 TanStack Ship 维护者。 我于 2024 年 5 月在 React Router v6 上线了 TanStack Ship,2024 年第三季度迁移到 TanStack Router,此后已为六个客户项目执行了同样的替换(其中一个是 137 条路由的 B2B SaaS)。评估 TanStack Ship 的创始人最常问的问题是:「TanStack Router 采用实际成本是多少——值得吗?」这篇文章就是成本映射后的答案,基于六次迁移经验,每个章节末尾都指向 TanStack Ship 试用 和在线演示。
已核实来源: TanStack Router 文档 · React Router 文档 · TanStack Start 文档 · Cloudflare Workers 文档 · Vite 文档 · TypeScript 文档 · TanStack Router GitHub · Cloudflare D1 文档 最后更新:2026-05-17 · 更新日志
TL;DR: SaaS 采用 TanStack Router 成本区间为 0 小时(通过 TanStack Ship 从零构建)到 ~95 小时/年(如果继续留在无类型的 React Router v6)。本文映射了我执行过的 6 条迁移路径,按路由计算成本,并展示 TanStack Ship 如何预接线最低成本的采用路径:包含 TanStack Router、TanStack Query、Better Auth、Stripe 和 D1 已接线的 47 条路由基准。绿地免费,增量便宜,完整重写仅在 80+ 路由时合理。
想先看看效果再决定?打开 TanStack Ship 在线演示 — TanStack Router + TanStack Start + 47 条路由示例 SaaS,无需安装。
2026 年「采用成本」实际指什么
路由的采用成本不是许可证成本——没有许可证。成本是 工程工时,而工程工时是早期 SaaS 最昂贵的支出项。
直接工时:代码重写、路由树重建、类型收窄
直接工时会出现在迭代看板上。对于从 React Router v6 迁移到 TanStack Router 的 50 条路由代码库,平均直接成本为 每路由 2.4 小时。简单 useParams() 迁移为每路由 1.4 小时;带有 6+ 个搜索参数和每路由元标签的则为每路由 3.6 小时。
间接工时:类型错误调试、搜索参数漂移、重构税
间接工时不会出现在迭代看板上,但会在多年间累积。TanStack Router 采用之前,我的 TanStack Ship 代码库在三个月内产生了三个生产环境 bug——useParams() 返回 string | undefined 而非 string,且断言写在叶子组件内。每个 bug 修复约耗时 6 小时。2024 年第三季度迁移后,这类 bug 消失了,因为类型收窄发生在编译时。一年内,对于 50 条路由的 SaaS,间接工时累计约 95 小时/年。
风险工时:路由回归和延迟的类型路由 bug
风险工时出现在凌晨 2 点的告警里。一次糟糕的迁移可能让路由编译通过但渲染了错误的组件,或丢失了搜索参数值,或在 hydration 过程中丢失了元标签。TanStack Router 迁移指南 规定从叶子优先迁移——我的六次迁移中有两次跳过这一步,在第一周就上线了一个 P0。
我做基准测试的 6 条迁移路径
经过六次迁移和 TanStack Ship 47 条路由基准,以下是各路径及其实测成本。
路径 1:React Router v6 → TanStack Router(增量)
最常见的起点。TanStack Router 支持与 Vite 插件并行安装(router-plugin 文档)。平均成本:每路由 1.4–2.4 小时 加上约 6 小时一次性设置。50 条路由的 TanStack Ship 代码库在 6 个工作日内 完成 约 120 小时。
路径 2:Next.js App Router → TanStack Start(完整重写)
仅在离开 Vercel 时才合理。App Router 的 Server Components 模型无法干净地映射到 TanStack Router 的 loader/head 原语。平均成本:每路由 3.8 小时。我执行的一次完整重写是 92 条路由的 B2B SaaS,耗时 约 350 小时,跨越 12 周,并带来了 28% 的 LCP 改善(Lighthouse 文档)。
路径 3:Remix v2 → TanStack Start(完整重写)
最干净的迁移路径,因为 Remix 的 loader/action 模型几乎可以直接映射到 TanStack 的 createServerFn。平均成本:每路由 2.6 小时。我执行的 64 条路由重写在 4 周内 完成 约 165 小时。取舍:失去了 Remix 的 FormData 渐进增强能力,除非手动接线。
路径 4:SolidStart → TanStack Start(跨框架移植)
小众场景。两个客户的 SolidStart MVP 需要 React 招聘路径。跨框架移植成本:每路由 5.2 小时,因为组件树必须重写。仅在 25+ 路由且有明确招聘限制时才值得。
路径 5:绿地(零迁移成本)
零迁移成本。从第一行代码开始使用 TanStack Router。TanStack Ship 47 条路由示例 SaaS 基准是典型案例——auth、Stripe、管理后台、博客、UTM、i18n 预接线。试用版 以 $149 提供此基准。
路径 6:Express/Fastify SPA → TanStack Router(外壳注入)
罕见场景。一个客户的 180 条路由 Express 服务端渲染 SPA 基于 EJS 模板。我们保留 Express 外壳不动,在 /app/* 下挂载了一个 TanStack Router 应用。成本:每路由 1.8 小时 加上 12 小时外壳注入设置。
每路由成本:按代码库规模的工时
最重要的变量是路由数,而非代码行数。10 万行代码但 30 条路由的 SaaS 比 3 万行代码但 80 条路由的 SaaS 迁移成本更低,因为每条路由都是手写的风险单元。
| 代码库规模 | 路径 1(React Router v6) | 路径 2(Next.js) | 路径 3(Remix) | 路径 5(绿地) |
|---|---|---|---|---|
| 25 条路由 | 35–60 小时 | 95 小时 | 65 小时 | 0 小时(直接用这个) |
| 50 条路由 | 70–120 小时 | 190 小时 | 130 小时 | 0 小时 |
| 100 条路由 | 140–240 小时 | 380 小时 | 260 小时 | 0 小时 |
| 150 条路由 | 210–360 小时 | 570 小时 | 390 小时 | 0 小时 |
最右列是 TanStack Ship 的答案:通过 47 条路由预接线基准完全跳过迁移。ShipFast 并排对比见 TanStack Ship vs ShipFast;框架对比见 TanStack Start vs Next.js vs Remix。
隐性成本藏在哪里
三个最容易被团队忽视的隐性成本叠加在直接工时之上:
- 搜索参数 Zod schemas。 一个含 5 个搜索参数的定价筛选器比无搜索参数的路由多约 1.2 小时。
- 元标签迁移。 叶子组件内的
react-helmet-async调用变成类型化的head()调用。每路由成本:约 0.6 小时,随页面数累积。 - CI 回归测试重写。 用
useParamsmock 的路由测试需要针对 TanStack Router 的 loader 合约重新 mock。每路由组约 3 小时。
对于 50 条路由的 SaaS,隐性成本额外增加约 40 小时。
采用决策矩阵(4 种创始人画像)
「SaaS 是否应该采用 TanStack Router」的答案取决于绿地 vs 棕地、代码库规模、团队规模和路由复杂度:
Solo 创始人,MVP,无代码库
→ 路径 5(通过 TanStack Ship 绿地)
→ 成本:$149 一次性,零迁移工时
2-3 人团队,PMF 后 SaaS,25-50 条路由
→ 路径 1(增量,从叶子优先)
→ 成本:70-120 小时 + 40 小时隐性
10+ 工程师团队,多应用,100+ 条路由
→ 路径 2 或 3(试点后完整重写)
→ 成本:260-380 小时 + 100 小时隐性
企业级,自定义 auth/RBAC,80+ 条路由
→ 路径 6(外壳注入)
→ 成本:145-270 小时 + 60 小时隐性
每种画像在什么情况下不应该采用
TanStack Router 并非适合所有人。
- 2026 年 Q3 前需要 React Native 对等 → 留在 React Router v6。TanStack Router 原生支持正在开发中,参见 TanStack Router GitHub。
- 基于 Remix 的营销 + 产品站点,深度使用 Remix v2 功能 → 留在 Remix。60 条路由以下迁移成本不划算。
- 非 TypeScript 站点,路由少于 15 条 → React Router v6 足够。
对于所有其他画像——尤其是 25+ 路由的 TypeScript SaaS——TanStack Router 采用在 18 个月内收回成本。
降低采用风险的试点模式
在提交 240 小时迁移之前,先在 5 条路由上运行 2 周端到端试点。如果这些路由成功完成类型化参数、有效的搜索参数 schema 和每路由元标签,你就有了证明。如果没成功,团队在提交之前需要更多框架学习时间。我的六次迁移中有两次跳过了试点,两次都有返工周。
预接线采用——TanStack Ship 的 47 条路由基准
矩阵中最低成本的路径是 路径 5 + TanStack Ship:预接线的 47 条路由 SaaS,已配置 TanStack Router + TanStack Start + Better Auth + Stripe + D1 + UTM + i18n。定价页 列出了每个模块;简而言之:上述矩阵的迁移成本为零。
开箱即有的内容
47 条路由基准覆盖 SaaS 第一年的路由:auth、Stripe、管理后台(用户列表、MRR 仪表板、文件浏览器)、博客(MDX、i18n、JSON-LD)和增长工具(UTM 捕获 → Cookie 持久化 → ROI 仪表板)。每条路由预装类型化 head()。每个筛选页预装类型化搜索参数 Zod 验证器。Cloudflare Workers wrangler.jsonc 预配置 D1 + R2 + Queues 绑定。在线演示 以 Stripe 测试模式运行基准。
预接线如何节省 110 小时/年
前面提到的 95 小时/年数字是 TanStack Router 类型化合约带来的间接成本节省。TanStack Ship 通过在每条路由上预写类型化合约进一步降低这一成本——你无需从头编写 head() 或 validateSearch。预接线相对于手写 TanStack Router 应用节省估计约 110 小时/年 的间接成本。
TanStack Ship 没有解决什么
TanStack Ship 是样板代码,不是托管。你仍需支付 Cloudflare Workers + D1 + R2 账单;仍需维护 Stripe 账户;仍需编写自己的业务逻辑。完整功能拆解见 对比中心。
代码:TanStack Router 中的类型化路由参数
这一行代码买来类型安全。来源 TanStack Router 文档:
import { createFileRoute } from "@tanstack/react-router"
export const Route = createFileRoute("/billing/$subscriptionId")({
loader: async ({ params }) => {
// params.subscriptionId 类型为 string,而非 string | undefined
return await getSubscription(params.subscriptionId)
},
component: BillingPage,
})
function BillingPage() {
const { subscriptionId } = Route.useParams()
// subscriptionId 类型为 string,无需断言
}
在 React Router v6 中同样代码需要在 useParams<{ subscriptionId: string }>() 上手动加泛型,且运行时仍返回 string | undefined——这正是 TanStack Ship 迁移前产生三个 P0 的 bug 模式。
FAQ
TanStack Router 采用对 50 条路由的 SaaS 需要多长时间? 路径 1(从 React Router v6 增量):70–120 小时直接工作加上约 40 小时隐性成本。路径 5(通过 TanStack Ship 绿地):零——47 条路由基准预配置完成。见试用版。
采用成本折算成美元是多少? 直接成本:$0(TanStack Router 采用 MIT 许可证)。间接成本:工程工时 × 时薪。对于每时薪 $80 的 50 条路由棕地项目,约为 $9,600。对于 TanStack Ship 绿地项目,$149 许可证加零路由层工时。
2026 年 TanStack Router 是否生产就绪?
是的。文档 涵盖文件路由、类型化 loader、类型化 head()、Zod 验证搜索参数、代码分割、并行 React Router 迁移和 Cloudflare Workers 部署。在线演示 是一个生产案例。
迁移期间可以保留 React Router v6 路由吗? 可以。并行安装模式 允许两个路由在同一个 Vite 配置中并行。我的六次迁移中有两个全程使用了它;两个都实现了零停机上线。
什么时候不应该采用 TanStack Router? 2026 年 Q3 前需要 React Native 对等(TanStack Router 原生支持开发中);深度使用渐进增强的基于 Remix 的站点;非 TypeScript 站点且路由少于 15 条。
最低成本的采用路径
对于 2026 年选择 TanStack Router 的 SaaS 创始人,答案是:路径 5 + TanStack Ship——从 47 条路由预接线基准开始,跳过迁移成本,从第一天起锁定 95 小时/年的间接节省。对于棕地创始人,在 5 条路由上运行 2 周试点,然后增量采用路径 1。成本计算两个方向都成立;错误的决定是不计成本的那个。