pnpm 的原理

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

pnpm 原理


概念


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


1.文件的本质


在操作系统中,文件实际上是一个指针,只不过它指向的不是内存地址,而是一个外部存储地址(这里的外部存储可以是硬盘、U盘、甚至是网络)


20200626193818310.png


当我们删除文件时,删除的实际上是指针,因此,无论删除多么大的文件,速度都非常快。


20200626193840286.png


2.文件的拷贝


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


20200626193908800.png


3.硬链接 hard link


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


20200626193932955.png


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


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


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


mklink /h 链接名称 目标文件


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


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


4.符号链接 symbol link


符号链接又称为软连接,如果为某个文件或文件夹A创建符号连接B,则B指向A。


20200626194001119.png


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


mklink /d 链接名称 目标文件
# /d表示创建的是目录的符号链接,不写则是文件的符号链接


早期的windows系统不支持符号链接,但它提供了一个工具junction来达到类似的功能


符号链接和硬链接的区别


1.硬链接仅能链接文件,而符号链接可以链接目录

2.硬链接在链接完成后仅和文件内容关联,和之前链接的文件没有任何关系。而符号链接始终和之前链接的文件关联,和文件内容不直接相关


5.快捷方式

快捷方式类似于符号链接,是windows系统早期就支持的链接方式。


它不仅仅是一个指向其他文件或目录的指针,其中还包含了各种信息:如权限、兼容性启动方式等其他各种属性


由于快捷方式是windows系统独有的,在跨平台的应用中一般不会使用


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


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


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


pnpm原理


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


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


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


20200626194033727.png


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


1.查询依赖关系,得到最终要安装的包:a和b

2.查看a和b是否已经有缓存,如果没有,下载到缓存中,如果有,则进入下一步

3.创建 node_modules 目录,并对目录进行结构初始化


20200626194100449.png


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


20200626194123721.png


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


20200626194233304.png


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


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


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


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


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


20200626194253620.png


8.完成


来源:渡一教育

相关文章
|
2月前
|
资源调度 JavaScript 前端开发
如何实现一个类似 vite 的脚手架并发布 npm
本文介绍了如何实现一个类似 Vite 的脚手架工具。通过详细解析和实践,文章分享了从零开始构建脚手架的过程,包括技术选型、开发步骤及发布 NPM 包的完整流程。最终目标是让用户能够通过 `yarn create electron-prokit myapp` 快速搭建 Electron 项目。项目源码可在 GitHub 上获取。
31 5
|
6月前
npm构建vite项目
npm构建vite项目
|
6月前
|
存储 缓存 资源调度
你真的知道 NPM、Yarn 与 PNPM 这三个前端包管理器之间的区别吗?
【6月更文挑战第9天】NPM、Yarn和PNPM是主流前端包管理器,各有特色。NPM生态庞大,易用但速度慢;Yarn速度快,依赖管理稳定;PNPM性能优异,节省磁盘空间。Yarn和PNPM在速度和确定性上胜出,NPM因广泛使用和丰富资源领先。开发者可根据项目需求和喜好选择,三者共同推动前端开发进步。
158 8
|
7月前
|
资源调度
pnpm 用法
pnpm 用法
63 0
|
7月前
|
存储 资源调度 JavaScript
PNPM(高性能的npm)介绍
PNPM(高性能的npm)介绍
PNPM(高性能的npm)介绍
|
7月前
|
缓存 JavaScript 算法
Nodejs 第四章(Npm install 原理)
Nodejs 第四章(Npm install 原理)
84 0
|
7月前
|
JSON JavaScript Unix
Nodejs 第五章(Npm run 原理)
Nodejs 第五章(Npm run 原理)
88 0
|
JavaScript
vue踩坑记-在项目中安装依赖模块npm install报错
vue踩坑记-在项目中安装依赖模块npm install报错
104 0
|
存储 资源调度 安全
你知道npm、yran、pnpm的区别吗?
你知道npm、yran、pnpm的区别吗?
100 0
|
JavaScript 前端开发
npm模块的安装机制
npm模块的安装机制
103 0