pnpm和monorepo架构
pnpm
pnpm是一个更快更小的软件包管理器,一般用于node_modules的相关包的安装,是对npm的改进。他可以在下载软件包之前先对依赖进行解析,然后对相同的包进行硬链接到你的项目中,避免了重复安装。
pnpm 和npm
使用 npm 时,依赖每次被不同的项目使用,都会重复安装一次。 而在使用 pnpm 时,依赖会被存储在内容可寻址的存储中,所以:
- 如果你用到了某依赖项的不同版本,只会将不同版本间有差异的文件添加到仓库。 例如,如果某个包有 100 个文件,而它的新版本只改变了其中 1 个文件。那么 pnpm update 时只会向存储中额外添加 1 个新文件,而不会因为单个改变克隆整个依赖。
- 所有文件都会存储在硬盘上的某一位置。 当软件包被被安装时,包里的文件会硬链接到这一位置,而不会占用额外的磁盘空间。 这允许你跨项目地共享同一版本的依赖。
因此,你在磁盘上节省了大量空间,这与项目和依赖项的数量成正比,并且安装速度要快得多!
环境配置
pnpm在使用时需要像npm一样进行环境配置之后才能进行包安装。对于环境配置不多赘述,可以根据教程完成详细配置https://blog.csdn.net/yimeng_Sama/article/details/143824121?fromshare=blogdetail&sharetype=blogdetail&sharerId=143824121&sharerefer=PC&sharesource=2302_80406801&sharefrom=from_link
常见命令
项目初始化与安装
pnpm init
作用:初始化一个新的 package.json 文件,会引导你输入项目的基本信息,如名称、版本、描述等。
示例:在项目根目录下运行 pnpm init,按照提示输入相关信息即可完成初始化。
pnpm install 或 pnpm i
作用:安装 package.json 文件中指定的所有依赖项。如果项目中没有 node_modules 目录,会创建该目录并安装所有依赖;如果已经存在,会检查依赖版本并更新。
示例:在项目根目录下运行 pnpm install 安装所有依赖。
pnpm install 或 pnpm i
作用:安装指定的包,并将其添加到 package.json 的 dependencies 中。
示例:pnpm install lodash 会安装 lodash 包并更新 package.json。
pnpm install --save-dev 或 pnpm i -D
作用:安装指定的包,并将其添加到 package.json 的 devDependencies 中,通常用于开发环境依赖。
示例:pnpm install jest --save-dev 会安装 jest 作为开发依赖。
依赖管理
pnpm update 或 pnpm up
作用:更新 package.json 中指定的所有依赖项到最新版本,但不会超过 package.json 中指定的版本范围。
示例:pnpm update 会更新所有依赖;pnpm update lodash 会更新 lodash 到最新兼容版本。
pnpm remove 或 pnpm rm
作用:移除指定的包,并从 package.json 中删除相应的依赖项。
示例:pnpm remove lodash 会移除 lodash 包及其依赖信息。
pnpm list 或 pnpm ls
作用:列出当前项目中安装的所有依赖项及其版本信息。
示例:pnpm list 会显示所有依赖;pnpm list --depth=0 只显示顶级依赖。
脚本运行
pnpm run
作用:运行 package.json 中 scripts 字段定义的脚本。
示例:如果 package.json 中有 “scripts”: {“start”: “node index.js”},则 pnpm run start 会执行 node index.js 命令。
工作区相关(适用于多包项目)
pnpm --filter
作用:在指定的工作区包中执行命令。
示例:pnpm --filter my-package install 会在 my-package 工作区包中安装依赖。
其他
pnpm why
作用:显示为什么安装了某个包,即列出依赖该包的其他包。
示例:pnpm why lodash 会显示哪些包依赖了 lodash。
pnpm cache clean
作用:清理 pnpm 的本地缓存。
示例:运行 pnpm cache clean 可以释放磁盘空间。
monorepo架构
单一仓库(Monorepo)架构,可以理解为:利用单一仓库来管理多个packages的一种策略或手段;与其相对的是多仓库(Multirepo)架构
Monorepo 目录中除了会有公共的package.json依赖以外,在每个子包下面,也会有其特有的package.json依赖。
兄弟模块之间可以通过模块 package.json 定义的 name 相互引用,相当于本地的node包与远程拉下来的包用法相同,保证模块之间的独立性。
monorepo目录结构
monorepo-demo
├── packages
│ ├─ module1
│ │ ├─ src # 模块 1 的源码
│ │ ├─ node_modules # 模块 1 的 node_modules
│ │ └─ package.json # 仅模块1 的依赖
│ └─ module2
│ ├─ src # 模块 2 的源码
│ └─ package.json # 仅模块2 的依赖
├── .eslintrc # 配置文件,对整个项目生效
├── node_modules # 所有子包公共的 node_modules
└── package.json # 所有子包公共的依赖