1️⃣ 硬链接(Hard Link)
概念
硬链接是文件系统提供的一种机制,它允许多个文件名(路径)指向 同一个物理数据块。
- 文件内容存储在磁盘上只有一份。
- 创建硬链接不会占用额外的磁盘空间。
- 删除某一个文件名并不会删除实际数据,数据只有在 最后一个硬链接删除后 才会被释放。
在 pnpm 中的应用
pnpm 为了 节省磁盘空间和提高安装速度 ,会将依赖包存放在一个全局存储区(~/.pnpm-store
或 node_modules/.pnpm
),然后在项目的 node_modules
中用 硬链接 指向全局存储的包。
例子:
bash
~/.pnpm-store/lodash/4.17.21/node_modules/lodash
↑(硬链接)
project/node_modules/lodash
这样多个项目可以共享同一份 lodash,而不必在每个项目里都复制一份。
✅ 优点:
- 节省磁盘空间
- 安装速度快
- 真正的"同一个文件",修改一个地方,其他地方也看到(通常包都是只读,不会修改)
❌ 缺点:
- 不同文件系统之间不能硬链接
- Windows 某些版本可能需要管理员权限
2️⃣ 符号链接(Symlink / Symbolic Link)
概念
符号链接是一个特殊文件,它 本身只是一个指向另一个文件或目录的路径。
- 可以跨文件系统。
- 删除符号链接不会删除原文件,只是链接消失。
- 访问符号链接就像访问目标文件一样。
在 pnpm 中的应用
pnpm 使用符号链接主要在 工作区(workspace)开发模式下,例如你在 monorepo 中开发多个包:
- 假设
package-a
依赖package-b
,而package-b
在同一个 monorepo 中。 - pnpm 会在
package-a/node_modules/package-b
放一个符号链接,指向package-b
的源码目录,而不是复制整个包。
例子:
css
monorepo/
├─ packages/
│ ├─ package-a/node_modules/package-b -> ../../package-b
│ └─ package-b/
这样做的好处是:
- 本地开发修改立即生效,不需要重新安装依赖。
- 保持 monorepo 内包之间的正确依赖关系。
🔹 总结
类型 | pnpm 使用场景 | 优点 | 缺点/注意 |
---|---|---|---|
硬链接 | 全局存储区到项目 node_modules | 节省磁盘、加快安装、多个项目共享包 | 跨文件系统不方便、只读包更适合 |
符号链接 | 工作区开发、monorepo | 本地修改即时生效、便于调试 | 如果目标被移动,链接会失效 |