(Next.js、NestJS、ts-rest、Drizzle、Biome)非常现代化,适合构建全栈应用。在 monorepo 架构下,合理组织这些技术有助于提高开发效率、模块复用性和部署一致性。
下面是一个推荐的架构设计方案,结合你提到的每项技术:
- 包管理器:
pnpm
(强烈推荐,支持 workspace) - 构建/任务管理:
Turbo
(用于缓存和并行化构建/测试/部署任务) - 代码规范/格式化:
Biome
(替代 ESLint + Prettier + lint-staged) - 类型检查:TypeScript 全项目统一
- 环境变量管理:使用
dotenv
和env-schema
my-monorepo/
├── apps/ # 应用目录
│ ├── web/ # 前端应用 (Next.js + ts-rest)
│ └── server/ # 后端服务 (NestJS + ts-rest + Drizzle)
├── packages/ # 共享包目录
│ ├── contracts/ # ts-rest 契约定义
│ └── db/ # Drizzle schema + db client
├── .vscode/ # VS Code 配置
├── .turbo/ # Turborepo 缓存
├── node_modules/ # 依赖目录
├── .gitignore # Git 忽略配置
├── biome.json # Biome 配置
├── package.json # 项目配置
├── pnpm-lock.yaml # pnpm 锁文件
├── pnpm-workspace.yaml # pnpm 工作空间配置
├── tsconfig.json # TypeScript 配置
└── turbo.json # Turborepo 配置
- 使用 App Router + React Server Component(可选)
- 集成 ts-rest client 来调用服务端 API(可在 SSR 和客户端使用)
- 使用
@my-monorepo/contracts
中定义的契约 - 使用
@my-monorepo/ui
的组件
- 核心 API 服务
- 使用
ts-rest
作为 API 契约和实现 - 数据访问用
Drizzle ORM
(支持 PostgreSQL、SQLite、MySQL 等) - 环境变量管理建议统一用
dotenv
+ 校验库(如zod
)
- 存放 ts-rest 的 API 契约定义
- 前后端共享类型定义和 API 接口规范
- 定义 Drizzle 的 schema 与 migrations
- 输出
db
实例供 NestJS 使用
- Tailwind + Radix UI / shadcn/ui(可选)
- 提供跨项目可复用组件
- tsconfig、biome config、turbo config、lint-staged、prettier(如果还用)、jest、vitest 等共享配置
-
ts-rest:
- 在
packages/api
中定义 API 契约 - 在 NestJS 中使用
@ts-rest/nest
实现 API - 在 Next.js 中使用
@ts-rest/core
和@ts-rest/react-query
进行客户端调用 - 确保前后端类型一致性
- 在
-
Drizzle:
- schema 和
migrate
脚本集中在packages/db
,NestJS 中引入即可 drizzle-kit
配置文件推荐放在packages/db/drizzle.config.ts
- schema 和
-
Biome:
- 配置放在
packages/config/biome.json
,在各个项目里使用extends
- 也可以加
format
,lint
脚本统一执行
- 配置放在
# 安装所有依赖
pnpm install
# 安装特定包的依赖
pnpm --filter <package-name> install
# 启动所有项目开发服务
pnpm dev
# 启动特定项目开发服务
pnpm --filter <package-name> dev
# 启动 web 应用开发服务
pnpm --filter web dev
# 启动 server 开发服务
pnpm --filter server dev
# 构建所有项目
pnpm build
# 构建特定项目
pnpm --filter <package-name> build
# 构建 web 应用
pnpm --filter web build
# 构建 server
pnpm --filter server build
# 运行所有项目的 lint
pnpm lint
# 运行所有项目的格式化
pnpm format
# 运行所有项目的测试
pnpm test
# 运行特定项目的测试
pnpm --filter <package-name> test
# 添加依赖到特定包
pnpm --filter <package-name> add <package>
# 添加开发依赖到特定包
pnpm --filter <package-name> add -D <package>
# 移除特定包的依赖
pnpm --filter <package-name> remove <package>
# 1. 安装依赖
pnpm install
# 2. 启动开发服务(web + server)
pnpm dev
# 3. 构建生产版本
pnpm build
# 4. 运行测试
pnpm test
- 每个
apps
下放.env.local
- 用
env-schema
+zod
(或@nestjs/config
自带的 validation)进行校验 - 可以定义统一的环境变量类型定义在
packages/config/env.ts