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

在网友疯狂吹捧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 软链接和硬链接

相关推荐
三十而立洋21 小时前
前端模块化的演进:从全局变量到 Import Maps
前端·javascript·前端工程化
LRL_3 天前
跨平台 Node 模块安装指南:如何利用 pnpm/npm 配置`supportedArchitectures` 锁定平台依赖
前端·npm·node.js
guslegend5 天前
脚手架原理与本地调试:从 bin 软链接到 npm link
前端·npm·node.js·脚手架·前端工程化
guslegend7 天前
脚手架入门:必要性、核心功能与执行原理
前端·架构·node.js·脚手架·前端工程化
孟陬7 天前
#教程 dw, dm, dy, d18m 是何意?万物可 Badge | 定制漂亮精致小徽章,打造眼前一亮 README
npm·github
hasty10 天前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
DsirNg11 天前
断点不该认识设备:组件布局的容器状态治理
css·前端工程化·组件化·响应式布局·css grid·设计系统·container queries
玖石书12 天前
HiSH 通过 apk 安装 Node.js、npm 与 pnpm
npm·node.js·鸿蒙·hish
FACELESS VOID12 天前
wsl下使用npm,错误识别到了windows下的npm
linux·windows·npm
搬砖的小码农_Sky13 天前
AI Agent:Windows上Node.js安装后 npm -v报错
前端·npm·node.js·人机交互