发布时间:2024-01-24 18:30
此文是对 pnpm
的重要贡献者Zoltan Kochan的几篇关于pnpm、monorepo文章的翻译概括,可能存在不准确的部分。
pnpm
是一种更高效快捷的包管理器。 Zoltan Kochan认为,yarn
只是对npm
做了些微改进,提升了速度、增加了一些属性,但并没有改变npm
的扁平化依赖结构。而扁平化结构自带以下问题:
node_modules
目录;Zoltan Kochan对pnpm
的研发投入了更多的时间,pnpm
取得了成功,囊括了yarn
所有增加的属性:
pnpm
将所有已下载包的压缩文件保存在本地镜像仓库,以实现离线使用,只需要配置--offline
参数;pnpm
速度大概是npm
和yarn
的1/3左右。因为yarn
需要拷贝包,而 pnpm
只需要把包存在全局仓库,任何需要的地方指向它即可。npm@2的node_modules
npm@3的node_modules
为了解决npm@2的问题,npm@3采用扁平化的路径:
pnpm的node_modules
为了解决npm@2的问题,pnpm把依赖包展平,但是通过软链接把每个包自身的依赖组合在一起。
node
遇到软链接会直接执行其真实路径,所以require('foo')
将会执行路径node_modules/.registry.npmjs.org/foo/1.0.0/node_modules/foo/index.js
的文件 而不是node_modules/foo/index.js
;require('foo')
,因为它位于node_modules文件夹下。我的理解:
pnpm i a
的时候不用加--save
它也会自动帮你在package.json中注册a。Zoltan Kochan也曾极力反对monorepo,他认为npm已经拥有为数众多的、颇受欢迎的贡献者,这些人在npm上拥有成百上千个包,每个包都有各自独立的仓库。但是所有人都做的事就是对的吗?不尽然。
实践中,他觉得大多数包都不需要有自己独立的仓库,因为很多情况下一经发布,就不再更新。而且大部分包也无人问津,没那么多人要往你仓库里提代码。而使用同一个仓库,则减少了引用和更新管理的频率,方便迁移。
可以使用pnpm的递归命令来安装所有依赖pnpm recursive install
。
Why should we use pnpm?
It is OK to keep random things in a single monorepo
pnpm's strictness helps to avoid silly bugs
作者:欧石楠
链接:https://www.jianshu.com/p/e1b1d46ca169
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
备补: pnpm 优点:
1、效率更高
2、更小的空间占用(同一版本的包只会下载一次)
3、安全,与yarn一样,不会出现像npm那样的意外错误