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 本地修改即时生效、便于调试 如果目标被移动,链接会失效
相关推荐
我来整一篇19 小时前
[Razor] ASP.NET Core MVC 前端组件快速使用总结
前端·asp.net·mvc
P7Dreamer19 小时前
微信小程序处理Range分片视频播放问题:前端调试全记录
前端·微信小程序
RedHeartWWW19 小时前
初识next-auth,和在实际应用中的几个基本场景(本文以v5为例,v4和v5的差别主要是在个别显式配置和api,有兴趣的同学可以看官网教程学习)
前端·next.js
C_心欲无痕19 小时前
前端页面中,如何让用户回到上次阅读的位置
前端
C_心欲无痕19 小时前
前端本地开发构建和更新的过程
前端
Mintopia19 小时前
🌱 一个小而美的核心团队能创造出哪些奇迹?
前端·人工智能·团队管理
蚊道人19 小时前
Nuxt 4 学习文档
前端·vue.js
悠哉摸鱼大王19 小时前
前端音视频学习(一)- 基本概念
前端
stella·20 小时前
后端二进制文件,现代前端如何下载
前端·ajax·状态模式·axios·request·buffer·download
奋斗猿20 小时前
Less vs Scss 全解析:从语法到实战的前端样式预处理器指南
前端