发布于 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 包安装 lodashpnpm --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 commonpnpm -F admin i common