pnpm技术体系之:高性能包管理工具

简介: pnpm 是 performant npm(高性能的 npm),它是一款快速的,节省磁盘空间的包管理工具,同时,它也较好地支持了 workspace 和 monorepos。

网络异常,图片无法展示
|


认识pnpm

pnpmperformant npm(高性能的 npm),它是一款快速的,节省磁盘空间的包管理工具,同时,它也较好地支持了 workspacemonorepos,简化开发者在多包组件开发下的复杂度和开发流程。

快速

pnpm 比其他包管理器快 2 倍;

高效

node_modules 中的文件为复制或链接自特定的内容寻址存储库;

支持 monorepos

pnpm 内置支持单仓多包;

严格

pnpm 默认创建了一个非平铺的 node_modules,因此代码无法访问任意包;

pnpm 官网

pnpm优势

对于以高效、扁平化管理依赖著称的pnpm,优势不言而喻,大家可以去看看神光这篇文章《pnpm 是凭什么对 npm 和 yarn 降维打击的》

在某个 package.json 场景下,不同包管理模式的性能对比如下:

action cache lockfile node_modules npm pnpm Yarn Yarn PnP
install 33.8s 20.1s 20.3s 40.7s
install 2.1s 1.4s 2.6s n/a
install 9.1s 5.3s 7.8s 1.7s
install 13.5s 9.3s 14.1s 7.7s
install 15s 17.2s 14.2s 33.4s
install 2.5s 3s 8.8s n/a
install 2s 1.4s 8.7s n/a
install 2.5s 11.2s 14.7s n/a
update n/a n/a n/a 8.9s 12s 6.9s 14.9s

图表分析:

网络异常,图片无法展示
|

图表横坐标为安装时间(单位:秒),纵坐标为各包管理的工具在不同场景下的表现。图中可以看出,无论在缓存、版本锁制约条件下,pnpm更高效。

pnpm扁平化管理原理

网络异常,图片无法展示
|

pnpm之所以如此高效,最核心的思想就是:全局store + hard link管理

全局store好理解,说白了就是在项目的node_modules下创建一个.pnpm名称的目录,把项目中所有的依赖都安装到里面,形成一个包名 + 内部依赖 + 版本信息的序列目录列表。

网络异常,图片无法展示
|

hard link管理指的是外面的依赖包不再以实体文件的形式存在,而是创建了一个链接(有点像windows系统的快捷方式)指向store里面的指定依赖,用到该依赖包时去store里面取,如下图,@babel里面的依赖全部是hard link,真正的实体文件在.pnpm目录中。

网络异常,图片无法展示
|

pnpm monorepos模式

接下来讲下如何用pnpm来开发和管理组件,以及这样做有什么好处?

优势一:快

由于有了hard link和全局store的加持,在开发环境中编码,热更新的开发服务响应是非常快的,给开发者有良好的体验环境。

优势二:管理方便

多个组件间的调用依赖简单,举个例子:在1个pnpm monorepos工程里面有3个组件,其中playground只提供给开发者本地调试用,small-color-uiutils作为发布包,并且small-color-ui依赖utils

.packages
├── playground     #本地调试后台,不发布
├── small-color-ui #代码引用utils
└── utils          #基础包
复制代码

我们只需要把3个包在pnpm workspace注册,便能像引用远程组件那样去引入,而且支持实时本地调试。这个功能像是pnpm自动帮我们做好了npm link

优势三:解决monorepos的结构性依赖痛点

Phantom dependencies (幽灵依赖)

常见于yarn体系下,例如依赖里面有个包名叫 foofoo 里面依赖了 bar,经过 yarn 的扁平化处理,会把依赖foobarnode_modules 同一层级目录下。那么根据 nodejs 的寻径原理,用户能 requirefoo,同样也能 requirebar

