pnpm 与 node_modules:硬链接、软连接(符号链接)、Junction 速记

pnpm 与 node_modules:硬链接、软连接(符号链接)、Junction 速记

本文说明在 pnpm 布局下,node_modules 里常见的 硬链接 、软连接(符号链接) 、以及 Windows 上的 目录联接(Junction) 各是什么、各出现在哪一层,方便对照记忆。


1. 三个关键词(先对齐名字)

中文常叫法 英文 在说什么
软连接 / 软链接 Symbolic link(符号链接) 文件系统里有一项,内容是"另一段路径" ;访问时转到目标路径 。目标删了容易断链。
(Windows 目录)联接 Junction 只用于目录 ,也是"指向另一个目录路径",效果和目录级软链很像,实现细节与限制略有不同。
硬链接 Hard link 同一个文件 在磁盘上只有一份数据,但有多个路径名 指向它;删一个名字,只要还有别的名字,内容仍在。

日常口语里说的 「软连接」≈「符号链接」≈ symbolic link ,和 硬链接 是两套不同机制。


2. 在 pnpm + Windows 下,大致对应关系

以本仓库为例(node_modules 顶层依赖如 axios):

  1. node_modules\axios(整包目录)

    • 常见类型:Junction (本机实测为 Junction,不是 SymbolicLink)。
    • 作用:和 「目录软链」 同类------整块包目录 接到本项目内的
      node_modules\.pnpm\axios@<版本>\node_modules\axios\。
    • 记忆:软连接那一类思路(指路),只是 Windows 常用 Junction 实现目录指路。
  2. node_modules\.pnpm\... 里的目录

    • 一般是普通目录结构(虚拟仓库布局),不是"整个文件夹是一个硬链接"。
  3. .pnpm\...\包\ 下面的具体文件 (如 README.md)

    • 常与全局 pnpm-store\v3\files\... 里对应内容互为 硬链接 ,多项目同版本时共享同一份磁盘数据。
    • 可用 fsutil hardlink list "<文件完整路径>" 查看是否有多条路径指向同一文件。

口诀:

  • 目录级「软」 :node_modules\包名 → Junction → 本项目 .pnpm\...(整块目录指路)。
  • 文件级「硬」 :.pnpm 内文件 ↔ pnpm-store 内文件(同内容、多路径名)。

3. 示意图

全局 pnpm-store
本项目
概念层
包内文件常与之硬链接
对应这种指路关系
对应文件与 store
软连接 / 符号链接

(及 Windows 目录 Junction)

= 路径指路
硬链接

= 同一文件多个名字
node_modules/axios

→ Junction(类软链)
.pnpm/axios@x.y.z/.../axios/

真实目录树
v3/files/.../哈希文件

从外到内读一条路径:

text 复制代码
node_modules/axios/README.md
        │
        │  Junction(目录级「软」思路:axios 文件夹指向 .pnpm 里那一包)
        ▼
.pnpm/axios@1.7.2/node_modules/axios/README.md
        │
        │  硬链接:与 pnpm-store/v3/files/... 常共享同一块数据
        ▼
pnpm-store/v3/files/.../(内容寻址,无友好文件名)

4. 本机如何自查

目录是不是「软」类链接(含 Junction / SymbolicLink):

powershell 复制代码
Get-Item "...\node_modules\axios" | Format-List LinkType, Target
  • Junction 或 SymbolicLink:目录指路。
  • LinkType 为空:多为普通目录。

文件是否有多条硬链接:

powershell 复制代码
fsutil hardlink list "...\node_modules\.pnpm\axios@1.7.2\node_modules\axios\README.md"

多行输出表示多个路径名指向同一份文件数据。


5. 易混点

  • 软连接 ≠ .lnk 快捷方式 :.lnk 是壳层文件;软链/Junction 是文件系统层面的重解析,多数程序会跟随解析。
  • 「node_modules 根下全是软链」不严谨 :是顶层依赖包名那一级目录常为 Junction;不是根下每个零散文件各一条链。
  • Linux/macOS 上 pnpm 可能多用 symbolic link ;Windows 上常见 Junction ,理解时都可归入「目录指路」这一类,与 硬链接(文件去重) 区分开即可。

文档随本仓库 pnpm 默认行为整理;实际以本机 Get-Item / fsutil 结果为准。

相关推荐
小码哥_常3 分钟前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮2 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀4 小时前
Vue插槽
前端·javascript·vue.js
qq_448011164 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan4 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352905 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝5 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing036 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel6 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放7 小时前
Python基础语法练习题(73)
java·前端·python