发布于 2024 年 10 月 21 日,星期一
Monorepo架构允许将多个相关项目放在同一个代码仓库中,而Pnpm则通过其独特的依赖管理机制,解决了传统包管理器在Monorepo环境中可能遇到的依赖冗余和性能问题。博客内容可能涵盖了如何配置和使用Pnpm在Monorepo中进行依赖管理,以及这种组合如何帮助开发者更高效地组织和维护大型前端项目。
回归单体管理:它允许在一个代码仓库中管理多个项目,组件或服务,提供更好的代码共享和重用性。
优点:
缺点
为什么组件库项目会选用 Monorepo 模式?
# 安装
npm i pnpm -g
# 检验是否安装成功
pnpm -v
pnpm init
pnpm i
7. 暴露公用方法,创建 common 文件夹及 index.ts
8. 在 common 文件夹中运行 pnpm init 初始化
pnpm init
export const hello = () => {
console.log("hello");
};
pnpm -F main-project add common
pnpm -F main-project dev
#安装软件包及其依赖的任何软件包 如果workspace有配置会优先从workspace安装
pnpm add <pkg>
#安装项目所有依赖
pnpm install
#更新软件包的最新版本
pnpm update
#移除项目依赖
pnpm remove
#运行脚本
pnpm run
#创建一个 package.json 文件
pnpm init
#以一个树形结构输出所有的已安装package的版本及其依赖
pnpm list
// 为 a 包安装 lodash
pnpm --filter a i -S lodash // 生产依赖
pnpm --filter a i -D lodash // 开发依赖
// 指定 a 模块依赖于 b 模块
pnpm --filter a i -S b
{
"name": "a",
// ...
"dependencies": {
"b": "workspace:^"
}
}
{
"dependencies": {
"a": "workspace:*", // 固定版本依赖,被转换成 x.x.x
"b": "workspace:~", // minor 版本依赖,将被转换成 ~x.x.x
"c": "workspace:^" // major 版本依赖,将被转换成 ^x.x.x
}
}
root
├── packages
| └── portal
| ├── ... // 项目文件和目录
root
├── packages
| └── portal
| ├── index.html
| ├── package-lock.json
| ├── package.json
| ├── public
| ├── README.md
| ├── src
| ├── tsconfig.app.json
| ├── tsconfig.json
| ├── tsconfig.node.json
| └── vite.config.ts
packages:
- packages/**
{
"name": "root",
"private": true
}
改造前后目录结构对比
验证本地启动和构建命令
执行 pnpm i 安装依赖
执行 pnpm -F portal dev 本地启动
执行 pnpm -F portal build 项目构建
如果以上命令都正常,说明本次 Monorepo 改造成功!
{
"name": "root",
"private": true,
+ "scripts": {
+ "dev": "pnpm -F portal dev",
+ "build": "pnpm -F portal build",
+ "preview": "pnpm -F portal preview"
+ }
}
执行 pnpm i 安装依赖
执行 pnpm -F admin dev 本地启动 admin 新项目
执行 pnpm -F admin build 构建 admin 新项目
两个项目同时启动了。
实现了 portal / admin 两个项目分开启动、分开构建、分开管理依赖、分开测试,互不影响,而且 portal 是 Vue 技术栈,admin 是 React 技术栈。
可以在根目录的 package.json scripts 增加对应的便捷命令。
{
"name": "root",
"private": true,
"scripts": {
"dev": "pnpm -F portal dev",
"build": "pnpm -F portal build",
"preview": "pnpm -F portal preview",
+ "dev:admin": "pnpm -F portal dev",
+ "build:admin": "pnpm -F portal build",
+ "preview:admin": "pnpm -F portal preview"
}
}
root
├── package.json
├── packages
| ├── admin
| | ├── eslint.config.js
| | ├── index.html
| | ├── package.json
| | ├── public
| | ├── README.md
| | ├── src
| | ├── tsconfig.app.json
| | ├── tsconfig.json
| | ├── tsconfig.node.json
| | └── vite.config.ts
| └── portal
| ├── index.html
| ├── package-lock.json
| ├── package.json
| ├── public
| ├── README.md
| ├── src
| ├── tsconfig.app.json
| ├── tsconfig.json
| ├── tsconfig.node.json
| └── vite.config.ts
├── pnpm-lock.yaml
└── pnpm-workspace.yaml
pnpm -F portal i common
pnpm -F admin i common