pnpm achieves efficient disk space utilization through a combination of hard links and symbolic links:
Hard Links
Hard links are multiple references to the same file in the file system.
bash# pnpm's hard link mechanism # Global store location ~/.pnpm-store/v3/files/00/abc123... # Actual file # Hard links in projects 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 # Both point to the same physical file, no extra space used
Characteristics:
- Multiple hard links share the same inode
- Deleting one link doesn't affect others
- Changes reflect across all links
Symbolic Links (Soft Links)
Symbolic links are special files pointing to file paths.
bash# pnpm's symbolic link structure node_modules/lodash -> .pnpm/lodash@4.17.21/node_modules/lodash # This is a symbolic link pointing to a relative path
Characteristics:
- Similar to shortcuts
- Can cross file systems
- Link becomes invalid if original file is deleted
pnpm's Combined Usage:
shellProject Structure: node_modules/ ├── lodash -> .pnpm/lodash@4.17.21/node_modules/lodash [Symbolic Link] └── .pnpm/ └── lodash@4.17.21/node_modules/ └── lodash.js [Hard Link → Global Store]
Practical Effect:
javascript// Verify hard links by checking 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, same inode
Space Saving Example:
shell# npm approach: 10 projects using lodash 10 × 1.4MB = 14MB # pnpm approach: 10 projects using lodash 1 × 1.4MB = 1.4MB (90% saved)