包管理工具 pnpm 介绍

lxf2023-07-14 11:10:01

开启编程成长之旅!这是我参与「编程 · 2 月更文挑战」的第 25 天,点击查看活动详情

原文来自我的个人博客

1. pnpm 是什么?

pnpm(全称 Performant NPM) 你可以理解为性能更好的 npm

pnpm的官网是这么介绍的:pnpm 是一个快速节省磁盘空间包管理工具

前两者 快速的节省磁盘空间 很容理解。

那么什么是包管理工具呢?

1.1 包管理工具

每种主流编程语言都有包管理工具,比如:

  1. JavaMavenGradle
  2. Pythonpip
  3. Nodejsnpmyarnpnpm 等。

包管理工具的主要作用是管理第三方依赖,也可以看成一个 "轮子" 工厂,每个人都可以上传自己造的 "轮子" 和下载使用别人的 "轮子"包管理工具顾名思义就是统一管理这些轮子的软件或者工具,它以多种方式自动处理项目依赖关系、提供了命令行工具(CLI)、支持跟踪依赖项和版本等功能, 除此之外还可以安装卸载更新升级配置项目设置运行脚本等等。

有了包管理工具,我们可以很简单地构建一个项目或者引入和管理一个库,留给我们的则是愉快地编码。

而我们要将的正是 Nodejs 包管理工具中的一款:pnpm

1.2 pnpm 的项目初衷

pnpm 项目创立的初衷是为了节约磁盘空间并提升安装速度

  • 使用 npm 时,依赖每次被不同的项目使用,都会重复安装一次。 而在使用 pnpm 时,依赖会被存储在内容可寻址的存储中(即只用安装一次即可)

包管理工具 pnpm 介绍

上面是推特上一张非常形象描述 pnpm 的图片,已经被 pnpm 的作者收纳到了官网。

那么 pnpm如何做的呢?要理解 pnpm 做了什么,可能我们需要讲一些操作系统的知识。

1.3 硬链接 & 软链接

  • 硬链接(hard link)

    1. 硬链接是电脑文件系统中的多个文件平等地共享同一个文件存储单元
    2. 删除一个文件名字后,还可以用其它名字继续访问该文件;
  • 符号链接(Symbolic link)又称软链接(soft link)

    1. 符号链接(Symbolic link)是一类特殊的文件;
    2. 其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用;

硬链接和软链接的图解:

包管理工具 pnpm 介绍

注意:硬链接和符号链接不是拷贝,拷贝最终会生成两份文件,而硬链接和软链接始终只有一份

1.4 pnpm 到底做了什么

使用 npmYarn 时,如果你有 100 个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本。

如果是使用 pnpm,依赖包将被 存放在一个统一的位置,因此:

  1. 如果你对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件;
  2. 如果你对同一依赖包需要使用不同的版本,则仅有 版本之间不同的文件会被存储起来;
  3. 所有文件都保存在硬盘上的统一的位置:
    • 当安装软件包时, 其包含的所有文件都会硬链接到此位置,而不会占用 额外的硬盘空间;
    • 让你可以在项目之间方便地共享相同版本的 依赖包;

1.5 pnpm 创建非扁平的 node_modeules 目录

  • 当使用 npmYarn Classic 安装依赖包时,所有软件包都将被提升到 node_modules 的 根目录下。
    • 其结果是,源码可以访问本不属于当前项目所设定的依赖包;

包管理工具 pnpm 介绍

2. pnpm 的安装和使用

我们应该如何安装 pnpm 呢?

  • 官网提供了很多种方式来安装pnpm:www.pnpm.cn/installatio…

最简单的方式就是通过 npm 安装即可

npm i install -g pnpm

以下 是一个与 npm 等价命令的对照表,帮助你快速入门:

npm 命令pnpm 等效
npm installpnpm install
npm i <pkg>[pnpm add <pkg>]
npm run <cmd>[pnpm <cmd>]
npm uninstall <pkg>pnpm remove <pkg>

更多命令和用法可以参考pnpm的官网:pnpm.io/zh/

3. pnpm 的存储 store

pnpm7.0 之前,统一的存储位置是 ~/.pnpm-score中的;

pnpm7.0 之后,统一的存储位置进行了更改:<pnpm home directory>/store

  1. Linux 上,默认是 ~/.local/share/pnpm/store

  2. Windows 上: %LOCALAPPDATA%/pnpm/store

  3. macOS 上: ~/Library/pnpm/store

我们可以通过一些终端命令获取这个目录:获取当前活跃的store目录

pnpm store path

另外一个非常重要的 store 命令是 prune(修剪):从 store 中删除当前未被引用的包来释放 store 的空间

pnpm store prune
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!