首页 > 其他分享 >pnpm 管理依赖包是如何节省磁盘空间的?

pnpm 管理依赖包是如何节省磁盘空间的?

时间:2023-11-20 20:23:58浏览次数:25  
标签:node 包是 依赖 js 磁盘空间 axios pnpm 磁盘

npm 存在的问题

我们经常使用 npm 来管理 node 项目中的包,从 package.json 中读取配置将依赖下载到本地,以保障项目的正常运行。

当项目数量多时,这样的包管理方式会非常的占用电脑内存。由于每个项目都有属于自己的依赖,每个项目都需要安装,即使 npm 会对依赖进行缓存,但是每个项目仍然需要安装到自己的 node_modules 文件夹下,此时每个项目安装的每一份依赖都会在磁盘中保存一份,即使各个项目中依赖的版本可能相同。

pnpm 就是针对以上问题出现的解决方案,它使用统一的仓库来存放项目中的包,在项目中使用硬链接+软连接的方式找到依赖所在磁盘的位置。

硬链接和软连接

想要清晰的知道 pnpm 管理依赖的原理,首先要了解硬链接和软连接、拷贝操作的区别。

拷贝操作会在磁盘中复制一份新的数据,比如拷贝 a.js 为 a_copy.js,两个文件在拷贝后就互不关联,修改 a.js 不会影响 a_copy.js,删除 a_copy.js 也不会影响 a.js。

硬链接通过寻址的方式找到磁盘中的数据,比如新建 b_hard.js 与 b.js 创建硬链接,两者指向的是同一个磁盘数据,所以修改其中一个文件,另一个文件也会发生变化。

软连接就是我们平时常见的创建快捷方式(文件后面会存在一个向右的小箭头),它只是保存着文件的路径,不可以编辑,直接双击就会找到原始的文件。如果原文件被删除,通过软连接将无法找到磁盘中的数据。

我们可以通过命令来进行连接操作,windows 是这样的

/*拷贝*/ copy a.js a_copy.js
/*硬链接*/ mklink /H b_hard.js b.js
/*软连接*/ mklink c_soft.js c.js

pnpm原理

使用 npm 或者 yarn 时,如果有100个项目,并且所有项目都有一个相同的依赖包,那么在磁盘上就需要保存100份该相同依赖的包

如果使用 pnpm,依赖包将被放在统一的位置,当安装包时,其包含的所有文件会硬链接到这个位置,不会另外占用磁盘空间,这样不同项目之间就可以共享相同版本的依赖。

如果对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件,如果对同一依赖包使用不同的版本,那么只有版本之间不同的文件被存储起来。

比如 a/b/c 三个项目都使用 axios,axios 的所有文件都保存在 pnpm 上,axios 这些文件对应着磁盘的数据,直接 a/b/c 项目的axios 通过硬链接指向磁盘里的数据。 这样有两个好处:
(1)效率非常高,无需下载、查找缓存解压等操作
(2)节省磁盘空间,每个项目不需要再下载一份

pnpm 依赖包统一保存的位置可以使用命令 pnpm store path 来查看

非扁平的 node_modules 目录

使用 npm 或者 yarn安装的依赖包会将所有的子级依赖全部平铺到 node_modules 文件夹中,即扁平化的目录结构,这样会导致源码可以访问本来不属于当前项目所设定的依赖包。

比如安装 axios ,同时会安装非常多的其它的库如 form-data,虽然在 package.json 中是没有配置的,但在源代码中可以直接通过require('form-data') 引用,这样就会有隐患,如果项目某天删除了 axios,form-data 就不存在了。

使用 npm 和 pnpm 分别只安装 axios,npm 会将 axios 所需的其它依赖平铺,而 pnpm 的 node_modules 根目录下只有 axios 和 .pnpm 文件夹,这样就可以避免非主动下载的其它依赖包可随意访问的情况。

如果直接按照这样的层级下载包,可能会带来新的问题,如多个包依赖同一个包时,就会被重复安装。

▾ node_modules
    ▾ axios
        ▾ node_modules
            ▸ form-data
    ▾ xxx
        ▾ node_modules
            ▸ form-data

那 pnpm 是如何做到非扁平化并且不重复安装的呢?答案就是它使用硬链接与软连接结合的方式来与依赖包关联。

