一、认识 pnpm
1. 什么是 pnpm?
pnpm 是一个用于管理 JavaScript 项目依赖的包管理工具。pnpm 的全称为 "Performant npm",它旨在提供更快速、更高效的依赖管理体验。相较于传统的 npm 和 Yarn,pnpm 采用了一种全新的依赖管理方式,通过共享依赖来减少磁盘占用,同时提供了快速的安装和更新速度。
pnpm 的核心特点包括:
- 空间共享:在安装依赖时将相同版本的库共享,从而减少磁盘占用。
- 快速安装:采用符号链接技术,使得安装依赖时速度更快。
- 并行安装:支持依赖并行安装,提升安装速度。
- 高效更新:能够通过软连接的方式快速更新依赖。
- 锁定版本:支持锁定依赖版本,确保在不同开发环境下一致性。
pnpm 通过其独特的依赖管理方式和性能优势,为 JavaScript 项目的开发和部署提供了更高效的依赖管理解决方案。
2. 为什么选择使用 pnpm?
平时我们用的包工具管理主要有 npm 和 Yarn,为什么我们还要去多选用 pnpm 的考虑?下面我们分析一下使用 pnpm 的主要原因。
pnpm 主要有几个优势,这也是 pnpm 项目创立之初的初心:
-
节省磁盘空间:pnpm 会在本地磁盘上维护一个共享的依赖包存储库,当你在不同项目中安装相同版本的依赖包时,pnpm 会将其存储在共享存储库中,避免了重复下载和存储依赖包。
-
提高安装速度:pnpm 使用符号链接技术和并行安装,因此能够显著提高依赖包的安装速度,尤其对于大型项目而言,这意味着能够大幅缩短依赖安装的时间成本。
-
高效更新:pnpm 的软链接方式可以让更新依赖包的操作更为高效,因为它能够复用已有的依赖,而无需重复下载和存储。
-
生态兼容:pnpm 兼容现有的 npm 生态,可以无缝使用大部分基于 npm 的包和工具,而且它还支持 Yarn 的 lockfile 格式,方便与使用 Yarn 的项目进行集成和迁移。
综上所述,选择使用 pnpm 可以带来磁盘空间、安装速度、更新效率、版本管理等多方面的优势,特别是对于需要频繁安装依赖和维护大型项目的开发团队而言,pnpm 提供了一种显著改善依赖管理体验的解决方案。
二、使用 pnpm
1. 安装 pnpm
通常有以下两种方式安装 pnpm,如下面所示
-
在全局安装 pnpm(推荐):
bashnpm install -g pnpm
-
在项目中安装 pnpm: 如果你不想在全局范围内安装 pnpm,可以通过以下命令在项目中安装:
bashnpm install pnpm
-
兼容性
以下是各版本 pnpm 与各版本 Node.js 之间的兼容性说明。
2. 初始化项目
在你的项目根目录下,通过以下命令初始化一个新的 pnpm 项目
bash
pnpm init
按照提示填写项目的相关信息,包括项目名称、版本、描述等,即可初始化一个 pnpm 项目。
3. 配置文件介绍
pnpm 的配置文件是 pnpm-workspace.yaml
,它支持配置工作区(workspace)、依赖版本控制、日志等信息。一个典型的配置文件示例如下:
yaml
packages:
- "packages/*"
- "apps/*"
- "examples/*"
- "tools/*"
devDependencies:
typescript: 4.4.4
eslint: 8.1.0
peerDependencies:
react: "*"
"react-dom": "*"
hoistPattern: "*"
上述配置文件中:
packages
字段指定了工作区中的包的位置,它们可以是文件夹路径的模式匹配。devDependencies
字段指定了开发环境下的依赖及其版本。peerDependencies
字段指定了当前项目的对等依赖。hoistPattern
字段指定了哪些包应该被提升到顶层依赖。
你可以根据项目的需要,具体配置文件中的内容。
三、管理依赖
管理依赖是项目开发过程中非常重要的一部分,下面将介绍如何使用 pnpm 来进行依赖管理:
1. 安装依赖
通过以下命令可以安装项目所需的依赖包:
bash
pnpm install <package-name>
你也可以一次性安装项目中所有的依赖:
bash
pnpm install
2. 更新依赖
若要更新依赖到它们的最新版本,可以执行以下命令:
bash
pnpm update
3. 卸载依赖
若要卸载不再需要的依赖,可以使用以下命令:
bash
pnpm remove <package-name>
4. 锁定版本
pnpm 能够自动生成用于锁定依赖版本的 pnpm-lock.yaml
文件。当运行 pnpm install
时,pnpm 会根据该文件确保依赖安装的版本与锁定的版本一致。你可以通过以下命令生成锁定文件:
bash
pnpm install --save
通过以上方法,你可以轻松地管理项目中的依赖,包括安装、更新、卸载以及版本锁定。希望这些信息能对你有所帮助。
四、本地开发
在本地开发过程中,使用 pnpm 进行依赖管理和本地调试是非常常见的,下面我将介绍相关内容:
1. 利用本地包
你可以在项目中使用本地已存在的包作为依赖,从而进行开发和调试。在 package.json
文件中,你可以将本地路径指向依赖的位置,例如:
json
"dependencies": {
"my-local-package": "file:../path-to-local-package"
}
这样就可以在项目中使用本地的包进行开发、等操作。
2. 开发依赖和生产依赖
在 package.json
文件中,有两种类型的依赖:开发依赖和生产依赖。开发赖通常指的是在发、测试和构建过程中需要使用的依赖包,而不会在最终的产品中包含;生产依赖则是最终产品运行时需要用到的依赖包。你可以使用以下命令来添加开发依赖和生产依赖:
bash
pnpm install <package-name> --save-dev # 安装开发依赖
pnpm install <package-name> --save-prod # 安装生产依赖
3. 使用 pnpm 进行本地调试
当你需要在本地试项目时,pnpm 提供了一些命令来帮助你进行本地开发调试,例如:
pnpm start
: 启动项目的开发服务器或者运行一些开发时需要的脚本。pnpm run <script-name>
: 运行package.json
文件中定义的脚本。pnpm test
: 运行项目的测试脚本。pnpm dev
: 启动开发式,通常用于本地开发调试。
这些命令可以根据你的项目需求和配置来进行调整和使用,帮你进行本地开发和调试工作。希望以上信息能帮助到你。
五、与其他包管理工具对比
1. 介绍
-
npm(Node Package Manager)是 Node.js 默认的包管理工具,在社区中拥有广泛的用户和生态系统。它具有丰富的功能和强大的生态支持。
-
yarn 是由 Facebook 开发的包管理工具,旨在解决 npm 在性能和一致性方面的一些问题。yarn 具有类似的命令和功能,可以与 npm 兼容,并通过并行下载和缓存机制来提高安装和更新的速度。yarn 在性能上较 npm 有一些优势,特别在大型项目或复杂的依赖关系中更为明显。
-
pnpm 是一个相对较新的包管理工具,与 npm 和 yarn 不同的是,pnpm 使用一种称为"符号链接"的技术来实现依赖的共享。这意味着 pnpm 不会将每个依赖都复制到项目目录中,而是在全局缓存中共享它们。这样可以节省磁盘空间,并且在安装和更新时也更加高效。
2. 对比
pnpm、yarn 和 npm 都是流行的 JavaScript 包管理工具,它们有各自的特点和优势。
引用官方的对比角度,从以下几个方面来对比一下 pnpm、Yarn 和 npm 之间的区别
下面主要从性能、空间占用、生态系统、使用体验上对 pnpm、Yarn 和 npm 进行对比
-
性能:yarn 和 pnpm 在包的安装和更新速度上通常优于 npm,特别是在较大项目或多依赖的情况下。这是因为它们使用了并行下载和缓存机制。
-
空间占用:由于符号链接的使用,pnpm 在磁盘空间使用方面相对于 npm 和 yarn 较少。这对于包含大量依赖项的项目尤为重要。
-
生态系统:npm 的生态系统非常庞大,拥有广泛的社区支持和包资源。相比之下,yarn 和 pnpm 虽然也能使用 npm 的 registry,但没有独立的生态系统,它们的资源库与 npm 是一样的。
-
使用体验:npm、yarn 和 pnpm 的命令和操作非常相似,开发者可以根据个人喜好选择其中之一。然而,pnpm 在使用上可能需要用户对符号链接有一定了解,并且在某些特殊情况下可能会导致兼容性问题。
下图为官方进行的基准测试,对具有大量依赖的应用程序进行基准测试,表明 pnpm 比 npm 和 Yarn classic 快 2 倍
综上所述,pnpm 对 npm 和 Yarn 有比较大的先天优势,但是最佳选择取决于个人和团队的需求和偏好。如果项目依赖较少,且空间占用不是问题,可以考虑使用 npm。对于大型项目或追求高性能和磁盘占用方面的优化,可以尝试使用 yarn 或 pnpm。
六、总结
在本文中,我们了解了 JavaScript 包管理工具的一种新选择 - pnpm。相比传统的 npm 和 yarn,pnpm 提供了一种全新的包管理方式,通过符号链接技术实现依赖的共享,从而节省了磁盘空间并提高了安装和更新的效率。
在使用 pnpm 进行包管理时,我们发现它具有许多优势。首先,pnpm 能够显著减少项目的磁盘空间占用,特别适用于拥有大量依赖项的项目,让我们能够更轻松地管理和维护我们的代码库。其次,pnpm 的并行下载和缓存机制为包的安装和更新提供了更快的速度,这对于开发大型项目或具有复杂依赖关系的项目尤为重要。
当然,pnpm 并非没有缺点。它相对较新,生态系统相对较小,与 npm 和 yarn 相比还有一些限制。此外,在某些特殊情况下,pnpm 使用符号链接可能会导致兼容性问题。
总的来说,pnpm 提供了一种令人激动的新方式来管理 JavaScript 包,它在磁盘空间占用和安装速度方面具有明显的优势。然而,在选择使用 pnpm 还是其他包管理工具时,我们应该基于项目的需求和团队的偏好做出明智的决策。