这样的bar就是一个幽灵依赖,它有什么问题呢?直到某一天随着foo包升级,导致它不再依赖bar,那么在项目引用bar就会直接报错,因为根本没安装过这个包。

但这种情况不会发生在pnpm中。上面讲过pnpmnode_modules的结构是包名 + 内部依赖 + 版本信息的序列目录列表,在项目也根本没法直接require bar

依赖分身

就是说不同依赖中的子依赖同一个包,而且这个包版本还不一致,导致项目重复安装子依赖包,致增加依赖的维护成本。

网络异常,图片无法展示
|

pnpm体系下,由于所有依赖都打平到全局store里面了,所以不同版本的依赖只会安装一次,足以被整个项目所用。

当然,假如子依赖的版本不一致,pnpm还是会安装多次的,但是所有父依赖包的引用地址只会指向一处,这也弥补性能和空间上的性能缺陷。

网络异常,图片无法展示
|

写在最后

到这里我们大致了解到pnpm的优势和适用场景,下一篇文章中,会详细的、手把手教大家用pnpm monorepos技术体系搭建一个企业级可发布的简单版组件。

感谢大家阅览并欢迎纠错,欢迎大家关注本人公众号「似马非马」,一起玩耍起来!🌹🌹

相关文章
|
9月前
|
资源调度 前端开发 JavaScript
构建高效前端项目:现代包管理器与模块化的深度解析
【2月更文挑战第21天】 在当今快速演变的前端开发领域,高效的项目管理和代码组织已成为成功交付复杂Web应用的关键。本文将深入探讨现代前端包管理器如npm, yarn和pnpm的工作原理,以及它们如何与模块化编程实践(例如CommonJS、ES6模块)协同工作以优化开发流程。我们将剖析这些工具的内部机制,了解它们如何解决依赖冲突,提高安装速度,并保证项目的健壮性。同时,本文还将介绍模块化编程的最佳实践,包括代码拆分、重用和版本控制,帮助开发者构建可维护且性能卓越的前端项目。
|
存储 缓存 资源调度
研究一下「pnpm」这个神奇的包管理工具
研究一下「pnpm」这个神奇的包管理工具
660 0
|
JavaScript 前端开发 iOS开发
《智能前端技术与实践》——第1章 开发环境配置——1.3 安装 npm 包管理工具
《智能前端技术与实践》——第1章 开发环境配置——1.3 安装 npm 包管理工具
137 0
|
运维 供应链 前端开发
化繁为简,如何快速实现企业级私有 npm 包依赖管理服务?
化繁为简,如何快速实现企业级私有 npm 包依赖管理服务?
156 0
|
存储 缓存 前端开发
企业级包管理服务 cnpmcore
企业级包管理服务 cnpmcore
287 0
|
存储 缓存 前端开发
pnpm技术体系之:打造企业级 pnpm 开源组件
pnpm 是 performant npm(高性能的 npm),它是一款快速的,节省磁盘空间的包管理工具,同时,它也较好地支持了 workspace 和 monorepos,简化开发者在多包组件开发下的复杂度和开发流程。
pnpm技术体系之:打造企业级 pnpm 开源组件
|
JavaScript 前端开发 Java
微服务项目:尚融宝(12)(前端平台:NPM包管理器)
2020年3月17日,Github宣布收购npm,GitHub现在已经保证npm将永远免费。
微服务项目:尚融宝(12)(前端平台:NPM包管理器)
|
开发框架 JavaScript 前端开发
新一代组件/库构建工具 father 4 RC 发布啦 🎈
新一代组件/库构建工具 father 4 RC 发布啦 🎈
651 0
新一代组件/库构建工具 father 4 RC 发布啦 🎈
|
JSON JavaScript 前端开发
前端技术-npm 包管理工具 | 学习笔记
简介:快速学习前端技术-npm 包管理工具
178 0
|
缓存 Java 项目管理
新一代包管理工具PDM
新一代包管理工具PDM
604 0