npm 和 pnpm 看起来只是两个安装依赖的命令差异,但本质上是两种完全不同的依赖管理思路。npm 代表的是“传统 node_modules 模式”,而 pnpm 是在现代工程化背景下,对依赖存储和安装机制的一次重构。


一、从日常使用说起

在前端开发中,最常见的两个命令就是:

npm install
pnpm install

一开始我也只是把它们当作“不同工具”,直到项目变多、依赖变重之后,才逐渐感受到它们在底层设计上的差异,这种差异不仅影响安装速度,也会影响团队协作体验。


二、npm 是什么

npm 是 Node.js 官方默认的包管理工具,安装 Node.js 后通常就已经自带了。常见用法比如:

npm install
npm run dev
npm install axios

它之所以成为默认方案,主要是因为官方维护、使用人数最多、生态最成熟、几乎所有项目都兼容,而且上手成本很低。从历史角度看,它几乎贯穿了整个前端工程化的发展过程。


三、pnpm 是什么

pnpm 是近几年发展非常快的一种新一代包管理工具,常见用法如下:

pnpm install
pnpm dev
pnpm add axios

我在实际使用之后的直观感受是,它并不是简单“优化了 npm”,而是针对大型项目和团队协作中暴露的问题,重新设计了一套依赖管理方式。它强调更快、更省空间、更严格,以及更适合 Monorepo 和团队开发。


四、问题的根源:npm 的时代背景

很多人会直接说 pnpm 更快,但如果只停留在“快”这一层,其实理解还不够。

npm 诞生时,前端项目规模和现在完全不同。当时通常是单仓库、依赖较少、构建流程简单,甚至很多项目是单人开发。在这种背景下,node_modules 的设计是完全够用的。

但现在的项目往往是多项目并行、依赖数量庞大、团队协作复杂,甚至会采用 Monorepo 管理多个应用或组件库。这时,传统的依赖管理方式就开始出现问题。


五、核心差异:依赖存储方式

这一点是我后来才真正理解 pnpm 优势的关键。

使用 npm 时,每个项目都会有自己独立的 node_modules,比如:

project-a/node_modules
project-b/node_modules
project-c/node_modules

即使这些项目依赖完全相同的包(例如 vue、axios、lodash),也会在每个项目中各存一份。这会带来几个直接问题:磁盘空间浪费、node_modules 体积膨胀、安装时间变长。

而 pnpm 的做法完全不同,它会把所有依赖统一存放在一个全局仓库中,然后通过硬链接的方式“映射”到各个项目:

~/.pnpm-store
 ├─ vue
 ├─ axios
 └─ lodash

项目中的 node_modules 本质上只是引用这些内容,而不是复制一份。这带来的结果是:同一依赖只存一份,多项目共享缓存,安装速度更快,同时磁盘占用明显降低。

所以 pnpm 快,并不是因为命令执行更快,而是因为它改变了底层结构。


六、为什么团队更倾向 pnpm

在个人项目中,这种差异可能不算特别明显,但在团队协作中就会变得很关键。

首先是依赖更严格。npm 的扁平化结构有时会“隐式引入依赖”,例如项目中没有声明 lodash,但因为其他依赖间接带入,代码依然能运行。这种情况在换环境或 CI 构建时容易出问题。

pnpm 则更严格,未声明的依赖通常无法直接使用,这会强制项目保持依赖清晰,从而减少“我这能跑你那不行”的情况。

其次是 CI/CD 更稳定。在自动化部署中,依赖一致性非常重要,pnpm 的安装结果更可预测,更适合在 Jenkins、GitHub Actions 或 GitLab CI 等环境中使用。

再就是多项目管理能力。pnpm 自带 workspace 支持,对于同时维护多个应用或组件库的项目非常友好,例如:

pnpm install
pnpm -r build
pnpm --filter admin dev

这也是很多 Monorepo 项目选择 pnpm 的重要原因。


七、速度差异

在实际体验中,pnpm 的优势主要体现在重复操作和多项目场景。

首次安装时,两者差距可能不算特别大,但在重复安装、多项目切换、CI 环境中,pnpm 的缓存机制和共享依赖会明显提升速度。这种差异在项目数量多时会被不断放大。


八、为什么 pnpm 这几年才流行

我认为这并不是一个“突然变好的工具”,而是前端开发模式发生了变化。

过去更多是单项目开发,而现在越来越多项目采用多应用架构、组件库复用、微前端、Monorepo 等模式,这些都对依赖管理提出了更高要求。pnpm 正好契合这种趋势,所以逐渐成为主流选择。


九、npm 还需要吗

npm 依然有很强的存在价值。它是官方默认工具,生态最完整,教程资源最多,对新手也最友好,同时在老项目中兼容性最好。

所以它不会被替代,更合理的理解是:npm 更偏通用基础方案,而 pnpm 更偏工程化进阶方案。


最后总结

从更本质的角度来看,我更倾向这样理解这两个工具的区别:npm 解决的是“如何安装依赖”,而 pnpm 解决的是“在现代工程环境下,如何更高效、更稳定地管理依赖”。

这也是为什么在项目规模和复杂度不断提升的今天,pnpm 会越来越受到团队青睐的原因。