pnpm凭什么这么快
前端包管理器层出不穷,pnpm算是一个后起之秀。它和npm有什么不同,为什么有了npm还要造一个pnpm?
npm的问题
npm是最早的包管理器,安装nodejs自带npm,v3版本之前,npm安全依赖的目录结构是这样的:
node_modules
└─ foo
├─ index.js
├─ package.json
└─ node_modules
└─ bar
├─ index.js
└─ package.json
结构清晰而直观,但是存在一个明显的问题,当依赖层级过多时,文件嵌套非常深,然而window系统对文件路径长度是有限制的,超过256字符就会出现目标路径太长,从而无法操作深层级文件的问题,从v3版本开始,npm将每个package平铺到node_modules,就像这样
node_modules
├─ foo
| ├─ index.js
| └─ package.json
└─ bar
├─ index.js
└─ package.json
平铺的方式解决了长路径的问题,但是又存在另一些问题:
package依赖不直观,所有package都是平级的,无法看出来谁依赖了谁;
项目中可以直接import间接依赖的package,比如模块A依赖了模块B,开发者可以直接在项目中import模块B,当模块A升级之后,可能依赖的模块B版本也升级了,之前直接import模块B的API可能不再兼容;
除此之外,npm的另外一个问题是,如果你有10个项目中依赖了模块A,模块A将被安装10次,并且在你的硬盘上保存了10份一模一样的代码,占用了大量磁盘空间
pnpm的作者意识到这些问题,站出来造了pnpm这个新轮子,加入了一些创新
pnpm的解决方案
pnpm的口号是“快速的,节省磁盘空间的包管理工具”,这就是pnpm名字的由来,pnpm代表 performant(高性能的)npm,那么它是怎么做到快且节省磁盘空间的?
当项目中安装依赖包时,pnpm将所有依赖包存储在磁盘的某一个位置,简称.pnpm store,下次再安装同一个包的时候,如果.pnpm store已经存在这个包,将会在项目中创建一个硬链接到.pnpm store(什么是硬链接?),如果.pnpm store不存在这个包,会先保存这个包到.pnpm store,然后再创建硬链接。这样设计,即使是10个项目都依赖了同一个版本的模块A,模块A也只在磁盘上保存1份代码,这就是pnpm又快又节省磁盘空间的原因
pnpm的实现方式
pnpm的node_modules并不是平铺的,举例:
某个项目使用了模块foo@1.0.0,模块foo@1.0.0又依赖了模块bar@1.0.0,那么安装依赖后的node_modules结构是这样的:
node_modules
├── foo -> ./.pnpm/foo@1.0.0/node_modules/foo
└── .pnpm
├── bar@1.0.0
│ └── node_modules
│ └── bar -> <store>/bar
└── foo@1.0.0
└── node_modules
├── foo -> <store>/foo
└── bar -> ../../bar@1.0.0/node_modules/bar
node_modules根目录下只有项目直接依赖的foo模块的软链接和一个.pnpm隐藏文件夹,.pnpm文件夹内,以平铺的方式存放着所有包,每个包文件夹都能一眼看出依赖关系
foo模块以及依赖的bar模块的真实文件,都是存放在.pnpm store,通过硬链接的方式使用

