深入浅出分析npm和pnpm的区别 : 深入浅出 npm & yarn & pnpm 包管理机制 - 知乎
npm的缺点
幽灵依赖
幽灵依赖是指在 package.json 中未定义的依赖,但项目中依然可以正确地被引用到。 比如A依赖了B, 所以安装A后,B会和A同级出现,所以项目中可以正常引用B,但package.json中却没有声明对B的依赖 幽灵依赖是由依赖的声明丢失造成的,如果某天某个版本的 A 依赖不再依赖 B 或者 B 的版本发生了变化,那么就会造成依赖缺失或兼容性问题。
依赖分身
如果是以下的依赖场景
-
A 和 D 依赖 B@1.0
-
C 和 E 依赖 B@2.0
那么B@1.0和AD同级,而C和E下会各安装一次B@2.0, 即B@2.0被重复安装
pnpm的优点
pnpm - performant npm,在 2017 年正式发布,定义为快速的,节省磁盘空间的包管理工具,开创了一套新的依赖管理机制,成为了包管理的后起之秀 与依赖提升和扁平化的 node_modules 不同,pnpm 引入了另一套依赖管理策略:内容寻址存储。 该策略会将包安装在pnpm系统的全局 store 中,依赖的每个版本只会在系统中安装一次。 在引用项目 node_modules 的依赖时,会通过硬链接与符号链接在全局 store 中找到这个文件。为了实现此过程,node_modules 下会多出 .pnpm 目录