Next.js Monorepo — Turborepo
Turborepo 是 Vercel 出品的 Monorepo 管理工具,解决多项目/多包协作的场景。
什么时候需要 Monorepo
共享组件 + 共享工具 + 多个应用 时:
❌ 不用 Monorepo:
每个项目一个仓库 → 共享代码靠 npm 发版 → 改一个组件要发版+升级 N 个项目
✅ 用 Monorepo:
一个仓库管所有 → 共享代码直接 import → 改一个组件所有项目立刻生效项目结构
my-turborepo/
├── apps/
│ ├── web/ # Next.js 前台
│ │ └── package.json
│ └── admin/ # Next.js 后台
│ └── package.json
├── packages/
│ ├── ui/ # 共享 UI 组件
│ │ ├── src/Button.tsx
│ │ └── package.json
│ ├── database/ # 共享 Prisma schema
│ │ └── package.json
│ └── config-eslint/ # 共享 ESLint 配置
│ └── package.json
├── package.json # 根 package.json
└── turbo.json # Turborepo 配置初始化
bash
npx create-turbo@latestturbo.json — 任务编排
json
{
"tasks": {
"build": {
"dependsOn": ["^build"], // 先构建依赖包
"outputs": [".next/**", "dist/**"]
},
"dev": {
"persistent": true, // 持续运行
"cache": false
},
"lint": {
"dependsOn": ["^build"] // lint 之前确保依赖已构建
},
"test": {}
}
}共享包的 package.json
json
// packages/database/package.json
{
"name": "@myrepo/database",
"version": "0.0.0",
"main": "./src/index.ts",
"types": "./src/index.ts",
"exports": {
".": "./src/index.ts"
}
}ts
// packages/database/src/index.ts
import { PrismaClient } from '@prisma/client'
export const db = new PrismaClient()tsx
// apps/web/app/page.tsx → 直接引用共享包
import { db } from '@myrepo/database'
const posts = await db.post.findMany()三个核心命令
bash
turbo dev # 同时启动所有应用的 dev
turbo build # 并行构建 + 自动处理依赖顺序
turbo lint # 所有项目并行 lint缓存
bash
# 两次构建之间缓存中间产物
turbo build # 第一次:全量构建
turbo build # 第二次:命中缓存,秒级完成缓存 key = 源码 hash + 依赖 hash,在 CI 中通过
--cache-dir=.turbo共享。
内部包引用
json
// apps/web/package.json
{
"dependencies": {
"@myrepo/ui": "*", // 共享 UI
"@myrepo/database": "*" // 共享数据库
}
}* 表示 workspace 内部包,pnpm install 自动软链接到本地。
实际场景示例
你的 AI 面试官项目如果用 Monorepo:
apps/
web/ → Next.js 主站(你的 langgraph-server)
admin/ → 后台管理
packages/
ai/ → 共享 AI 调用逻辑(多模型路由)
ui/ → 共享组件(聊天界面、编辑器)
database/ → 共享 Prisma schema
auth/ → 共享鉴权逻辑