Skip to content

cycleccc/next-nest-monorepo

Repository files navigation

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

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


🏗️ Monorepo 架构建议

✅ 使用工具

  • 包管理器pnpm(强烈推荐,支持 workspace)
  • 构建/任务管理Turbo(用于缓存和并行化构建/测试/部署任务)
  • 代码规范/格式化Biome(替代 ESLint + Prettier + lint-staged)
  • 类型检查:TypeScript 全项目统一
  • 环境变量管理:使用 dotenvenv-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 构建任务配置示意

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

📝 开发命令说明

安装依赖

# 安装所有依赖
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

About

next、nest、ts-rest、drizzle

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published