乐闻世界logo
搜索文章和话题

How does pnpm use hard links and symbolic links to save disk space?

3月6日 21:35

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:

shell
Project 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)
标签:PNPM