pnpm 与 node_modules:硬链接、软连接(符号链接)、Junction 速记
本文说明在 pnpm 布局下,node_modules 里常见的 硬链接、软连接(符号链接)、以及 Windows 上的 目录联接(Junction) 各是什么、各出现在哪一层,方便对照记忆。
1. 三个关键词(先对齐名字)
| 中文常叫法 | 英文 | 在说什么 |
|---|---|---|
| 软连接 / 软链接 | Symbolic link(符号链接) | 文件系统里有一项,内容是“另一段路径”;访问时转到目标路径。目标删了容易断链。 |
| (Windows 目录)联接 | Junction | 只用于目录,也是“指向另一个目录路径”,效果和目录级软链很像,实现细节与限制略有不同。 |
| 硬链接 | Hard link | 同一个文件在磁盘上只有一份数据,但有多个路径名指向它;删一个名字,只要还有别的名字,内容仍在。 |
日常口语里说的 「软连接」≈「符号链接」≈ symbolic link,和 硬链接 是两套不同机制。
2. 在 pnpm + Windows 下,大致对应关系
以本仓库为例(node_modules 顶层依赖如 axios):
-
node_modules\axios(整包目录)- 常见类型:Junction(本机实测为
Junction,不是SymbolicLink)。 - 作用:和 「目录软链」 同类——整块包目录接到本项目内的
node_modules\.pnpm\axios@<版本>\node_modules\axios\。 - 记忆:软连接那一类思路(指路),只是 Windows 常用 Junction 实现目录指路。
- 常见类型:Junction(本机实测为
-
node_modules\.pnpm\...里的目录- 一般是普通目录结构(虚拟仓库布局),不是“整个文件夹是一个硬链接”。
-
.pnpm\...\包\下面的具体文件(如README.md)- 常与全局
pnpm-store\v3\files\...里对应内容互为 硬链接,多项目同版本时共享同一份磁盘数据。 - 可用
fsutil hardlink list "<文件完整路径>"查看是否有多条路径指向同一文件。
- 常与全局
口诀:
- 目录级「软」:
node_modules\包名→ Junction → 本项目.pnpm\...(整块目录指路)。 - 文件级「硬」:
.pnpm内文件 ↔pnpm-store内文件(同内容、多路径名)。
3. 示意图
flowchart LR
subgraph concepts["概念层"]
SOFT["软连接 / 符号链接\n(及 Windows 目录 Junction)\n= 路径指路"]
HARD["硬链接\n= 同一文件多个名字"]
end
subgraph project["本项目"]
NM["node_modules/axios\n→ Junction(类软链)"]
PNPM[".pnpm/axios@x.y.z/.../axios/\n真实目录树"]
NM --> PNPM
end
subgraph store["全局 pnpm-store"]
ST["v3/files/.../哈希文件"]
end
PNPM -->|"包内文件常与之硬链接"| ST
SOFT -.->|"对应这种指路关系"| NM
HARD -.->|"对应文件与 store"| PNPM
从外到内读一条路径:
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):
Get-Item "...\node_modules\axios" | Format-List LinkType, Target
Junction或SymbolicLink:目录指路。LinkType为空:多为普通目录。
文件是否有多条硬链接:
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 结果为准。