总结
pnpm在重复安装依赖包时,不需要复制文件,所以速度非常快,通过硬链接的方式共享同一份代码,极大的节省了磁盘空间
本文永久地址GitHub
pnpm凭什么这么快的更多相关文章
- 教程 - 深度探讨在 Vue3 中引入 CesiumJS 的最佳方式
目录 1. 你应该先知道的基础知识 1.1. CesiumJS 的库构成 1.2. 选择 Vite3 和 pnpm 的理由 1.3. 使用 External 模式引入静态库 - 不打包静态库 1.4. ...
- 一文看懂npm、yarn、pnpm之间的区别
文作者对比了当前主流的包管理工具npm.yarn.pnpm之间的区别,并提出了合适的使用建议,以下为译文: NPM npm是Node.js能够如此成功的主要原因之一.npm团队做了很多的工作,以确保n ...
- [转] 一文看懂npm、yarn、pnpm之间的区别
[From] http://geek.csdn.net/news/detail/197339 原文:Understanding differences between npm, yarn and pn ...
- 主流包管理工具npm、yarn、cnpm、pnpm之间的区别与联系——原理篇
接触 node 之后,一直使用npm包管理工具, cnpm 一开始会用一些,但是并没有觉得比 npm 快得多,使用 cnpm 的时候还经常安装不成功,只能再用 npm 安装一遍,渐渐的就弃用了 cnp ...
- .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper
好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...
- 【NLP】十分钟快览自然语言处理学习总结
十分钟学习自然语言处理概述 作者:白宁超 2016年9月23日00:24:12 摘要:近来自然语言处理行业发展朝气蓬勃,市场应用广泛.笔者学习以来写了不少文章,文章深度层次不一,今天因为某种需要,将文 ...
- java中if和switch哪个效率快
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...
- 【转】 FineBI:自助式BI工具打造业务分析的“快与准”
如今的企业经营方式,业务对于数据分析有极大的需求,但却苦于没有数据以及工具的有效支持,业务分析仍就依赖于IT报表制作.而IT方不断地按业务需求去调研.确认业务逻辑,然后取数做报表,其中还要忍受业务的需 ...
- 快消品迎来B2B元年,行业将如何变革?
一年接近尾声,又到了年终总结的时候,宴会厅里传来各种激情澎湃的演讲,有的行业遍地开花.欢声笑语不绝于耳:有的行业却没能迎来"昨夜东风",只能嗟叹"不堪回首".2 ...
随机推荐
- Maven笔记---超详细
显眼位置标注来源:此文章为B站课程黑马程序员Maven全套教程笔记,由本人整理. Maven简介 Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM) POM (P ...
- JUnit 5 - Nested Test 内嵌测试
本文地址:https://www.cnblogs.com/hchengmx/p/15158658.html 1. Nested用来解决什么问题 简单地说,Nested用来解决,随着Case越来越多,C ...
- Visual Studio Installer下载速度为0处理办法
DNS改为:223.5.5.5即可. 223.5.5.5 下载完成后记得改回来.
- ESXI系列问题整理以及记录——使用Windows PowerShell中的SSH功能连接ESXI控制台
首先进入ESXI管理页面,开启ESXI的SSH功能 接下来到位于同一局域网的Win主机上开启Powershell,如果ESXI主机的IP地址为192.168.1.77,则在Powershell中输入: ...
- C# 读写文件从用户态切到内核态,到底是个什么流程?
一:背景 1. 一个很好奇的问题 我们在学习 C# 的过程中,总会听到一个词叫做 内核态 ,比如说用 C# 读写文件,会涉及到代码从 用户态 到 内核态 的切换,用 HttpClient 获取远端的数 ...
- Mybatis架构原理(二)-二级缓存源码剖析
Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...
- 设计模式-策略模式前端应用校验vue写法
1.定义:定义一系列算法,把它们一个个封装起来,并且它们可以相互替换 2.实际应用:减少if else的使用,在有多种算法相似的情况下,使用 if-else 所带来的复杂和难以维护,提高维护和可读性, ...
- SAP 实例- 下拉框
效果图 源代码 REPORT rsdemo_dropdown_listbox . DATA init. TABLES scarr. TABLES spfli. TABLES sflight. TABL ...
- Qt项目开发实例 (含源码)
源码传送门: 啊渊 / QT博客案例 · GitCode 目前QT的研发都是基于windows操作系统的,本文分享在国产操作系统中学QT的路线图,其实学习路线差不多,为了全面的回顾自己的学习知识,打算 ...
- Mysql中的小技巧
1.where 字段名 regexp '正则表达式' 正则符号: ^ $ . [ ] * | . 表示1个任意字符 * 表示前面重复0次,或者任意次 ^ 开始 $ 结尾 [] 范围 | 或 sql示例 ...