第六节:pnpm剖析(简介、硬/软链接、实操、配置、原理)
一. pnpm简介
1. 官网的给出的定义
快速的,节省磁盘空间的包管理工具
优势:
当使用 npm 或 Yarn 时,如果你有 100 个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本
使用 pnpm,依赖包将被存放在一个统一的位置,pnpm 通过使用硬链接和符号链接到全局磁盘内容可寻址存储来管理 node_modules,减少了磁盘空间的使用。
2. 哪些公司在使用?
Vue、微软、字节跳动、COMPASS
二. 硬连接和软连接
1. 硬连接(hard link)
硬链接(英语:hard link)是电脑文件系统中的多个文件平等地共享同一个文件存储单元;
删除一个文件名字后,还可以用其它名字继续访问该文件
2. 软连接(soft link,也叫符号链接Symbolic link)
符号链接(软链接、Symbolic link)是一类特殊的文件;(可以理解成快捷方式)
其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用;
3. 指令
(1). 拷贝
window: copy foo.js foo_copy.js macos : cp foo.js foo_copy.js
(2). 硬连接
window: mklink /H foo_hard.js foo.js macos : ln foo.js foo_hard.js
(3). 软连接
window: mklink foo_soft.js foo.js macos : ln -s foo.js foo_copy.js
注:windows下需要用cmd命令,不要用powershell 和 gitbash,另外软连接需要用管理员身份运行
4. 实操
硬连接当改 foo.js中的内容,foo_hard.js中的内容也跟着改

三. pnpm实操
1. 安装和配置
(1). 需要先通过npm全局安装pnpm 【npm install pnpm -g】
(2). 设置磁盘存储地址:【pnpm config set store-dir D:\Develop\pnpm\.pnpm-store】
2. 常用指令
npm 命令 pnpm 等价命令
【npm init】 【pnpm init】
【npm install】 【pnpm install】 指的是一键安装所有包
【npm install <pkg>】 【pnpm add <pkg>】
【npm install <pkg> -D】 【pnpm add <pkg> -D】 开发环境
【npm uninstall <pkg>】 【pnpm remove <pkg>】
【npm run <cmd> 】 【pnpm <cmd>】 对应的package.json中的script标签
3. 以axios的使用为例
(1). 初始化项目:【pnpm init】
(2). 安装axios 【pnpm add axios】
(3). 采用ESModule的方式编写axios代码,需要先在package.json中配置一下 "type": "module",
(4). 配置Script指令
"scripts": { "serve": "node ./src/index.js" },
(5). 通过指令 【pnpm serve】 运行代码,axios请求成功
四. 其它配置
1. 设置pnpm的磁盘目录
【pnpm config set store-dir D:\Develop\pnpm\.pnpm-store】
2. 查看pnpm的安装目录
【pnpm store path】
我的电脑的存储目录如下:
【D:\Develop\pnpm\.pnpm-store\v3】
3. 从store中删除当前未被引用的包来释放store的空间
【pnpm store prune】
五. pnpm原理
1. npm和yarn的问题
当使用 npm 或 Yarn 时,如果你有 100 个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本。
2. pnpm的原理
如果是使用 pnpm,依赖包将被存放在一个统一的位置,因此:
(1). 如果你对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件;
(2). 如果你对同一依赖包需要使用不同的版本,则仅有版本之间不同的文件会被存储起来;
(3). 所有文件都保存在硬盘上的统一的位置:
✓ 当安装软件包时,其包含的所有文件都会硬链接到此位置,而不会占用额外的硬盘空间;
✓ 这让你可以在项目之间方便地共享相同版本的依赖包;
3. 结合原理图深度剖析
pnpm创建非扁平的 node_modules 目录
下图剖析:
(1). 项目需要使用bar这个包(这个包内部需要依赖cat包),在node_module的最外层会有一个bar@xxx, 他通过软连接到 .pnpm文件夹下的 bar@xxx/node_modules中的bar@xxx, 而这个bar通过硬连接到磁盘统一目录下存储的bar;
(2). bar@xxx/node_modules中的bar@xxx需要依赖foo@xxx,而这个foo@xxx通过软连接到 .pnpm根目录下的foo, 这个根目录下的foo又通过硬连接到磁盘统一目录下存储的foo
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-03-10 第一节:项目初始化(ElementUI、axios)、Git版本管理、基本环境搭建
2018-03-10 第五节: Quartz.Net五大构件之Trigger的四大触发类