在 node_modules 根目录有一个文件夹 .pnpm,这里包含了项目所有依赖。
根目录下 axios 软连接到 .pnpm 目录下的 axios 文件夹中,展开 .pnpm/[email protected] 的node_modules 文件夹,其中有 axios 所需的依赖,包含 axios、follow-redirects、form-data、proxy-from-env,其中 axios 硬链接到磁盘中(即与 pnpm 仓库保存的地址一致),其它文件软连接到 .pnpm 的自身位置。

node_modules 根目录下的依赖,软连接到 .pnpm 文件夹中,如果有相互依赖的关系,仍然通过软连接,只有找到依赖自身,才会通过硬链接找到磁盘中的位置,这样可以保证同一个项目里不同依赖也不会重复安装,同时不同项目之间的相同依赖也无需在磁盘中存储多份。

标签:node,包是,依赖,js,磁盘空间,axios,pnpm,磁盘
From: https://www.cnblogs.com/vigourice/p/17840297.html

相关文章

  • PowerShell pnpm 报错
    Vue3>pnpmrundevpnpm:无法加载文件D:\programfiles\nodejs\node_global\pnpm.ps1。未对文件D:\programfiles\nodejs\node_global\pnpm.ps1进行数字签名。无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息,请参阅https:/go.microsoft.com/fwlink/?Lin......
  • add方法在return的适时候就形成了一个闭包,包含n=4399这个值,这个n不是result和result2
    在浏览器控制台中执行以下代码,输出的结果是functiontest(){varn=4399;functionadd(){n++;console.log(n);}return{n:n,add:add}}varresult=test();varresult2=test();result.add();result.add();console.log(result.n)......
  • Gipcdout.trc文件巨大,导致磁盘空间耗尽
    背景:Exadata上的一套19CRAC环境,发现/u01目录下的一个名为Gipcdout.trc的日志文件,占用了大约100GB的磁盘空间。具体信息如下所示。[root@dm04dbadm05/u01/app/grid/crsdata/dm04dbadm05/output]#ll......-rw-r--r--1root  root  100372142422 Nov  3  1......
  • mongodb获取空闲磁盘空间
    这篇文章mongodb使用内存和硬盘特性我们介绍过mongodb删除数据后,并不会释放磁盘空间。大部分数据库为了性能都会这样做,比如mysql也是。不过mysql可以整理磁盘空间,把空闲的磁盘释放掉,还给操作系统,但是mongodb却不会。虽然说mongodb也有整理磁盘的接口调用(compact),但是它并不是释放......
  • pnpm : 无法加载文件
    报错pnpm:无法加载文件C:\Users\16978\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅https:/go.microsoft.com/fwlink/?LinkID=135170中的about_Execution_Policies。 解决办法windows11powershell的安全策略,将nrm命令视为了不安全......
  • TCP 的重传机制;TCP 的粘包和拆包是什么?
    重传包括超时重传、快速重传、带选择确认的重传(SACK)、重复SACK四种。一、TCP重传机制1.1超时重传超时重传,是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成......
  • win11清理磁盘空间方法
    win11清理磁盘空间的方法:1、首先,按键盘上的Win键,或点击任务栏上的开始菜单,再选择已固定应用下的设置。2、当前路径为:系统》存储,可以看到各部分空间的占用情况,存储管理下,可以将存储感知(自动释放空间,删除临时文件,并管理本地可用的云内容)打开。3、......
  • 磁盘空间占用分析
    C盘红色,通过shell命令统计文件占用情况。由于unixshell比cmd好用,可以用gitbash或者mobaxterm,本文用gitbash。使用ls命令##原始文件ls查看文件增加参数,根据文件大小倒序ls参数解释:-a显示所有文件及目录(. 开头的隐藏文件也会列出)-d只列出目录(不递归列出目录内的文件)。-l以长......
  • Linux 磁盘空间异常爆满的排查和处理
    一、问题现象在服务验证中,遇到磁盘空间使用率接近100%,业务操作出现异常具体:测试升级过程中,磁盘分区的容量空间使用殆尽,导致升级失败,手动操作删除一些文件后,磁盘空间仍旧没有释放,具体查看的时候确实没有多大大文件 二、问题排查思路:1.通过  df-Hl命令查看  2.查看......
  • 2023-02-28-如何避免timemachine占用宝贵的mac磁盘空间
    +++title="如何避免timemachine占用宝贵的mac磁盘空间"description=""date=2023-02-28T16:47:50+08:00comment=truetoc=truereward=truecategories=[""]tags=[""]series=[]images=[]+++因为我买的MacBook只有512G的容量......