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

6 阅读3分钟

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. 示意图

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
  • JunctionSymbolicLink:目录指路。
  • 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 linkWindows 上常见 Junction,理解时都可归入「目录指路」这一类,与 硬链接(文件去重) 区分开即可。

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