软链接&硬链接及其在前端中的应用

在网友疯狂吹捧pnpm牛逼的氛围中,逐步了解了npm历史以及它的短板. 反之也是pnpm的优势之一减少依赖包的反复安装. 其实现的基础是因为计算机底层的文件系统支持软链和硬链. 顺带整理一下.

随便进入到一个文件夹内,输入以下命令查看文件的详细信息:

bash 复制代码
ls -li

第一项这一串数字叫做索引节点(inode) ,在文件系统中,保存在磁盘分区中的文件,不管是什么类型,系统都会给他分配一个编号它是该文件或者目录在系统中的唯一标识.

硬链接

创建硬链接对应操作系统的命令是:

go 复制代码
// ln <target> <hardlink>
ln package.json package.hard.json

可以看到生成的package.hard.json文件的inode(130833506)没有变且文件类型等元数据都跟package.json相同,这种方式创建的package.hard.json就是硬链接.

特点:

  • 两个文件的inode信息相同,其他信息也完全相同
  • 每多一个文件指向改inode,链接数就会+1。当值减到 0,系统就自动回收 inode 及其对应的 block 区域

与源文件的关系:

软链接

同样创建软链接加上-s (soft)参数就行:

go 复制代码
ln -s package.json package.symlink.json

可以看到创建的package.symlink.json有不同的inode,因为内部只存储了一个链接信息所以文件大小也相对较小!

特点:

  • 软链接和源文件是不同的inode,其他信息也不同
  • 软链接文件只是存储了一个链接信息,所以文件size很小

与源文件的关系:

总结

软链接和硬链接通过不同的方式来减少磁盘空间 (都可减少磁盘空间占用),可以使用du -sh 命令查看文件夹总大小,系统右键查看文件总大小不可靠.

软链接 硬链接
inode 软链接与源文件拥有不同的inode,是两个不同的文件 硬链接和源文件拥有同一个inode,它们其实互为硬链接
文件属性 链接文件 与源文件类型相同
跨文件系统建立 支持 不支持
链接数目 (也就是文件信息中的nlink) nlink不会随着软链接数目增加 每增加一个两链接nlink也会加1
删除源文件 软链接无法正常访问 硬链接文件可正常访问
应用 1. pnpm中解决幻影依赖的场景2. 快捷方式 3.文件替身 文件备份防误删

前端应用

npm/yarn link: 软链接的使用

pnpm: 硬链接、软链接都用

npm link原理

创建一个空目录,该目录下有两个项目,projectA和projectB, projectB中导出一个方法:

接下来我希望pA能使用pB导出的方法,由于Node.js 不支持直接从目录中导入 ES 模块.

所以除了将pB发布成npm包之外,另外的方法就是pA link pB.

link成功之后可以在pA的node_modules中看到pB(右侧有一个软链接的符号)

ok,整体感官上就是这样,现在我想知道在pB中执行npm link,和pA中执行npm link projectb 分别做了什么事情.

首先我们查找一下npm 全局的安装位置 which npm,mac 一般会安装在/usr/local/lib/node_modules目录下.

可以发现全局node_modules下多了一个projectb, 根据上边软链接的特点,了解到projectb

其实是一个软链接文件(lrwxr-xr-x中的l即表示软链接),真实的源文件是后边那个,也就是我执行npm link时的目录.所以:

  • 在pB中执行npm link时,会在全局的node_modules中创建一个pB的软链接文件

会在pA的node_modules中创建名称为projectb的软链接文件

链接指向全局node_modules/projectb

所以:

  • 在pA中执行npm link projectb时,会在pA/node_modules下创建一个软链接文件,它指向的是全局的软链接文件,而非pB源文件

记住几个目录,在查看软链指向的时候会疯狂使用到:

全局: /usr/local/lib/node_modules

项目内: pA/node_modules

问题

Q1: 如果不使用link,直接在pA/node_modules下手动创建一个名为pB的软链接文件,代码能正常运行吗?

A:是的,link原理就是这样,但需要注意手动创建软链接时,目录尽量使用绝对路径!


参考:

blog.csdn.net/LEON1741/ar...

软链接&硬链接在前端中的应用

浅谈 pnpm 软链接和硬链接

相关推荐
蜜獾云4 小时前
npm淘宝镜像
前端·npm·node.js
dz88i84 小时前
修改npm镜像源
前端·npm·node.js
小王码农记10 小时前
解决npm publish发布包后拉取时一直提示 Couldn‘t find any versions for “包名“ that matches “版本号“
前端·npm·node.js
樊南2 天前
npm安装electron依赖时卡顿,下载不下来
前端·electron·npm
没头发的卓卓3 天前
pnpm--他简直是超人!
前端·npm·前端工程化
changingshow3 天前
vue create 创建项目 提示 Failed to check for updates 淘宝 NPM 镜像站喊你切换新域名啦
javascript·vue.js·npm
【D'accumulation】3 天前
NPM国内镜像源多选择与镜像快速切换工具(nrm)介绍
前端·npm·node.js
野生派蒙3 天前
NVM:安装配置使用(详细教程)
前端·npm·node.js
Asurplus3 天前
【VUE】13、安装nrm管理多个npm源
npm·node.js·nvm·nrm
跳跳的向阳花4 天前
01、NodeJS学习笔记,第一节:Node.js初识与内置模块
学习·npm·node.js·模块化··内置模块·模块加载机制