pnpm原理:软连接、硬连接

本文探讨了文件的本质,硬链接和符号链接在操作系统中的作用,以及pnpm如何利用这些机制来节省磁盘空间。重点介绍了硬链接的创建、Windows系统中的操作,以及pnpm如何处理硬链接和符号链接以实现依赖管理。
摘要由CSDN通过智能技术生成

在这里插入图片描述

如何节省的磁盘空间

  • 符号连接
  • 硬连接

在讲上面两个概念之前,问几个问题:

  • 我们电脑上删除的文件可以恢复吗?(数据恢复软件/专业做数据恢复的人)
  • 为什么可以恢复,什么情况下不能恢复(恢复失败)
  • 电脑上的文件是如何存放的?

概念

要彻底理解pnpm是怎么做的,需要有一些操作系统知识

  1. 文件的本质

在操作系统中,文件实际上是一个指针,只不过它指向的不是内存地址,而是一个外部存储地址(这里的外部存储可以是硬盘、U盘、甚至是网络)
在这里插入图片描述
当我们删除文件时,删除的实际上是指针,因此,无论删除多么大的文件,速度都非常快。
在这里插入图片描述

  1. 文件的拷贝

如果你复制一个文件,是将该文件指针指向的内容进行复制,然后产生一个新文件指向新的内容

在这里插入图片描述

  1. 硬链接 hard link

硬链接的概念来自于 Unix 操作系统,它是指将一个文件A指针复制到另一个文件B指针中,文件B就是文件A的硬链接

在这里插入图片描述

通过硬链接,不会产生额外的磁盘占用,并且,两个文件都能找到相同的磁盘内容

硬链接的数量没有限制,可以为同一个文件产生多个硬链接

创建硬链接

# 创建文件夹
mkdir my-pnpm
# 创建文件
touch abc.txt
# 创建文件硬链接: ln [-s] old_path new_path
ln abc.txt 123.txt

windows Vista操作系统开始,支持了创建硬链接的操作,在cmd中使用下面的命令可以创建硬链接

mklink /h 链接名称 目标文件

由于文件夹(目录)不存在文件内容,所以文件夹(目录)不能创建硬链接

由于种种原因,在windows操作系统中,通常不要跨越盘符创建硬链接

  1. 符号链接 symbol link

符号链接又称为软连接,如果为某个文件或文件夹A创建符号连接B,则B指向A。
在这里插入图片描述

创建软链接

ln -s abc.txt cba.txt

node环境对硬链接和符号链接的处理

硬链接:硬链接是一个实实在在的文件,node不对其做任何特殊处理,也无法区别对待,实际上,node根本无从知晓该文件是不是一个硬链接

符号链接:由于符号链接指向的是另一个文件或目录,当node执行符号链接下的JS文件时,会使用原始路径。

# 创建a文件夹
mkdir a
# 创建 a.js
touch a.js
# 在a.js中打印所在路径: console.log(__dirname)

# 创建 a.js文件硬链接
ln a/a.js b.js
# 运行b.js

# 创建a文件夹软链接aa
ln a aa
# 运行aa中a.js

pnpm原理

pnpm使用符号链接和硬链接来构建node_modules目录

下面用一个例子来说明它的构建方式

假设两个包a和b,a依赖b:

在这里插入图片描述

假设我们的工程为proj,直接依赖a,则安装时,pnpm会做下面的处理

  1. 查询依赖关系,得到最终要安装的包:a和b
  2. 查看a和b是否已经有缓存,如果没有,下载到缓存中,如果有,则进入下一步
  3. 创建 node_modules 目录,并对目录进行结构初始化

在这里插入图片描述

  1. 从缓存的对应包中使用硬链接放置文件到相应包代码目录中

在这里插入图片描述

  1. 使用符号链接,将每个包的直接依赖放置到自己的目录中

在这里插入图片描述

这样做的目的,是为了保证a的代码在执行过程中,可以读取到它们的直接依赖

  1. 新版本的pnpm为了解决一些书写不规范的包(读取间接依赖)的问题,又将所有的工程非直接依赖,使用符号链接加入到了 .pnpm/node_modules 中

在本例中好像没有必要,但是如果b依赖c,a又要直接用c,这种不规范的用法现在pnpm通过这种方式支持了。

但对于那些使用绝对路径的奇葩写法,可能永远也无法支持

  1. 在工程的node_modules目录中使用符号链接,放置直接依赖

在这里插入图片描述

  1. 完成
  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值