开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 25 天,点击查看活动详情
原文来自我的个人博客
1. pnpm 是什么?
pnpm(全称 Performant NPM) 你可以理解为性能更好的 npm
在 pnpm的官网是这么介绍的:pnpm 是一个快速的,节省磁盘空间 的 包管理工具
前两者 快速的、节省磁盘空间 很容理解。
那么什么是包管理工具呢?
1.1 包管理工具
每种主流编程语言都有包管理工具,比如:
Java的Maven、GradlePython的pipNodejs的npm、yarn、pnpm等。
包管理工具的主要作用是管理第三方依赖,也可以看成一个 "轮子" 工厂,每个人都可以上传自己造的 "轮子" 和下载使用别人的 "轮子",包管理工具顾名思义就是统一管理这些轮子的软件或者工具,它以多种方式自动处理项目依赖关系、提供了命令行工具(CLI)、支持跟踪依赖项和版本等功能, 除此之外还可以安装、卸载、更新和升级包,配置项目设置,运行脚本等等。
有了包管理工具,我们可以很简单地构建一个项目或者引入和管理一个库,留给我们的则是愉快地编码。
而我们要将的正是 Nodejs 包管理工具中的一款:pnpm
1.2 pnpm 的项目初衷
pnpm 项目创立的初衷是为了节约磁盘空间并提升安装速度:
- 使用
npm时,依赖每次被不同的项目使用,都会重复安装一次。 而在使用pnpm时,依赖会被存储在内容可寻址的存储中(即只用安装一次即可)
上面是推特上一张非常形象描述 pnpm 的图片,已经被 pnpm 的作者收纳到了官网。
那么 pnpm 是如何做的呢?要理解 pnpm 做了什么,可能我们需要讲一些操作系统的知识。
1.3 硬链接 & 软链接
-
硬链接
(hard link):- 硬链接是电脑文件系统中的多个文件平等地共享同一个文件存储单元;
- 删除一个文件名字后,还可以用其它名字继续访问该文件;
-
符号链接
(Symbolic link)又称软链接(soft link):- 符号链接(
Symbolic link)是一类特殊的文件; - 其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用;
- 符号链接(
硬链接和软链接的图解:
注意:硬链接和符号链接不是拷贝,拷贝最终会生成两份文件,而硬链接和软链接始终只有一份
1.4 pnpm 到底做了什么
使用 npm 或 Yarn 时,如果你有 100 个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本。
如果是使用 pnpm,依赖包将被 存放在一个统一的位置,因此:
- 如果你对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件;
- 如果你对同一依赖包需要使用不同的版本,则仅有 版本之间不同的文件会被存储起来;
- 所有文件都保存在硬盘上的统一的位置:
- 当安装软件包时, 其包含的所有文件都会硬链接到此位置,而不会占用 额外的硬盘空间;
- 让你可以在项目之间方便地共享相同版本的 依赖包;
1.5 pnpm 创建非扁平的 node_modeules 目录
- 当使用
npm或Yarn Classic安装依赖包时,所有软件包都将被提升到node_modules的 根目录下。- 其结果是,源码可以访问本不属于当前项目所设定的依赖包;
2. pnpm 的安装和使用
我们应该如何安装 pnpm 呢?
- 官网提供了很多种方式来安装pnpm:www.pnpm.cn/installatio…
最简单的方式就是通过 npm 安装即可
npm i install -g pnpm
以下 是一个与 npm 等价命令的对照表,帮助你快速入门:
| npm 命令 | pnpm 等效 |
|---|---|
npm install | pnpm 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
-
在
Linux上,默认是~/.local/share/pnpm/store -
在
Windows上:%LOCALAPPDATA%/pnpm/store -
在
macOS上:~/Library/pnpm/store
我们可以通过一些终端命令获取这个目录:获取当前活跃的store目录
pnpm store path
另外一个非常重要的 store 命令是 prune(修剪):从 store 中删除当前未被引用的包来释放 store 的空间
pnpm store prune