探索包管理新视界 - 使用 pnpm

一、认识 pnpm

1. 什么是 pnpm?

pnpm 是一个用于管理 JavaScript 项目依赖的包管理工具。pnpm 的全称为 "Performant npm",它旨在提供更快速、更高效的依赖管理体验。相较于传统的 npm 和 Yarn,pnpm 采用了一种全新的依赖管理方式,通过共享依赖来减少磁盘占用,同时提供了快速的安装和更新速度。

pnpm 的核心特点包括:

  1. 空间共享:在安装依赖时将相同版本的库共享,从而减少磁盘占用。
  2. 快速安装:采用符号链接技术,使得安装依赖时速度更快。
  3. 并行安装:支持依赖并行安装,提升安装速度。
  4. 高效更新:能够通过软连接的方式快速更新依赖。
  5. 锁定版本:支持锁定依赖版本,确保在不同开发环境下一致性。

pnpm 通过其独特的依赖管理方式和性能优势,为 JavaScript 项目的开发和部署提供了更高效的依赖管理解决方案。

2. 为什么选择使用 pnpm?

平时我们用的包工具管理主要有 npm 和 Yarn,为什么我们还要去多选用 pnpm 的考虑?下面我们分析一下使用 pnpm 的主要原因。

pnpm 主要有几个优势,这也是 pnpm 项目创立之初的初心:

  1. 节省磁盘空间:pnpm 会在本地磁盘上维护一个共享的依赖包存储库,当你在不同项目中安装相同版本的依赖包时,pnpm 会将其存储在共享存储库中,避免了重复下载和存储依赖包。

  2. 提高安装速度:pnpm 使用符号链接技术和并行安装,因此能够显著提高依赖包的安装速度,尤其对于大型项目而言,这意味着能够大幅缩短依赖安装的时间成本。

  3. 高效更新:pnpm 的软链接方式可以让更新依赖包的操作更为高效,因为它能够复用已有的依赖,而无需重复下载和存储。

  4. 生态兼容:pnpm 兼容现有的 npm 生态,可以无缝使用大部分基于 npm 的包和工具,而且它还支持 Yarn 的 lockfile 格式,方便与使用 Yarn 的项目进行集成和迁移。

综上所述,选择使用 pnpm 可以带来磁盘空间、安装速度、更新效率、版本管理等多方面的优势,特别是对于需要频繁安装依赖和维护大型项目的开发团队而言,pnpm 提供了一种显著改善依赖管理体验的解决方案。

二、使用 pnpm

1. 安装 pnpm

通常有以下两种方式安装 pnpm,如下面所示

  1. 在全局安装 pnpm(推荐):

    bash 复制代码
    npm install -g pnpm
  2. 在项目中安装 pnpm: 如果你不想在全局范围内安装 pnpm,可以通过以下命令在项目中安装:

    bash 复制代码
    npm install pnpm
  3. 兼容性

以下是各版本 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 还是其他包管理工具时,我们应该基于项目的需求和团队的偏好做出明智的决策。

相关推荐
ComPDFKit26 分钟前
使用 PDF API 合并 PDF 文件
前端·javascript·macos
yqcoder34 分钟前
react 中 memo 模块作用
前端·javascript·react.js
优雅永不过时·1 小时前
Three.js 原生 实现 react-three-fiber drei 的 磨砂反射的效果
前端·javascript·react.js·webgl·threejs·three
神夜大侠4 小时前
VUE 实现公告无缝循环滚动
前端·javascript·vue.js
明辉光焱4 小时前
【Electron】Electron Forge如何支持Element plus?
前端·javascript·vue.js·electron·node.js
柯南二号4 小时前
HarmonyOS ArkTS 下拉列表组件
前端·javascript·数据库·harmonyos·arkts
wyy72934 小时前
v-html 富文本中图片使用element-ui image-viewer组件实现预览,并且阻止滚动条
前端·ui·html
前端郭德纲5 小时前
ES6的Iterator 和 for...of 循环
前端·ecmascript·es6
王解5 小时前
【模块化大作战】Webpack如何搞定CommonJS与ES6混战(3)
前端·webpack·es6
欲游山河十万里5 小时前
(02)ES6教程——Map、Set、Reflect、Proxy、字符串、数值、对象、数组、函数
前端·ecmascript·es6