682 字
2 分钟
Monorepo学习
官方定义
Monorepo(Monolithic Repository)是一种代码管理策略: 将多个项目(packages / apps / libs)存放在同一个代码仓库中进行统一管理。
典型工具官方定义(来自 pnpm / workspace 概念):
workspace 允许你在一个仓库中管理多个 package,并通过本地依赖链接它们。
简单理解就是: 一个 repo = 多个项目(前端、后端、组件库等)
核心作用
1. 代码复用能力提升
多个项目可以直接引用:
packages/uipackages/utilsapps/webweb 可以直接依赖 ui 和 utils(不用发 npm)
2. 依赖统一管理
所有项目共享:
- node_modules(pnpm 会优化)
- 版本统一(避免版本地狱)
3. 原子提交(Atomic Commit)
一次提交可以同时修改:
- 后端 API
- 前端调用
- 类型定义
不会出现“版本不匹配”的问题
4. 提高开发体验
配合工具:
- pnpm workspace
- turborepo / nx
可以实现:
- 增量构建
- 缓存
- 并行执行
5. 适合中大型项目
比如:
- 微前端
- 组件库 + 业务项目
- AI 应用(AI-SaaS平台)
使用方法
目录结构(推荐)
my-monorepo/├── apps/│ └── web/├── packages/│ ├── ui/│ └── utils/├── package.json├── pnpm-workspace.yaml核心配置
1. 初始化项目
mkdir my-monorepocd my-monorepopnpm init2. 创建 workspace 配置
pnpm-workspace.yaml
packages: - "apps/*" - "packages/*"3. 创建子包
mkdir -p apps/webmkdir -p packages/utils4. 初始化子项目
cd apps/web && pnpm initcd ../../packages/utils && pnpm init5. 建立依赖关系(重点)
在 apps/web/package.json:
{ "name": "web", "dependencies": { "utils": "workspace:*" }}workspace:* 是关键!
6. 写一点代码
packages/utils/index.js
export function add(a, b) { return a + b;}apps/web/index.js
import { add } from "utils";
console.log(add(1, 2));7. 安装依赖
在根目录中:
pnpm installpnpm 会:
- 自动链接 utils
- 不会走 npm registry
8. 运行
node apps/web/index.js输出:
3注意事项
1. workspace:* 不是随便写的
只能用于:
- monorepo 内部依赖
不能发布到 npm(需要替换版本号)
2. node_modules 结构不同
pnpm 使用: 硬链接 + content-addressable storage
所以:
- node_modules 看起来“奇怪”是正常的
- 不要手动改
3. 依赖提升(hoisting)
pnpm 默认: 不完全扁平
可能出现:
找不到某些包解决:
pnpm add lodash -w4. 子包必须有 name
{ "name": "utils"}否则 workspace 无法识别
5. 适合但不简单
Monorepo 很强,但也带来复杂度:
- 构建系统复杂:所有项目一个仓库,构建起来麻烦,存在性能问题
- CI/CD 更复杂:所有项目共用代码库,依赖多、关联杂,CI不好精准判断哪些需要构建、部署,流水线配置和执行都会更麻烦。
- 权限管理困难:权限管理通常依赖代码托管平台(github,gitlab),粒度太粗. 例如: 程序员A->整个仓库,程序员B -> 整个仓库 如果有敏感业务模块,外包人员接受项目,什么都能看到.
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
