首页 > 其他分享 >包管理工具:pnpm | 京东云技术团队

包管理工具:pnpm | 京东云技术团队

时间:2023-05-16 12:01:31浏览次数:40  
标签:npm 依赖 管理工具 yarn pnpm 京东 安装 store

作者:京东零售 杨秀竹

pnpm 是什么

pnpm( performant npm )指的是高性能的 npm,与 npm 和 yarn 一样是一款包管理工具,其根据自身独特的包管理方法解决了 npm、yarn 内部潜在的安全及性能问题,在多数情况下拥有更快速的安装速度、占用更小的存储空间,结合官网给出的性能测试及项目中的使用表现,其具有良好的应用前景。

pnpm 优势

更快的依赖安装速度

pnpm 通过特有的依赖管理方式,使其与其他包管理器相比具有更快的依赖安装速度,下图是官网给出的性能测试数据,在不同情况下安装、更新依赖包的速度性能表现,可以看出在多数情况下其耗时相比于其他包管理工具更短。

action

cache

lockfile

node_modules

npm

pnpm

Yarn

Yarn PnP

install




37.6s

17.3s

22.1s

20.2s

install




2.1s

1.4s

695ms

n/a

install




8.8s

4.7s

8.8s

668ms

install




13.1s

8s

22.8s

15.2s

install




13.7s

14.7s

8.9s

670ms

install




2.6s

4s

16s

n/a

install




2s

1.4s

681ms

n/a

install




2.5s

14.1s

16.6s

n/a

update

n/a

n/a

n/a

8.3s

7.4s

8.7s

16.9s

更小的包管理空间

使用 pnpm 时,依赖会被存储在内容可寻址的同一存储空间,可以节省大量的磁盘空间。

1、如果你用到了某依赖项的不同版本,只会将不同版本间有差异的文件添加到仓库(store)。

例如,如果某个包有100个文件,而它的新版本只改变了其中1个文件。那么 pnpm update 时只会向存储中心额外添加1个新文件,而不会因为仅仅一个文件的改变复制整新版本包的内容。

2、所有文件都会存储在硬盘上的某一位置。

当软件包被被安装时,包里的文件会硬链接到这一位置,而不会占用额外的磁盘空间这允许你跨项目地共享同一版本的依赖。

更高效安全的依赖管理方式

npm3 与 yarn 存在幽灵依赖(Phantom dependencies)以及 NPM分身(NPM doppelgangers )问题

pnpm 默认创建一个非平铺的 node_modules 及网状链接的包管理方式,因此代码无法访问任意包避免了幽灵依赖问题;又因为依赖始终都是存在 store 目录下,通过硬链接(hard links)进行寻址,一份相同的依赖始终只会被安装一次,因此可以避免 npm 分身问题。

幽灵依赖:某个包没有在 package.json 被依赖,但是用户却能够引用到这个包
npm包分身:在 npm3+ 和 yarn 中,由于存在 hoist 机制,可能大量的依赖被重复安装,导致 npm/yarn 的性能损失

独特的依赖管理方式( links + store)

links

pnpm 通过链接( links)与全局存储空间(store)管理的不同项目的 node\_modules 依赖。硬链接(hard links)能指向磁盘上原始文件所在的同一位置(store),但是因为 pnpm 的 node\_modules 是树形目录结构,且硬链接只能用于文件不能用于目录,因此需要通过软链接(symbolic link)来实现目录寻址,通过如下一张项目依赖关系图可以更好的理解 pnpm 是如何进行依赖寻址的。

包管理工具:pnpm | 京东云技术团队_pnpm

store

例如,如果您的项目中多处都使用 foo 包并且它占用 1MB 的空间,那么看起来它在项目的 node_modules 文件夹中占用了与全局存储(.pnpm store)相同的 1MB 空间。 但是,该 1MB 是磁盘上两个不同位置的相同空间 , 所以 foo 总共占用 1MB,而不是 2MB。

pnpm 会使用名为 .pnpm-store 的存储路径来存储该磁盘项目下的所有 node_modules 依赖,通常是在项目的根目录下,Mac/linux 中默认会设置到 {home dir}>/.pnpm-store/v3;windows 下会设置到当前盘的根目录下,比如D盘(D/.pnpm-store/v3)。由于硬链接寻址的限制,pnpm 不可以跨多个驱动器或文件系统工作,即不同的系统磁盘目录都会存处一份依赖包。

包管理工具:pnpm | 京东云技术团队_pnpm_02

项目应用

从 npm、yarn 进行迁移的过程

pnpm 的安装

有无安装 nodejs,pnpm 都提供了对应的安装方式,具体指令可参考官网,将npm对应的指令置换为 pnpm 即可。在安装 pnpm 时需要注意 nodejs 的兼容版本

npm install -g pnpm

Node.js

pnpm 5

pnpm 6

pnpm 7

pnpm 8

Node.js 12

✔️

✔️



