当前位置: 首页 > article >正文

pnpm的指令和优点

pnpm 命令

|  npm 命令 | pnpm 等价命令 | 
|:-----|-----:|
|npm install	 |  pnpm install  |   
|npm i <pkg>  |  pnpm add <pkg>  |   
|npm run <cmd> |  pnpm <cmd>  |   

pnpm的优点

npm2 是通过嵌套的方式管理 node_modules 的,会有同样的依赖复制多次的问题。

npm3+ 和 yarn 是通过铺平的扁平化的方式来管理 node_modules,解决了嵌套方式的部分问题,但是引入了幽灵依赖的问题,并且同名的包只会提升一个版本的,其余的版本依然会复制多次。

pnpm 则是用了另一种方式,不再是复制了,而是都从全局 store 硬连接到 node_modules/.pnpm,然后之间通过软链接来组织依赖关系。

这样不但节省磁盘空间,也没有幽灵依赖问题,安装速度还快,从机制上来说完胜 npm 和 yarn。
pnpm 就是凭借这个对 npm 和 yarn 降维打击的。

pnpm软链接和硬链接

软链接

在计算机中我们文件夹中的文件实际上是一个指针,但这个指针并不是直接指向我们在磁盘中存储文件的位置,而是指向一个 inode 块,inode 中存储着文件在磁盘中的各种信息,一般我们的文件都是指向 对应文件的 inode,我们把这类链接成为硬链接,但是还有一种链接,它存储的并不是实际的值,而是另一个硬链接的地址,我们把这类链接成为软链接。

硬链接特点

具有相同inode节点号的多个文件互为硬链接文件;
删除硬链接文件或者删除源文件任意之一,文件实体并未被删除;
只有删除了源文件和所有对应的硬链接文件,文件实体才会被删除;
硬链接文件是文件的另一个入口;
可以通过给文件设置硬链接文件来防止重要文件被误删;
创建硬链接命令 ln 源文件 硬链接文件;
硬链接文件是普通文件,可以用rm删除;
对于静态文件(没有进程正在调用),当硬链接数为0时文件就被删除。注意:如果有进程正在调用,则无法删除或者即使文件名被删除但空间不会释放。

软链接特点

软链接类似windows系统的快捷方式;
软链接里面存放的是源文件的路径,指向源文件;
删除源文件,软链接依然存在,但无法访问源文件内容;
软链接失效时一般是白字红底闪烁;
创建软链接命令 ln -s 源文件 软链接文件;
软链接和源文件是不同的文件,文件类型也不同,inode号也不同;
软链接的文件类型是“l”,可以用rm删除。

可以看到 node_modules 结构非常清晰,但是这个 express 文件夹只是一个软链接, 它的真正存储的地方在图中的 .pnpm 文件夹中。

pnpm 为什么要使用软链接和硬链接

pnpm 的软链接

这样的通过软链接的设计既保证了不会出现幽灵依赖的问题,同时也能兼容 node 的寻找模块方式。
所以说 pnpm 的软链接就是将 node_modules 里的文件软链接到对应的 .pnpm/[package_name]@version/node_modules/[package_name] 中。

pnpm 的硬链接

pnpm 有个根目录,一般都是保存在 user/.pnpm-store 下,pnpm 通过硬链接的方式保证了相同的包不会被重复下载,比如说我们已经在 repoA 中下载过一次 express@4.17.1 版本,那我们后续在 repoB 中安装 express@4.17.1 的时候是会被复用的,具体就是 repoA 中的 express 中的文件和 repoB 中的 express 中的文件指向的是同一个 inode


http://www.kler.cn/a/540753.html

相关文章:

  • 第三节 docker基础之---Commit+Dockerfile制作
  • 2025影视泛目录站群程序设计_源码二次开发新版本无缓存刷新不变实现原理
  • 使用 SDKMAN! 在 Mac(包括 ARM 架构的 M1/M2 芯片)上安装 Java 8
  • 灵巧手技术全景解析:从仿生设计到智能控制
  • RestTemplate Https 证书访问错误
  • kafka专栏解读
  • 阿里AI通义千问官网入口、APP下载,使用教程
  • 本地部署deepseek-r1:7b模型
  • 8、Python 面试题解析:实例方法、静态方法和类方法的区别
  • w~自动驾驶~合集17
  • C#程式状态机及其Godot实践
  • Docker的深入浅出
  • 如何利用DeepSeek结合深度学习与NLP技术,实现跨模态搜索的语义理解与个性化推荐
  • Firefox无法隐藏标题栏
  • 单片机成长之路(51基础篇) - 008 C51 的标示符和关键字
  • Tauri教程-实战篇-第六节 托盘、请求完善
  • VSCode中出现“#include错误,请更新includePath“问题,解决方法
  • Jsoniter Unmarshal类型错误的友好提示
  • Segformer模型的平台部署和项目应用
  • N-Beats:一种用于时间序列预测的纯前馈神经网络模型
  • 仿 RabbitMQ 实现的简易消息队列
  • 【Docker】从技术架构到容器实战{空间隔离/资源控制/LXC容器/mount}
  • Git冲突解决技巧
  • 日常吐槽。
  • PostgreSQL的学习心得和知识总结(一百六十七)|深入理解PostgreSQL数据库之静态语法检查工具PgSanity的使用和实现
  • 示波器使用指南