在 Nest.js 中设置 MonoRepo

发布: (2026年1月17日 GMT+8 12:14)
6 min read
原文: Dev.to

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 或其他数据库逻辑

架构图

Nest.js Monorepo Architecture

图片示意: 一个包含 apps/apiapps/auth 以及共享的 libs/commonlibs/database 的单仓库框,箭头指示共享使用关系。

步骤详解

步骤 1:创建一个新的 Nest.js 工作区

确保已安装 Nest CLI:

npm i -g @nestjs/cli

创建一个 monorepo 工作区:

nest new nest-monorepo

在设置过程中选择 npmyarnpnpm,并可选地启用 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

只要告诉我你需要什么即可。

Back to Blog

相关文章

阅读更多 »