选择合适的包管理器:npm、Yarn 和 pnpm 的比较

更新日期: 2025-10-26 阅读: 26 标签: pnpm

前端开发中,包管理器是必不可少的工具。从最早的 npm 到后来的 Yarn,再到现在流行的 pnpm,每个工具都在前一个基础上做出了改进。


npm:最初的包管理器

npm 是 Node.js 自带的包管理器,也是使用最广泛的一个。

npm 的发展历程:

最初 npm 使用嵌套方式安装依赖。比如项目依赖包 A,包 A 又依赖包 B,那么 node_modules 结构会是:

node_modules/
├── A/
│   └── node_modules/
│       └── B/

这种设计会导致依赖层级很深,在 Windows 系统中可能超出文件路径长度限制,出现各种问题。

为了解决这个问题,npm 从 v3 版本开始改用扁平化结构。它会尽量把依赖提升到顶层:

node_modules/
├── A/
└── B/

但扁平化也带来了新问题。不同环境下安装顺序可能不同,导致 node_modules 结构不一致。有时候同一个包在开发环境能运行,在生产环境却报错。

npm 通过 package-lock.json 文件来解决这个问题。这个文件会记录每个依赖包的确切版本和下载地址,确保每次安装结果一致。


Yarn:性能和可靠性的提升

Facebook 推出的 Yarn 主要改进了 npm 的两个方面:安装速度和确定性。

Yarn 的主要优势:

  1. 并行下载:Yarn 可以同时下载多个包,大大提升了安装速度

  2. 离线缓存:下载过的包会缓存起来,下次安装时直接使用缓存

  3. 确定性安装:yarn.lock 文件确保在不同环境中安装结果完全一致

  4. 更好的 monorepo 支持:Yarn Workspaces 可以管理多个相关项目的依赖

Yarn 的这些改进让它在发布后很快获得了开发者的认可。


pnpm:革命性的存储方式

pnpm 采用了全新的思路来解决包管理的问题。

pnpm 的核心原理:

pnpm 使用内容寻址存储。所有下载的包都保存在全局存储中(通常是 ~/.pnpm-store)。每个文件根据内容生成哈希值,相同内容的文件只存储一份。

安装依赖时,pnpm 不会复制文件,而是创建硬链接指向全局存储。然后在项目内通过符号链接组织依赖关系。

这种设计带来了巨大优势:

  • 节省磁盘空间:多个项目共享相同的依赖文件

  • 安装速度快:硬链接创建比文件复制快很多

  • 依赖隔离严格:每个包只能访问自己声明的依赖

pnpm 的依赖隔离:

在 npm 和 Yarn 中,由于扁平化结构,有时会意外使用到没有在 package.json 中声明的依赖。这被称为"幽灵依赖"。

pnpm 通过严格的依赖隔离彻底解决了这个问题。如果代码中使用了未声明的包,在 pnpm 中会直接报错。


三种工具对比

特性npmYarnpnpm
安装速度一般较快最快
磁盘占用较高中等很低
依赖锁定package-lock.jsonyarn.lockpnpm-lock.yaml
幽灵依赖存在存在完全避免
Monorepo 支持基础很好很好
存储机制扁平化扁平化内容寻址

实际使用建议

新项目选择

对于新项目,推荐使用 pnpm。它的优势很明显:

  • 节省大量磁盘空间(通常能减少 70% 以上)

  • 安装速度更快

  • 严格的依赖管理避免潜在问题

大型项目考虑

如果是大型 monorepo 项目,pnpm 和 Yarn 都是不错的选择。它们都提供了完善的 workspace 功能。

迁移到 pnpm

从 npm 或 Yarn 迁移到 pnpm 很简单:

  1. 删除 node_modules 和现有的锁文件(package-lock.json 或 yarn.lock)

  2. 安装 pnpm:npm install -g pnpm

  3. 运行 pnpm install

  4. 测试项目功能是否正常

迁移示例:

# 删除现有依赖
rm -rf node_modules
rm package-lock.json  # 或者 rm yarn.lock

# 安装 pnpm
npm install -g pnpm

# 安装依赖
pnpm install

# 运行测试
pnpm test


常用命令对比

功能npmYarnpnpm
安装依赖npm installyarnpnpm install
添加依赖npm install packageyarn add packagepnpm add package
删除依赖npm uninstall packageyarn remove packagepnpm remove package
运行脚本npm run scriptyarn run scriptpnpm run script

在 CI/CD 环境中的优势

在持续集成环境中,pnpm 的优势更加明显:

  1. 缓存效率高:相同的依赖在不同项目中共享缓存

  2. 安装速度快:减少构建等待时间

  3. 稳定性好:严格的依赖管理减少环境差异问题


总结

npm 作为最早的包管理器,为整个生态奠定了基础。Yarn 在性能和确定性方面做出了重要改进。pnpm 通过创新的存储机制,在空间效率和安装速度上达到了新的高度。

选择哪个包管理器取决于具体需求:

  • 如果追求极致的空间效率和速度,选择 pnpm

  • 如果习惯现有工作流,Yarn 和 npm 也是可靠的选择

  • 对于大型 monorepo 项目,pnpm 和 Yarn 都值得考虑

理解这些工具的特点,能帮助我们在不同场景下做出合适的选择,提升开发效率。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/article/detial/13057

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!