前端包管理器层出不穷,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凭什么这么快的更多相关文章

  1. 教程 - 深度探讨在 Vue3 中引入 CesiumJS 的最佳方式

    目录 1. 你应该先知道的基础知识 1.1. CesiumJS 的库构成 1.2. 选择 Vite3 和 pnpm 的理由 1.3. 使用 External 模式引入静态库 - 不打包静态库 1.4. ...

  2. 一文看懂npm、yarn、pnpm之间的区别

    文作者对比了当前主流的包管理工具npm.yarn.pnpm之间的区别,并提出了合适的使用建议,以下为译文: NPM npm是Node.js能够如此成功的主要原因之一.npm团队做了很多的工作,以确保n ...

  3. [转] 一文看懂npm、yarn、pnpm之间的区别

    [From] http://geek.csdn.net/news/detail/197339 原文:Understanding differences between npm, yarn and pn ...

  4. 主流包管理工具npm、yarn、cnpm、pnpm之间的区别与联系——原理篇

    接触 node 之后,一直使用npm包管理工具, cnpm 一开始会用一些,但是并没有觉得比 npm 快得多,使用 cnpm 的时候还经常安装不成功,只能再用 npm 安装一遍,渐渐的就弃用了 cnp ...

  5. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper

    好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...

  6. 【NLP】十分钟快览自然语言处理学习总结

    十分钟学习自然语言处理概述 作者:白宁超 2016年9月23日00:24:12 摘要:近来自然语言处理行业发展朝气蓬勃,市场应用广泛.笔者学习以来写了不少文章,文章深度层次不一,今天因为某种需要,将文 ...

  7. java中if和switch哪个效率快

    首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...

  8. 【转】 FineBI:自助式BI工具打造业务分析的“快与准”

    如今的企业经营方式,业务对于数据分析有极大的需求,但却苦于没有数据以及工具的有效支持,业务分析仍就依赖于IT报表制作.而IT方不断地按业务需求去调研.确认业务逻辑,然后取数做报表,其中还要忍受业务的需 ...

  9. 快消品迎来B2B元年,行业将如何变革?

    一年接近尾声,又到了年终总结的时候,宴会厅里传来各种激情澎湃的演讲,有的行业遍地开花.欢声笑语不绝于耳:有的行业却没能迎来"昨夜东风",只能嗟叹"不堪回首".2 ...

随机推荐

  1. Kubernetes client-go Informer 源码分析

    概述ControllerController 的初始化Controller 的启动processLoopHandleDeltas()SharedIndexInformersharedIndexerIn ...

  2. 前端2CSS2

    内容概要 伪元素选择器 选择器优先级 字体样式 文字属性 背景属性 display属性 边框属性 盒子模型 浮动(重要) 解决浮动造成的影响 内容详情 伪元素选择器 """ ...

  3. CabloyJS一站式助力微信、企业微信、钉钉开发 - 企业微信篇

    前言 现在软件开发不仅要面对前端碎片化,还要面对后端碎片化.针对前端碎片化,CabloyJS提供了pc=mobile+pad的跨端自适应方案,参见:自适应布局:pc = mobile + pad 在这 ...

  4. C++ 智能指针浅析

    C++ 智能指针浅析 为了解决 C++ 中内存管理这个老大难问题,C++ 11 中提供了三种可用的智能指针.(早期标准库中还存在一种 auto_ptr,但由于设计上的缺陷,已经被 unique_ptr ...

  5. JZOJ5384. 【NOIP2017提高A组模拟9.23】四维世界

    题目 Description 众所周知,我们常感受的世界是三维的. Polycarp突然对四维空间产生了兴趣,他想对四维空间进行一些研究.但是在此之前,他必须先对三维世界了解透彻. 于是Polycar ...

  6. tmux(Terminal MultipleXer)命令使用

    作用:命令行多窗口显示:命令行程序与本机脱离 1 安装tmux (1)redhat.centos系统 yum install tmux (2)ubuntu系统 apt-get install tmux ...

  7. RocketMQ事务消息机制

    1.half消息对消费者不可见,用于确定MQ服务正常. 2.MQ响应half消息. 3.生产者执行本地事务. 4.生产者发送具体消息+本地事务状态,MQ根据本地事务状态执行Commit或者Rollba ...

  8. 使用C++的ORM框架QxORM

    QxORM中,我们用的最多的无非是这两点 官方表述是这样的: 持久性: 支持最常见的数据库,如 SQLite.MySQL.PostgreSQL.Oracle.MS SQL Server.MongoDB ...

  9. Jenkins安装插件出现Signature verification failed in update site 'default' (show details)

    这样启动 nohup java -Dhudson.model.DownloadService.noSignatureCheck=true -jar jenkins.war > jenkins.l ...

  10. 老掉牙的 synchronized 锁优化,一次给你讲清楚!

    我们都知道 synchronized 关键字能实现线程安全,但是你知道这背后的原理是什么吗?今天我们就来讲一讲 synchronized 实现线程同步背后的原因,以及相关的锁优化策略吧. synchr ...