和其他 JS 包管理工具相比,PNPM 以高效快速的依赖包安装作为最大亮点,使用软链接的方式进行文件管理环保而高效。

不过这并非最吸引我的点,毕竟在依赖变更并不频繁的情况下安装速度不是痛点。

在我的项目开发中,需要维护一系列粒度大小不一的功能库,数十个仓库分开存放,模块间常有依赖关系,维护起来非常心累。

monorepo

yarn、npm 同样支持 monorepo,通过 workspace 的方式,轻松适用于应用项目。

伴随应用项目的开发,常会衍生出一些基础库(如适用于该应用的 SDK),这些库需要发布到公开或私有的中心仓库中;yarn、npm 并不能优雅地支持该场景

pnpm - monorepo

pnpm 也通过 workspace 的方式支持 monorepo,与 yarn 不同的是 pnpm 更加严格,默认情况下它创建了一个非平铺的 node_modules,因此代码无法访问任意包

它需要使用方显式地在 dependencies 中做出类似 "foo": "workspace:*" 声明

pnpm - publish

在包进行 publish 之前,pnpm 会做两件事情

  1. pnpm 会将类似 "workspace:^1.0.0" 转换为 "^1.0.0"
  2. 将 package.json 中 publishConfig 的定义覆盖到一级字段定义中,maintypings 的改写对 ts 模块来说非常实用

pnpm - 批处理

1
2
# packages 下所有包执行 build 命令
pnpm --filter "./packages/**" build
1
2
# 所有尚未发布到中心仓库的最新版本包执行 publish
pnpm publish -r

pnpm - 其他关键命令 / 配置