开启编程成长之旅!这是我参与「编程 · 2 月更文挑战」的第 25 天,点击查看活动详情
原文来自我的个人博客
1. pnpm 是什么?
pnpm(全称 Performant NPM)
你可以理解为性能更好的 npm
在 pnpm
的官网是这么介绍的:pnpm
是一个快速的,节省磁盘空间 的 包管理工具
前两者 快速的
、节省磁盘空间
很容理解。
那么什么是包管理工具呢?
1.1 包管理工具
每种主流编程语言都有包管理工具,比如:
Java
的Maven
、Gradle
Python
的pip
Nodejs
的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
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。
在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。
本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。
除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。
在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!