为什么越来越多的公司要求使用 pnpm?

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

如果你最近加入一家新的技术团队,可能会发现他们强制要求使用一个叫做 pnpm 的工具来管理项目依赖,而不是我们熟悉的 npm 或 Yarn。这并非跟风,而是为了解决前端开发中长期存在的一些痛点。

要理解 pnpm 的好处,我们得先看看 npm 和 Yarn(特别是早期版本)到底存在什么问题。


npm 和 Yarn 的困境:笨重的 node_modules

npm 和 Yarn 采用了一种叫做“扁平化”的方式来管理 node_modules 文件夹。这虽然解决了更早版本的一些问题,但却带来了新的麻烦。

  1. 幽灵依赖
    这是最让人头疼的问题。举个例子,假设你安装了一个包叫 package-a,而 package-a 内部自己依赖了一个包叫 package-b。npm 或 Yarn 在安装时,为了减少嵌套深度,可能会把 package-b 也提升到你的项目 node_modules 根目录下。
    导致的结果是:你的项目代码里,即使没有在 package.json 中声明 package-b,你也可以直接 import from 'package-b' 并且不会报错。
    这就像一个隐形的陷阱。万一将来 package-a 升级了,不再依赖 package-b,你的项目就会突然崩溃,而且这种错误非常难排查。

  2. 巨大的磁盘空间浪费
    由于每个项目都把自己需要的依赖完整地下载到自己的 node_modules 里,如果你开发 10 个项目,都依赖了 lodash,那么你的硬盘上就会存在 10 份一模一样的 lodash 代码。这对于电脑存储空间是极大的浪费。

  3. 安装速度仍有瓶颈
    虽然它们都有缓存机制,但在安装过程中,仍然需要将成千上万个小文件从缓存复制到项目的 node_modules 目录里。当项目庞大时,这个 I/O 操作会非常耗时。


pnpm 的解决方案:更聪明的链接机制

pnpm(意思是 “performance npm”)采用了一种截然不同的、基于链接的方法,从根本上解决了上述问题。

  1. 彻底消灭“幽灵依赖”
    pnpm 创建的 node_modules 结构非常严格。只有你在 package.json 中明确声明的依赖,才会出现在 node_modules 的根目录下。所有其他的间接依赖,都被存放在一个名为 .pnpm 的虚拟存储目录中,并通过符号链接被访问。
    这意味着,你的代码绝对无法引用到未在 package.json 中声明的包。依赖关系变得清晰、可靠,从根源上杜绝了隐式依赖。

  2. 极大节省磁盘空间
    pnpm 在电脑上建立一个全局存储区(Store)。所有下载过的包都会被保存在这里。当不同项目需要同一个依赖包时,pnpm 会通过硬链接的方式,从全局存储区指向项目中的 node_modules,而不是重新复制一份文件。
    这样,即使你有一百个项目都依赖 lodash,它们在磁盘上也只占用一份 lodash 的空间。这对于同时维护多个项目的开发者来说,能节省出巨大的磁盘空间。

  3. 安装速度飞快
    因为大部分依赖包不需要复制,而是直接从全局存储创建链接,所以安装过程中的 I/O 操作大大减少。尤其是在第二次安装时,由于依赖已经存在于全局存储中,安装速度几乎是瞬间完成,比 npm 和 Yarn 快很多。


为什么公司要“强制”统一工具?

推动使用 pnpm 不仅仅是因为它技术更先进,更是工程规范和团队协作的需要。

如果一个团队里,有人用 npm,有人用 Yarn,还有人用 pnpm,会引发一系列问题:

  • 锁文件冲突:package-lock.json(npm)、yarn.lock(Yarn)和 pnpm-lock.yaml(pnpm)这三种锁文件格式互不兼容。如果它们被混用,会导致不同成员安装的依赖版本不一致,最终出现“在我电脑上好用,在你电脑上就报错”的经典问题。

  • 环境不一致:使用 npm 或 Yarn 的同事,可能会在代码中无意间使用“幽灵依赖”,而使用 pnpm 的同事因为严格的目录结构无法运行这段代码,造成协作上的困扰。

因此,统一包管理工具,是保证所有开发成员环境一致、项目稳定运行的基础。而 pnpm 凭借其更优秀的依赖管理模型,成为了当前最好的选择。所谓的“强制”,其实是团队为了提升整体效率和项目稳定性所做的必要决策。


如何开始使用 pnpm?

上手 pnpm 非常简单。你可以通过 npm 来安装它:

npm install -g pnpm

之后,你就可以用类似的命令来替代 npm 了:

  • pnpm install:安装项目依赖。

  • pnpm add <package-name>:添加一个依赖包。

  • pnpm remove <package-name>:移除一个依赖包。

  • pnpm run <script-name>:运行 package.json 中定义的脚本。


总结

从前端的 npm 到 Yarn,再到现在的 pnpm,包管理工具一直在演进。pnpm 通过更严谨的依赖隔离、出色的磁盘空间利用和更快的安装速度,为我们提供了一个更可靠的工程化基础。

改变旧习惯需要一点时间,但作为开发者和团队,选择一条更优的技术路径是值得的。如果你还没有尝试过 pnpm,建议在一个新项目或个人项目中体验一下。相信你用过之后,也会理解为什么那么多公司会选择它。

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

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

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