首页 > 其他分享 >pnpm凭什么这么快

pnpm凭什么这么快

时间:2022-08-22 17:57:20浏览次数:100  
标签:node 这么 bar 什么 modules 模块 pnpm foo

前端包管理器层出不穷,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并不是平铺的,举例:

某个项目使用了模块[email protected],模块[email protected]又依赖了模块[email protected],那么安装依赖后的node_modules结构是这样的:

node_modules
├── foo -> ./.pnpm/[email protected]/node_modules/foo
└── .pnpm
    ├── [email protected]
    │   └── node_modules
    │       └── bar -> <store>/bar
    └── [email protected]
        └── node_modules
            ├── foo -> <store>/foo
            └── bar -> ../../[email protected]/node_modules/bar

node_modules根目录下只有项目直接依赖的foo模块的软链接和一个.pnpm隐藏文件夹,.pnpm文件夹内,以平铺的方式存放着所有包,每个包文件夹都能一眼看出依赖关系

foo模块以及依赖的bar模块的真实文件,都是存放在.pnpm store,通过硬链接的方式使用

pnpmstore

总结

pnpm在重复安装依赖包时,不需要复制文件,所以速度非常快,通过硬链接的方式共享同一份代码,极大的节省了磁盘空间

本文永久地址GitHub

标签:node,这么,bar,什么,modules,模块,pnpm,foo
From: https://www.cnblogs.com/wangmeijian/p/16613698.html

相关文章

  • 【Java基础】什么是数组
    1.什么是数组Array:多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理。(1)说明①数组本身是引用数据类型,数组中的元素可......
  • 什么是数据结构?
     数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素的集合。--百度 数据结构用途:解决问题方法的效率,根数据的组织方式有......
  • Linux到底要做什么?
    从上一回分析了Linux到底是什么之后。我觉得得具体地思考一下我们到底在实际应用中会拿Linux做什么?从产品应用上来说:如手机、智能电视、智能音箱、车载中控1.手机性能调......
  • 从 InfluxDB 到 TDengine,阳光氢能为什么会做出这个选择?
    小 T 导读:为了更好地支持阳光氢能PEM绿电制氢系统,本文作者所在的部门需要寻找一套满足业务和性能需求、而且具有国产知识产权的时序数据库,来替代原本使用的InfluxDB......
  • 为什么渲染的时候,明明ajax请求没问题,模板引擎也没问题,却没有呢(layui加template)
    这是因为layui的渲染机制造成的,你在加载的时候是空的,然后你模板获取到之后,已经渲染结束了,所以啥也没有,这个时候我们需要重新渲染一下//初始化文章分类functioninit......
  • 什么是docker的写时复制(CoW)?有什么作用?
    问题一个问题:dockerCoW你知道是什么吗? 1、什么是CoW? CoW=Copy-On-Write 也就是,你经常会听到的一个词,叫做:写时复制。 那么,到底什么是写时复制,究竟有什么样......
  • 使用pnpm的patch命令打补丁(正确修改源码,在外部修改node_modules代码 )
    在开发时,有时碰到依赖的类库有bug或者不满足要求时让作者改,一般不太现实和及时使用patch-package打补丁,安装依赖后自动打上修改的内容在pnpm7.4(pnpm高效npm版本管理工......
  • 为什么需要去做“性能测试”
    一、为什么要做性能测试?系统用户量快速增长;同时业务和系统架构更加复杂,要处理的数据大大增加。此时不仅仅要满足于功能的实现,在很多场景下更要关注系统性能。二、什么是......
  • 内外网文件摆渡 需要什么样的跨网文件传输系统?
    内外网隔离可以有效的保障了信息的对外安全性,但是在实际应用过程中,为了满足部门业务需求,内网和外网之间仍需要进行大量必要的数据交换,也称为数据摆渡。所以数据摆渡这一概......
  • 为什么会有996
      从发展阶段来看,国内的互联网公司大多都处于原始积累阶段,大家都是你有什么功能,我也要有,本质上就是抄来抄去;这就导致然后大家都拼命扩军、拼命提速,进入一种低维度的竞争......