pnpm 中的硬链接(hard link)和符号链接(symlink)

1️⃣ 硬链接(Hard Link)

概念

硬链接是文件系统提供的一种机制,它允许多个文件名(路径)指向 同一个物理数据块

  • 文件内容存储在磁盘上只有一份。
  • 创建硬链接不会占用额外的磁盘空间。
  • 删除某一个文件名并不会删除实际数据,数据只有在 最后一个硬链接删除后 才会被释放。

在 pnpm 中的应用

pnpm 为了 节省磁盘空间和提高安装速度 ,会将依赖包存放在一个全局存储区(~/.pnpm-storenode_modules/.pnpm),然后在项目的 node_modules 中用 硬链接 指向全局存储的包。

例子:

bash 复制代码
~/.pnpm-store/lodash/4.17.21/node_modules/lodash
   ↑(硬链接)
project/node_modules/lodash

这样多个项目可以共享同一份 lodash,而不必在每个项目里都复制一份。

优点

  • 节省磁盘空间
  • 安装速度快
  • 真正的"同一个文件",修改一个地方,其他地方也看到(通常包都是只读,不会修改)

缺点

  • 不同文件系统之间不能硬链接
  • Windows 某些版本可能需要管理员权限

概念

符号链接是一个特殊文件,它 本身只是一个指向另一个文件或目录的路径

  • 可以跨文件系统。
  • 删除符号链接不会删除原文件,只是链接消失。
  • 访问符号链接就像访问目标文件一样。

在 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 本地修改即时生效、便于调试 如果目标被移动,链接会失效
相关推荐
qq_5896660514 小时前
TypeScript 完整入门教程
前端·javascript·typescript
用户0595401744617 小时前
LLM对话记忆测试踩坑实录:手工回归30分钟,自动化后2分钟发现3个隐藏Bug
前端·css
Ashley的成长之路18 小时前
前端性能优化实战手册·第2篇:资源加载策略全解
前端·性能优化·资源加载·http/3·性能优化实战·资源加载优化
浅水壁虎18 小时前
vue基础(第二章 )
前端·javascript·vue.js
界面开发小八哥18 小时前
界面控件DevExtreme v26.1新版亮点——支持Angular 22
前端·javascript·angular.js·devexpress·ui开发·devextreme
Getflare18 小时前
前端 + UI 设计 + AI:这不是三个工种,是一个新三角能力模型(附自检清单)
前端·人工智能·ui
oil欧哟18 小时前
我做了一个 Vibe Coding 术语学习站:VibeHub
前端·ai·agent·独立开发·vibe coding
审小匠OpenCPAi19 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
Revolution6119 小时前
一个公共表格组件,是怎么一步步失控的
前端·前端工程化