pnpm 通过硬链接和符号链接的组合实现高效的磁盘空间利用:
硬链接(Hard Links)
硬链接是指向文件系统中同一文件的多个引用。
bash# pnpm 的硬链接机制 # 全局 store 位置 ~/.pnpm-store/v3/files/00/abc123... # 实际文件 # 项目中的硬链接 project-a/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash.js project-b/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash.js # 两者都指向同一个物理文件,不占用额外空间
特点:
- 多个硬链接共享同一个 inode
- 删除一个链接不影响其他链接
- 修改会反映到所有链接
符号链接(Symbolic Links/Soft Links)
符号链接是指向文件路径的特殊文件。
bash# pnpm 的符号链接结构 node_modules/lodash -> .pnpm/lodash@4.17.21/node_modules/lodash # 这是一个指向相对路径的符号链接
特点:
- 类似于快捷方式
- 可以跨文件系统
- 原文件删除后链接失效
pnpm 的组合使用:
shell项目结构: node_modules/ ├── lodash -> .pnpm/lodash@4.17.21/node_modules/lodash [符号链接] └── .pnpm/ └── lodash@4.17.21/node_modules/ └── lodash.js [硬链接 → 全局 store]
实际效果:
javascript// 查看 inode 验证硬链接 const fs = require('fs'); const stat1 = fs.statSync('project-a/node_modules/.pnpm/lodash@4.17.21/lodash.js'); const stat2 = fs.statSync('project-b/node_modules/.pnpm/lodash@4.17.21/lodash.js'); console.log(stat1.ino === stat2.ino); // true,同一个 inode
空间节省示例:
shell# npm 方式:10个项目使用 lodash 10 × 1.4MB = 14MB # pnpm 方式:10个项目使用 lodash 1 × 1.4MB = 1.4MB(节省 90%)