Tanstack Start + Cloudflare 部署指南

2026-05-07

我是一个 Next.js 的爱好者,我的很多项目包括本博客都是基于 Next.js 开发的。在开发 Next.js 过程中我觉得主要有两点让我不满意:

基于这些原因我决定研究更轻量级的框架,它就是 Tanstack Start。它是基于 @tanstack/react-routerVite 之上的全栈框架,他轻量、执行模型明确、可以部署在任何云服务平台上。

由此我选择的核心基础框架和方案就是:

下面我就一步步从 0 到 1 来分享一下我是怎么实现的,其中包括本地开发环境,Pre 环境 和 Prod 环境的部署上线

目标受众

这篇博客是为有过全栈开发经验的同学准备的,如果你完全不具备全栈开发经验也可以跟着一步一步操作,这也是一个学习过程。

开发前的准备

在开发前你需要准备一个 Cloudflare 账号备用,后期需要部署时的授权。

我还需要介绍一下 Better-T-Stack 它是一个用于创建项目基础结构的一个 CLI 工具,可以为我们提供一个良好的目录结构。接下来我们就使用它来初始化一个项目吧。

初始化项目

首先运行命令 pnpm create better-t-stack@latest 初始化一个项目,接下来有一个选项。我的选择是:

  Enter your project name or path (relative to current directory)
  happy-tanstack-cf

  Select project type
  Web

  Choose web
  TanStack Start

  Select backend
  Self (Fullstack)

  Select database
  SQLite

  Select ORM
  Drizzle

  Select API type
  None

  Select authentication provider
  Better-Auth

  Select payments provider
  None

  Select addons
  Biome, Husky

  Include examples
  none

  Select sqlite setup option
  Cloudflare D1

  Initialize git repository?
  No

  Choose package manager
  pnpm

  Install dependencies?
  No

当上面代码执行完毕以后,你会得到这样一个目录结构:

.
├── apps
│   └── web           # 应用主程序
│       ├── public    # 公共资源
│       └── src
│           ├── components
│           ├── functions   # API 函数
│           ├── lib
│           ├── middleware  # 中间件
│           └── routes      # 页面和 API 路由
│               └── api
└── packages
    ├── auth    # Better Auth 登录模块
    │   └── src
    ├── config  # 项目基础配置
    ├── db      # 数据库模块
    │   └── src
    │       └── schema
    ├── env     # 环境变量模块
    │   └── src
    ├── infra   # 基础设置模块
    └── ui      # 基于 Shadcn 组件的 UI 模块
        └── src
            ├── components
            ├── hooks
            ├── lib
            └── styles

这里值得一提的是 infra 模块,它是一个基于 Alchemy 框架的将基础设施抽象成代码的框架。所有的 Cloudflare 资源创建和释放都将是通过代码自动化来完成,期间不需要我们手动操作。

运行本地开发环境

现在运行命令 pnpm i 去安装我们的项目依赖文件。

执行 pnpm dev 启动本地开发环境,浏览器访问 http://localhost:3001 即可看到界面。

pnpm 追加日志

我开发中一般会运行 pnpm -reporter=append-only dev 让 CLI 的日志不折叠这样方便查看日志

看到这样的日志就证明我们的服务启动成功:

packages/infra dev:   VITE v8.0.11  ready in 3554 ms
packages/infra dev:  Local:   http://localhost:3001/
packages/infra dev:  Network: use --host to expose
packages/infra dev:  Debug:   http://localhost:3001/__debug
packages/infra dev: [updating]  web Updating Resource...
packages/infra dev: [updated]   web Updated Resource
packages/infra dev: Web    -> http://localhost:3001/

Alchemy 模拟环境

启动服务后我们可以在根目录看到 .alchemy 文件夹,这是 Alchemy 为我们的模拟环境,它包含了我们的基础设施资源。

.alchemy
└── miniflare
  └── v3
      ├── cache
      │   └── miniflare-CacheObject
      ├── d1
      │   └── miniflare-D1DatabaseObject
      ├── do
      └── workflows

它主要是会为我们模拟一个本地的 SQLite 数据库。