Npm 和 Pnpm 的区别

2025 年 3 月 1 日 | 阅读 4 分钟

JavaScriptNode.js 开发中,包管理对于提高处理依赖关系的生产力至关重要。多年来出现了许多包管理器,但目前最流行的是 npm(Node Package Manager)。然而,随着时间的推移和生态系统的发展,开发者开始寻找更高效的解决方案,这催生了 pnpm。本文旨在详细介绍 npm 和 pnpm,明确并描述所有功能和差异,最终进行比较。

什么是 Npm?

Npm 是与 Node.js 默认集成的包管理器,用于在项目中安装库或模块,设置项目的其他包,以及在开发者之间共享包。它于 2010 年发布,并迅速成为 JavaScript 的首选包管理器,至今仍然如此。

Npm 的主要特性

Npm 的一些特性如下:

集中式注册表

  • Npm 通过调用连接到 npm 注册表,这是一个包含开源软件包的庞大目录。

简单的 CLI 命令

  • Npm 遵循简洁的 CLI 来安装和管理包。

依赖管理

  • 它将安装直接依赖项和传递依赖项所需的所有包。

脚本

  • Npm 允许执行脚本,即我们可以为包开发的脚本。使用 JSON 文件可以自动化一个或多个任务,例如测试、构建甚至部署应用程序。

什么是 Pnpm?

pnpm 的名字代表 Performant npm(高性能 npm),它是一个 npm 的兼容者,速度快且能有效地节省磁盘空间,旨在成为一个即插即用的替代品。因此,依赖 pnpm 在于其不同的依赖管理模式,这种模式可以节省大量磁盘空间并显著缩短安装时间。

Pnpm 的主要特性

Pnpm 的一些特性如下:

严格的依赖解析

  • pnpm 比 Node.js 更严格,最终会强制采用一种模块解析算法,该算法提供软件包,使它们在版本控制方面不会相互干扰。

快速安装

  • pnpm 也以不同的方式关注包管理,这导致安装时间大大缩短,尤其是在单体仓库环境中。

兼容性

  • pnpm 与 npm 及其几乎所有特性都兼容,pnpm 可以作为即插即用的替代品,只需少量更改。

Npm 中安装软件包的语法

Pnpm 中安装软件包的语法

Npm 中删除软件包的语法

Pnpm 中删除软件包的语法

Npm 与 Pnpm 的主要区别

在 Node.js 中,NpmPnpm 之间存在一些区别。一些主要区别如下:

功能/方面Npm (Node 包管理器)Pnpm (高性能 npm)
安装方法在 node_modules 目录中本地安装软件包。全局安装软件包到内容可寻址的存储中,并将其链接到项目。
兼容性与所有 Node.js 项目和工具兼容。与 npm 项目基本兼容,但在某些边缘情况或工具上可能会遇到问题。
全局包管理独立于项目特定软件包来安装全局软件包。在共享存储中安装全局软件包,节省磁盘空间。
依赖管理扁平化依赖关系,可能导致版本冲突。严格隔离依赖关系,防止冲突。
安装速度通常较慢,尤其是在大型项目上。由于高效的存储和链接,速度更快。
包锁定它使用 package-lock.json 来锁定依赖版本。它使用 pnpm-lock 和 yaml,这对于 pnpm 独特的链接策略来说更详细且优化。
磁盘空间使用由于依赖关系重复,它会消耗更多磁盘空间。通过全局存储依赖关系并链接它们来节省磁盘空间。
CLI 命令它简单且广为人知,命令如 npm install、npm run 等。与 npm 类似,但有一些为 pnpm 功能量身定制的额外命令(例如 pnpm add、pnpm recursive)。