什么是monorepo
monorepo其实就是一个大包下面包含了许多子包,典型案例有:babel、vue3等知名项目。相对于传统的mutirepo项目,monorepo的优势在于:
- 统一管理
可以在外部添加公用包 - 多包间通信更简单
这一点在多包间有相互引用的场景下尤为重要
基于pnpm的monorepo模式
pnpm和npm、yarn都是包管理工具,不同的是 pnpm 使用了软链的模式,使包的体积更小,下载速度更快,并且 pnpm 支持 monorepo 方案。这样我们就不用再去找别的技术方案了,节省了调研的时间。
目录结构
monorepo的结构如下
├── packages
| ├── package1 // 包1
| | ├── package.json
| ├── package2 // 包2
| | ├── package.json
├── package.json
├── pnpm-workspace.yaml 配置文件
pnpm-workspace.yaml 配置文件
packages:
# 所有在 packages/ 子目录下的 package
- 'packages/**'
注意
包最好只使用 pnpm 进行管理,如果和 npm、yarn 进行混用,可以会出现一些兼容性问题。下面我们将 npm、yarn 进行禁用,方法是添加 preinstall npm hook 钩子,这个钩子会在安装模块前触发,检查该代码是否是使用 pnpm 运行,如果不是的话会推出并提示错误。
"scripts": {
"preinstall": "npx only-allow pnpm"
}
常用语法
- 如果一个包是子包都需要的,那么我们可以把这个包安装到主包
# -w 全局安装
pnpm i 包名 -S/-D -w
- 如果只想在某一个子包进行安装
# --filter 是用来指定子包
pnpm i 包名 -S/-D --filter 子包的名称
# 或者直接切换到子包的目录进行安装
pnpm i 包名 -S/-D
- 当一个子包需要引用另一个子包
# 通过这个命令,可以在子包2中引用子包1
pnpm i 子包1 --filter 子包2
网友评论