pnpm、npm 、yarn 区别

41 阅读2分钟

pnpm的全称是“performant npm”,意为“高性能的npm”

pnpm没有采用扁平化的node_modules结构,而是创建了一个嵌套的、有严格依赖关系的结构

1、彻底告别“幽灵依赖” 在pnpm的node_modules里,你只会看到你在package.json明确声明的那些依赖。

2、磁盘空间的“终极节约” pnpm会在你的电脑上创建一个“全局内容可寻址存储区”(content-addressable store),通常在用户主目录下的.pnpm-store里。

你电脑上所有项目的所有依赖,都只会在这个全局仓库里,实实在在地只存一份

3、极速的安装体验 因为大部分依赖都是通过“链接”的方式实现的,而不是“复制”,所以pnpm在安装依赖时,大大减少了磁盘I/O操作

npm /yarn

1. “幽灵依赖”(Phantom Dependencies)

最不能忍受的一个问题

举个例子:你的项目只安装了A包(npm install A)。但是A包自己依赖了B包。因为是扁平化结构,B包也会被提升到node_modules的根目录。

结果就是,你在你的代码里,明明没有在package.json里声明过B,但你却可以import B from 'B',而且代码还能正常运行!

这就是“幽灵依赖”。它像一个幽灵,让你的项目依赖关系变得混乱不堪。万一有一天,A包升级了,不再依赖B了,你的项目就会在某个意想不到的地方突然崩溃,而你甚至都不知道B是从哪来的。

2. 磁盘空间的巨大浪费

如果你电脑上有10个项目,这10个项目都依赖了lodash,那么在npm/yarn的模式下,你的磁盘上就会实实在在地存着10份一模一样的lodash代码。

电脑的存储空间就这么被日积月累地消耗掉了。

3. 安装速度的瓶颈

虽然npm和yarn都有缓存机制,但在安装依赖时,它们仍然需要做大量的I/O操作,去复制、移动那些文件。当项目越来越大,node_modules动辄上G的时候,那个安装速度,真的让人等到心焦

pnpm用一种更先进、更合理的机制,解决了过去遗留下的种种问题。它带来的不仅仅是速度的提升,更是一种对“依赖关系纯净性”和“工程化严谨性”的保障