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

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

相关推荐
Flynt3 天前
npm v12 来了:allowScripts 默认关闭,我的项目差点跑不起来
安全·npm·node.js
JuliusDeng5 天前
一文搞懂 `.npmrc`:npm 源、SSL 与 `_authToken` 配置避坑
npm·前端工程化
kyriewen9 天前
2026 年了,这 6 个 npm 包可以卸载了——浏览器原生 API 已经能替代
前端·javascript·npm
大家的林语冰11 天前
ES5 凉凉,Babel 8 正式发布,默认不再编译为 ES5 和 CJS......
前端·javascript·前端工程化
jump_jump12 天前
流式 HTML:从 htmx 片段装配到浏览器原生增量渲染
javascript·性能优化·前端工程化
大家的林语冰12 天前
ESLint 近期动态大全,新版本正式发布,antfu 大佬推荐的插件也更新了!
前端·javascript·前端工程化
英勇无比的消炎药16 天前
体积瘦身TinyVue打包优化与按需加载实践
vue.js·前端工程化
l1o3v1e4ding16 天前
windows安装Claude Code,并接入Deepseek-v4模型 ,提供离线安装包
git·npm·node.js·claude code·cc-switchcc
TT_Close17 天前
别再复制旧 Flutter 工程了,真正拖慢你的不是业务代码
flutter·npm·visual studio code
Penfy_Z17 天前
【Python LLM 调用踩坑】Connection error 终极解决方案!npm 代理导致阿里云通义千问接口连接失败
开发语言·python·npm