在 Nest.js 中设置 MonoRepo
Source: Dev.to
Monorepos 正在成为管理多个服务或共享库的后端团队的默认选择。Nest.js 在 monorepo 环境中表现出色,甚至内置了对其的支持。
在本文中,你将学习:
- 什么是 monorepo 以及它为何有用
- Nest.js 如何支持 monorepo
- 如何一步步搭建 Nest.js monorepo
- 可扩展的清晰文件夹结构
- 常见技巧与陷阱
没有废话。只提供让它运行所需的内容。
什么是 Monorepo?
Monorepo 是一个包含多个应用程序和共享库的单一仓库。
与拥有多个独立仓库不同:
api-repo/
auth-repo/
shared-utils-repo/
你可以使用统一布局的单一仓库:
backend/
├─ apps/
└─ libs/
团队使用 Monorepo 的原因
- 共享代码集中存放
- 跨项目重构更容易
- 只需一套工具和配置
- 依赖管理更简洁
对于拥有微服务、后台工作者或共享模块的 Nest.js 项目,Monorepo 是一种自然的选择。
Nest.js 单体仓库支持(内置)
Nest.js 通过 Nest CLI 提供 一流的单体仓库支持。您无需 Nx 或 Turborepo 即可开始——CLI 可以在同一工作区生成应用和库。
优势
- 简单
- 官方
- 易于维护
Monorepo 文件夹结构
我们将构建的结构:
nest-monorepo/
├─ apps/
│ ├─ api/
│ └─ auth/
├─ libs/
│ ├─ common/
│ └─ database/
├─ nest-cli.json
├─ tsconfig.base.json
└─ package.json
含义
apps/→ 可运行的 Nest.js 应用程序libs/→ 共享的模块、服务、DTO、辅助函数common/→ 过滤器、守卫、拦截器database/→ Prisma、TypeORM 或其他数据库逻辑
架构图

图片示意: 一个包含 apps/api、apps/auth 以及共享的 libs/common 与 libs/database 的单仓库框,箭头指示共享使用关系。
步骤详解
步骤 1:创建一个新的 Nest.js 工作区
确保已安装 Nest CLI:
npm i -g @nestjs/cli
创建一个 monorepo 工作区:
nest new nest-monorepo
在设置过程中选择 npm、yarn 或 pnpm,并可选地启用 ESLint 和 Prettier。Nest 会自动创建一个已准备好用于工作区的项目。
步骤 2:启用 Monorepo 模式
编辑 nest-cli.json 以启用 monorepo 模式:
{
"monorepo": true,
"root": "apps/api",
"sourceRoot": "apps/api/src",
"projects": {}
}
将 "monorepo": true 设置为 true,告诉 Nest 该仓库将包含多个应用和库。
步骤 3:创建你的第一个应用
生成 api 应用:
nest generate app api
生成 auth 应用:
nest generate app auth
生成的 apps/ 文件夹结构:
apps/
├─ api/
└─ auth/
每个应用都是一个完全独立的 Nest.js 项目。
步骤 4:创建共享库
创建一个通用库:
nest generate library common
创建一个数据库库:
nest generate library database
生成的 libs/ 文件夹结构:
libs/
├─ common/
└─ database/
每个库都包含自己的模块、tsconfig,以及干净的导入路径。
步骤 5:在应用中导入库
示例:在 API 应用中使用 CommonModule。
// apps/api/src/app.module.ts
import { Module } from '@nestjs/common';
import { CommonModule } from '@app/common';
@Module({
imports: [CommonModule],
})
export class AppModule {}
@app/* 别名由 Nest 自动配置,避免了相对路径的混乱。
步骤 6:独立运行应用
运行 API 应用:
nest start api
运行 Auth 应用:
nest start auth
每个应用:
- 拥有自己的端口
- 拥有自己的环境变量
- 可以单独部署
步骤 7:生产环境构建
构建指定的应用:
nest build api
构建所有应用:
nest build
编译后的输出会放入 dist/ 文件夹,按应用名称分目录。
Nest.js 单体仓库的最佳实践
- 保持库体积小 – 每个库应只解决一个问题;避免把所有内容都放进
common。 - 避免循环依赖 – 如果两个应用相互依赖,请重新思考设计。
- 共享 DTO 和接口 – 防止重复并保持 API 一致。
- 统一数据库库 – 将数据库逻辑集中管理,而不是复制连接代码。
何时不应使用单体仓库
单体仓库可能不适合以下情况:
- 只有一个小型服务
- 团队完全独立且拥有各自的路线图
- 部署流水线差异巨大
对于大多数不断扩展的后端系统而言,单体仓库仍值得投入。
最后思考
- 易于设置
- 官方支持
- 可扩展,适用于多个服务和共享代码
试一试,享受简化的开发体验!
附加支持
接下来是什么?
- 在此基础上添加 Nx
- 将其转换为 Medium‑style blog
- 创建一个 real architecture diagram image
- 添加 Docker + monorepo deployment
只要告诉我你需要什么即可。