An open API service indexing awesome lists of open source software.

https://github.com/cycleccc/next-nest-monorepo

next、nest、ts-rest、drizzle
https://github.com/cycleccc/next-nest-monorepo

authjs drizzle-orm nestjs next15 shadn-ui ts-rest

Last synced: 10 months ago
JSON representation

next、nest、ts-rest、drizzle

Awesome Lists containing this project

README

          

(Next.js、NestJS、ts-rest、Drizzle、Biome)非常现代化,适合构建全栈应用。在 monorepo 架构下,合理组织这些技术有助于提高开发效率、模块复用性和部署一致性。

下面是一个推荐的架构设计方案,结合你提到的每项技术:

---

## 🏗️ 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 配置
```

---

## 🔧 各部分说明与整合方式

### `apps/web` (Next.js)

* 使用 **App Router** + React Server Component(可选)
* 集成 **ts-rest client** 来调用服务端 API(可在 SSR 和客户端使用)
* 使用 `@my-monorepo/contracts` 中定义的契约
* 使用 `@my-monorepo/ui` 的组件

### `apps/server` (NestJS)

* 核心 API 服务
* 使用 `ts-rest` 作为 API 契约和实现
* 数据访问用 `Drizzle ORM`(支持 PostgreSQL、SQLite、MySQL 等)
* 环境变量管理建议统一用 `dotenv` + 校验库(如 `zod`)

### `packages/contracts`

* 存放 ts-rest 的 API 契约定义
* 前后端共享类型定义和 API 接口规范

### `packages/db`

* 定义 Drizzle 的 schema 与 migrations
* 输出 `db` 实例供 NestJS 使用

### `packages/ui`

* Tailwind + Radix UI / shadcn/ui(可选)
* 提供跨项目可复用组件

### `packages/config`

* 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`

* **Biome**:

* 配置放在 `packages/config/biome.json`,在各个项目里使用 `extends`
* 也可以加 `format`, `lint` 脚本统一执行

---

## 🚀 Turbo 构建任务配置示意

```jsonc
// turbo.json
{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**"]
},
"dev": {
"cache": false
},
"lint": {
"outputs": []
},
"format": {
"outputs": []
},
"test": {
"outputs": ["coverage/**"]
}
}
}
```

## 📝 开发命令说明

### 安装依赖
```bash
# 安装所有依赖
pnpm install

# 安装特定包的依赖
pnpm --filter install
```

### 开发命令
```bash
# 启动所有项目开发服务
pnpm dev

# 启动特定项目开发服务
pnpm --filter dev

# 启动 web 应用开发服务
pnpm --filter web dev

# 启动 server 开发服务
pnpm --filter server dev
```

### 构建命令
```bash
# 构建所有项目
pnpm build

# 构建特定项目
pnpm --filter build

# 构建 web 应用
pnpm --filter web build

# 构建 server
pnpm --filter server build
```

### 代码质量
```bash
# 运行所有项目的 lint
pnpm lint

# 运行所有项目的格式化
pnpm format

# 运行所有项目的测试
pnpm test

# 运行特定项目的测试
pnpm --filter test
```

### 包管理
```bash
# 添加依赖到特定包
pnpm --filter add

# 添加开发依赖到特定包
pnpm --filter add -D

# 移除特定包的依赖
pnpm --filter remove
```

### 常用工作流
```bash
# 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`

---