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技术体系搭建一个企业级可发布的简单版组件。

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

相关文章
|
8月前
|
搜索推荐 Go 开发者
Go模块与依赖管理:构建稳定、可维护的项目生态
【2月更文挑战第9天】Go模块是Go语言从1.11版本开始引入的一个新的依赖管理工具,它改变了以往通过GOPATH管理项目依赖的方式,为Go开发者带来了更加灵活、高效的依赖管理方式。本文将深入探讨Go模块与依赖管理的概念、使用方法和最佳实践,帮助读者更好地理解和应用Go模块,构建稳定、可维护的项目生态。
|
3月前
|
缓存 资源调度 前端开发
前端研发链路之包管理器
本文首发于微信公众号“前端徐徐”。作者徐徐将探讨前端研发链路中的包管理器,分析 Npm、Yarn 和 Pnpm 的特点与应用场景,帮助开发者选择最适合项目的包管理工具,提升开发效率和项目稳定性。文章涵盖包管理器的基本概念、解决的问题、组成部分及各工具的优缺点对比。
47 2
|
存储 缓存 资源调度
研究一下「pnpm」这个神奇的包管理工具
研究一下「pnpm」这个神奇的包管理工具
637 0
|
8月前
|
Rust 开发者
Rust中的模块与包管理:构建高效、可扩展的代码库
本文详细阐述了Rust编程语言中模块与包管理的概念、特点和使用方法。通过深入了解模块与包的概念、组织方式、导入导出机制以及Rust的Cargo工具,我们将学会如何构建高效、可扩展的代码库,提高代码的可读性、可维护性和可重用性。
|
数据采集 监控 Go
构建企业上网监控软件的基础设施:Golang实战
企业面临着不断增长的网络威胁,为了保障网络安全,上网监控成为不可或缺的一环。本文将介绍如何使用Golang实战构建企业上网监控软件的基础设施,通过简洁高效的代码示例,演示监控数据的收集和处理过程。
250 0
|
JavaScript 前端开发 iOS开发
《智能前端技术与实践》——第1章 开发环境配置——1.3 安装 npm 包管理工具
《智能前端技术与实践》——第1章 开发环境配置——1.3 安装 npm 包管理工具
133 0
|
运维 供应链 前端开发
化繁为简,如何快速实现企业级私有 npm 包依赖管理服务?
化繁为简,如何快速实现企业级私有 npm 包依赖管理服务?
147 0
|
存储 缓存 前端开发
企业级包管理服务 cnpmcore
企业级包管理服务 cnpmcore
269 0
|
存储 缓存 前端开发
pnpm技术体系之:打造企业级 pnpm 开源组件
pnpm 是 performant npm(高性能的 npm),它是一款快速的,节省磁盘空间的包管理工具,同时,它也较好地支持了 workspace 和 monorepos,简化开发者在多包组件开发下的复杂度和开发流程。
pnpm技术体系之:打造企业级 pnpm 开源组件
|
JavaScript 前端开发 Java
微服务项目:尚融宝(12)(前端平台:NPM包管理器)
2020年3月17日,Github宣布收购npm,GitHub现在已经保证npm将永远免费。
微服务项目:尚融宝(12)(前端平台:NPM包管理器)