pnpm搭建monorepo

303 阅读2分钟

1.创建项目

全局安装 pnpm:npm i -g pnpm
新建一个目录并通过pnpm初始化:

mkdir pnpm-monorepo 
cd pnpm-monorepo 
pnpm init 
mkdir packages

2.配置 monorepo

如果要启动pnpm的workspace功能,需要在项目的根目录中创建 pnpm-workspace.yaml工作区配置文件,在配置文件中指定工作空间的目录。

packages: 
  - 'packages/*'

packages是一个路径的数组,用来指定包含工作区包的目录。这段代码的意思就是将 packages 目录下所有的目录都当作单独的包进行管理。对于工作区内的包,pnpm会自动对其依赖进行管理

3.package.json配置

(1)需要删除package.json文件中的 main、test两个字段 image.png (2)增加"private": true,

4.添加子项目

mkdir packages/project-a
cd packages/project-a
pnpm init -y

5.添加依赖

三种添加依赖的命令

1)安装工作区的全局依赖pnpm install lodash -w
注:如果是只需要在开发环境需要,则为:-wD。
根目录下安装lodash和子项目路径下安装依赖lodash,是否有区别

2)某个package安装局部依赖
子项目路径下:pnpm add pkgname
根项目路径下需执行子项目:pnpm --filter 子项目名 add 包名
问题1: 每个子项目中添加不同的依赖,依赖是否会提升(不会,因为pnpm的依赖查找树是严格嵌套层级的,不是扁平化)
问题2: 每个子项目添加相同依赖版本不同(局部项目下各自安装各自的依赖)

3)添加项目依赖-子项目之间相互依赖如何处理
进入项目A目录:pnpm install package-B

添加依赖后的引用情况和node_module变化,我们分别实验在monorepo工作空间下

case1: 仅仅给项目A安装lodash,项目B是否可以引用 答:不可以,严格遵循依赖树结构查找

case2: 给项目A安装lodash、给项目B安装lodash(同名同版本),是否会提升到全局。答:不会,只是各自的子项目的node_module中都存在lodash。

case3: 全局安装dayjs,项目A\B是否都可以引用。答:可以,但是dayjs是在根目录的node_module中,子项目的node_module树中不存在dayjs。如下图所示:
image.png case4: 子项目之间存在依赖关系:
项目B会出现在项目A的node_module中 image.png

此外,根目录下的node_module中会存在.pnpm的目录,存放的是全局依赖和所有的局部依赖对应的软连接。