全部文章
2026-08-25FlareStarter Teamengineeringtanstacknextjscomparison

TanStack Start vs Next.js——选一个还没到 1.0 的框架

Next.js 是安全的默认选项,而且会一直是。这篇讲的是选 TanStack Start 的诚实理由——来自一个在它还是 RC 阶段就拿它跑生产的团队。

先把足以一票否决的事实放在最前面:TanStack Start 目前仍是 release candidate,不是 1.0。 如果你的组织需要一个有稳定性承诺的框架,看到这里就可以停了,去用 Next.js——那是正确的决定,下面的内容都推翻不了它。

FlareStarter Pro 还是拿 TanStack Start 在 Cloudflare Workers 上跑了生产。这篇讲为什么,以及代价是什么。

架构差异:router-first

Next.js 是一个内含路由器的框架。TanStack Start 是一个长出了框架的路由器。

这听着像营销话术,但它改变你写的代码。在 Start 里,路由本身就是契约——它声明自己的 params、loader、search-param schema 和中间件,而 TypeScript 全都知道。跳转时 search param 拼错,构建就失败。在组件里读 params.id 是有类型的,因为路由这么声明了,不是因为你手动断言了。

Next.js 的 App Router 是打补丁式地获得类型安全的:路由生成类型、searchParams 是个需要你自己校验的松散 record、server action 在边界处有类型但跨导航没有。它比过去好得多,但仍然不是一回事。

如果你的应用主要是表单、筛选和表格——多数 B2B SaaS 都是——这个差别每天都会遇到。search param 状态是仪表盘类 bug 的高发地,而 Start 把它变成了带类型的 API,而不是一袋字符串。

看得见的服务端边界

Start 的 server function 是显式的:

const getPosts = createServerFn({ method: 'GET' })
  .validator((locale: string) => locale)
  .handler(async ({ data: locale }) => {
    const { blog } = await import('collections/server')
    return selectBlogList(blog, locale)
  })

边界就是一次带校验器的函数调用。你能看见网络跳数发生在哪,而且校验器不是可选的。

React Server Components 押的是相反的注:边界是模块图在构建期的属性,心智模型是「这个组件默认在服务端渲染,除非另有声明」。跑通的时候很优雅,跑不通的时候,你在排查为什么某个组件把客户端依赖拖进了服务端 bundle。

两种做法都不算错。但显式边界在凌晨两点明显更容易推理,也更容易测试——server function 就是个函数。

各自部署到哪

这是我们选 Start 的现实理由。

Start 用同一套路由定义,直接以 Cloudflare Workers、Node、Netlify、Railway 为目标。跑在 Workers 上不是兼容层,而是一个构建目标。

Next.js 跑在 Workers 上是可行的——通过 OpenNext——但你是在把一个为 Node 形态运行时设计的框架,适配到 isolate 形态的运行时上。那是个有真实用户的正经项目,但它终究是你和平台之间的一层翻译。

如果你已经定了 Cloudflare,Start 直接消除了「这个特性在我们运行时上能用吗」这一整类问题。而如果你部署在 Vercel,这个优势完全消失,Next.js 更紧密的平台集成反而成了更好的交换。

Next.js 有而 Start 没有的

差距很宽,得如实说:

  • 稳定性。 1.0 对 RC。API 还可能变。
  • 生态。 每篇教程、每个招聘池、每个第三方集成都默认 Next.js。撞上冷门问题时,多半已经有人写过那条 Stack Overflow 回答。
  • 图片优化、ISR、middleware 是开箱即用的特性,而不是你自己拼的东西。
  • React Server Components 作为一等公民、被重金投入的模型。
  • 好招人。 「我们用 Next.js」比「我们用 TanStack Start」容易招人。

最后这条不是技术论据,却经常是决定性的。忽视它是要付代价的。

我们实际付出的代价

拿 RC 跑生产有真实成本:

  • 升级需要盯着。 RC 版本偶尔改 API。我们读 changelog,而不是无脑 npm update。
  • 答案更少。 有些问题得读源码排查,而不是搜到一篇博客。
  • 插件面更小。 在 Next.js 上你会直接装的东西,有时得自己写。

换回来的:在构建期就抓住路由 bug 的类型安全、和部署目标精确匹配的运行时、以及代码与 Cloudflare 之间没有适配器。

对一个起步模板来说——整个产品就是交到别人手上的那份代码——这笔交换划算。对一个赶着截止日期交业务功能的团队来说,往往不划算。

这些情况选 Next.js

  • 你需要稳定的 1.0 框架,背后有厂商级投入。
  • 你部署在 Vercel。
  • 你要 React 世界里最大的生态和招聘池。
  • 你的团队已经会它。熟悉度就是真实的速度。

这些情况选 TanStack Start

  • 你部署在 Cloudflare Workers,想要原生目标而不是适配器。
  • 你的应用路由密集,端到端类型安全每天都在回本。
  • 比起 RSC 模型,你更喜欢显式的服务端边界。
  • 你扛得住 RC 的变动——你会读 changelog、会锁版本。

结论

对多数团队,Next.js 是正确的默认选项,而且会继续是。TanStack Start 是一次押注:更好的类型、显式的边界、和 Cloudflare 精确匹配的运行时,代价是你现在还拿不到的成熟度。

想清楚自己押的是什么,押注就没问题。别因为它更新就选 Start。要选它,得是因为你的部署目标和路由复杂度让这笔交换明显划算——然后盯紧 changelog。


FlareStarter Pro 是一套基于 TanStack Start + Cloudflare Workers 的生产级 SaaS 起步模板——组织、座位计费、计量 credits、API key、审计日志,全部接好。

TanStack Start 的发布状态截至 2026-08-23 准确,也是这篇里最可能变化的一条。