Node.js 14

✔️

✔️

✔️


Node.js 16

未知

✔️

✔️

✔️

Node.js 18

未知

✔️

✔️

✔️

lock文件迁移

通过 pnpm import 可以将npm、yarn的 lock 文件迁移生成 pnpm-lock.yaml 锁定依赖版本

总结

pnpm 通过软、硬链接(hark link、symbolic link) + 全局存储(store)结合的依赖管理方式完全实现了依赖树结构的包管理方式,解决了 npm3 及 yarn 中的幽灵依赖和 npm 分身的问题,提升了依赖包的安装速度,减小了磁盘空间占用。

标签:npm,依赖,管理工具,yarn,pnpm,京东,安装,store
From: https://blog.51cto.com/u_15714439/6283138

相关文章

  • 一种通用的业务监控触发方案设计 | 京东云技术团队
    一、背景业务监控是指通过技术手段监控业务代码执行的最终结果或者状态是否符合预期,实现业务监控主要分成两步:一、在业务系统中选择节点发送消息触发业务监控;二、系统在接收到mq消息或者定时任务调度时,根据消息中或者任务中的业务数据查询业务执行的结果或状态并与业务预期的结果相......
  • Scrum敏捷管理工具
    ​1、Leangoo领歌Leangoo领歌国内知名敏捷开发工具,它覆盖了敏捷项目研发全流程,包括小型团队敏捷开发,规模化敏捷SAFe,ScrumofScrums大规模敏捷。其主要功能/解决问题的价值包括:1)能够支持多种场景,如:敏捷研发管理、敏捷项目管理、工作流管理、轻量级项目群管理、任务管理等。2)管理......
  • panjf2000/ants:一个高性能的 goroutine 池管理工具
    简介ants是一个高性能的goroutine池,实现了对大规模goroutine的调度管理、goroutine复用,允许使用者在开发并发程序的时候限制goroutine数量,复用资源,达到更高效执行任务的效果。goroutine相比于线程来说,有着更轻量、资源占用更少、切换速度更快、无线程上下文切换开销更少等......
  • 从3s到25ms!看看京东的接口优化技巧,确实很优雅!!
    大家好,最近看到京东云的一位大佬分享的接口优化方案,感觉挺不错的,拿来即用。建议收藏一波或者整理到自己的笔记本中,随时查阅!来源:https://toutiao.io/posts/0kwkbbt下面是正文。一、背景针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一......
  • pnpm workSpace管理Monorepo
    pnpm的优点pnpm会将包安装到本地,减少二次依赖安装的时间节省磁盘空间,它会把包软链到本地,不需要反复安装可以节省网络带宽更好的依赖处理逻辑Monorepo的优势便于管理多个相互依赖的项目便于团队共享知识库便于多个项目的测试发版和迭代流程减少项目管理的成本Mono......
  • golang多版本管理工具g
    一、golang多版本管理工具g 一)g简介g是一个Linux、macOS、Windows下的命令行工具,可以提供一个便捷的多版本go环境的管理和切换 二)g特性支持列出可供安装的go版本号支持列出已安装的go版本号支持在本地安装多个go版本支持卸载已安装的go版本支持在已安装的go版本......
  • 03 Selenium 实战 爬取京东商品
    Selenium和Requests都是Python中常用的网络请求库,但是Selenium获取数据的方式与Requests有些差别,Selenium可以直接模拟浏览器操作,获取数据更加方便,但是相应的速度也会慢一些。下面是使用selenium获取京东商品数据的示例代码:首先,导入selenium库中的webdriver模块,然后创建一个Edg......
  • 京东短网址高可用提升最佳实践
    作者:京东零售 郝彦军什么是短网址?短网址,是在长度上比较短的网址。简单来说就是帮您把冗长的URL地址缩短成8个字符以内的短网址。当我们在腾讯、新浪发微博时,有时发很长的网址连接,但由于微博只限制140个字,所以微博就自动把您发的长网址给转换成短网址了。在微博和手机短信提醒......
  • Lattics:一款简单易用、好看强大的「类脑式」知识管理工具,笔记应用与写作软件二合一
    如何选择一款适合自己的知识管理工具?随着数字化时代的到来,越来越多的人意识到知识管理的重要性。笔记软件和写作软件作为一种常用的知识管理工具,一直以来备受关注。从最早的印象笔记、有道云、为知笔记、幕布mubu到近几年的思源Siyuan、熊掌记Bear、flomo浮墨笔记、石墨、语雀y......
  • 全网商品搜索|1688|Taobao|天猫|京东api接口展示示例
    ​电商API(ApplicationProgrammingInterface,应用程序编程接口)是指电商平台开放的一组数据接口,通过这些接口可以实现对电商平台商品、订单、物流等信息进行访问、查询、修改、删除等操作。电商API涉及到的主要数据包括:1.商品数据:包括商品名称、价格、库存、分类、描述、图片......