npm 对比 pnpm

文章探讨了PNPM与npm在模块访问控制、磁盘空间利用(通过符号链接和硬链接减少重复)以及安装速度上的优势,特别强调了PNPM在大型monorepo项目中的适用性。
摘要由CSDN通过智能技术生成

一、模块访问

分析

我们可以直观地看到项目中 node_modules 里的包数量是远大于 package.json 中的依赖数量的。这是因为我们直接显示依赖的包,它自己还会有其他依赖。

对于使用 npm 来管理包的项目来说,我们是可以在代码中去使用 node_modules 里的依赖的。但这存在不稳定性或者说增加了项目的安全风险。

举个例子,如果我们的项目依赖于一个 A 包,A 包又依赖于一个 B 包,在项目中,我们只在 package.json 中声明了对 A 的依赖,而没有声明对 B 的依赖。由于 npm 是允许我们访问 B 包的,当我们在项目中直接使用了 B 包,而未来 A 包如果发布了新版本,B 包有了破坏性更改或者说不再依赖于 B 包了,我们的项目升级了 A 包后就会突然出现故障,而你可能想不起来你用了 B 包这个事。

除了这个幽灵依赖的问题,还有依赖地域、模块解析不一致等其他问题。

总结

npm 可以访问它们没有在 'package.json' 中显示依赖的包。

pnpm 使用(半)严格的 node_modules 结构来防止访问未声明的包。

二、磁盘空间

符号链接(symlinks)

符号链接本身是一个特殊的文件类型。

pnpm 通过使用符号链接的方式仅将项目的直接依赖项添加到 node_modules 的根目录下。

符号链接可以跨文件系统创建,可以指向不同系统中的文件或目录。

如果原始文件被删除或移动,符号链接会变成悬空。这类似于 Windows 中的快捷方式,如果目标文件被删除了,这个链接就会失效。

硬链接(hard links)

在 pnpm 管理的项目中,相同的包版本不会在磁盘中重复保存,所有的包都存储在一个全局存储空间。当项目需要某个包时,pnpm 会在项目的 node_modules 目录中创建指向全局存储中相应文件的硬链接。

创建一个硬链接时,实际上时创建了一个引用。对于硬链接,数据只有在所有指向它的引用都被删除时才会被真正删除。

如何理解

可以想象我们的全局存储相当于一个图书馆,里面的书就是一个个包。每本书都有唯一一个编号(包的版本)。现在有很多人(项目)想要借阅书来阅读。

符号链接就像是一个包含书籍位置信息的便签,它需要额外的存储空间来保存这些信息。如果你想要借书,图书馆就会给你一张便签,你通过这个便签去找书。图书馆如果更改了图书的位置,只要更新便签信息就可以了,不需要真正移动书,它允许项目以灵活的方式来访问依赖。

硬链接就像给借阅者提供一本书的复制品(想象它是一个引用),复制品都指向同一本原书,图书馆也只要保留一本原书就可以,实际上占空间的也只有这一本书的大小,来一个人借阅,就给他一个复制品。

npm 主要是通过复制文件的方式来管理依赖,pnpm 就是使用了符号链接和硬链接来处理依赖,所以 pnpm 更节省磁盘空间。

三、安装速度

pnpm 在包安装速度方面通常优于 npm 和 yarn。

四、对monorepo的支持

pnpm 对大型 monorepo 项目提供了良好的支持,这对于管理多个包的项目来说是一个重要的优势。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下命令来安装pnpm: npm install pnpm -g。 另外,如果你已经存在锁定文件,脚本会自动选择正确的程序包管理器(yarn,npm或pnpm)来运行。对于npm,如果package.json中存在相关脚本,它将使用npm run来运行。否则,将使用npx --no-install。 如果你想配置pnpm store的路径,***"。 最后,以下是一些常见的pnpm命令: - 下载安装依赖包: pnpm install XXX 或者 pnpm i XXX - 添加包到dependencies: pnpm add XXX -S - 添加包到devDependencies: pnpm add -D XXX - 全局安装包: pnpm add -g XXX - 移除包: pnpm remove XXX - 移除全局包: pnpm remove XXX --global - 更新所有依赖项: pnpm up - 更新指定包: pnpm upgrade XXX - 更新全局包: pnpm upgrade XXX --global <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [使用npm安装pnpm包管理器](https://blog.csdn.net/weixin_48826306/article/details/131345572)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [package-run:以编程方式运行package.json脚本。 支持yarn,npm和pnpm](https://download.csdn.net/download/weixin_42125826/16733130)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值