为什么pnpm比npm、yarn使用更好

news2025/1/8 5:49:45

performant npm ,意味高性能的 npmpnpmnpm/yarn 衍生而来,解决了 npm/yarn
内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为"最先进的包管理工具"。

我们按照包管理工具的发展历史开始讲起:

npm2

  • node 版本管理工具把 node 版本降到 4,那 npm 版本就是 2.x 了。

  • 找个目录,执行下 npm init -y,快速创建个 package.json

  • 执行 npm install express,那么 express 包和它的依赖都会被下载下来:
    在这里插入图片描述

  • 展开 express,它也有 node_modules在这里插入图片描述

  • 再展开几层,每个依赖都有自己的 node_modules在这里插入图片描述
    也就是说 npm2node_modules 是嵌套的

  • 这样其实是有问题的,多个包之间难免会有公共的依赖,这样嵌套的话,同样的依赖会复制很多次,会占据比较大的磁盘空间。

  • 这个还不是最大的问题,致命问题是 windows 的文件路径最长是 260 多个字符,这样嵌套是会超过 windows 路径的长度限制的。

  • 当时 npm 还没解决,社区就出来新的解决方案了,就是 yarn

yarn

yarn 是怎么解决依赖重复很多次,嵌套路径过长的问题的呢?

  • 铺平。所有的依赖不再一层层嵌套了,而是全部在同一层,这样也就没有依赖重复多次的问题了,也就没有路径过长的问题了。

  • 我们把 node_modules 删了,用 yarn 再重新安装下,执行 yarn add express,这时候 node_modules 就是这样了:
    在这里插入图片描述

  • 全部铺平在了一层,展开下面的包大部分是没有二层 node_modules 的:在这里插入图片描述

  • 但是这样是有隐患的,因为没有显式依赖,万一有一天别的包不依赖这个包了,那你的代码也就不能跑了,因为你依赖这个包,但是现在不会被安装了。
    这就是幽灵依赖的问题。

  • 而且还有一个问题,就是上面提到的依赖包有多个版本的时候,只会提升一个,那其余版本的包不还是复制了很多次么,依然有浪费磁盘空间的问题。

所以衍生出来了pnpm

pnpm

pnpm采用的是软硬连接,硬连接就是同一个文件的不同引用,而软链接是新建一个文件,文件内容指向另一个路径,

  • 这样不会有复制多次的磁盘空间浪费,而且也不会有路径过长的问题。
  • 因为路径过长的限制本质上是不能有太深的目录层级,现在都是各个位置的目录的 link,并不是同一个目录,所以也不会有长度限制
  • 再把 node_modules 删掉,然后用 pnpm 重新装一遍,执行 pnpm install,包是从全局 store 硬连接到虚拟 store 的,这里的虚拟 store 就是 node_modules/.pnpm在这里插入图片描述
  • 确实不是扁平化的了,依赖了 express,那 node_modules 下就只有 express,没有幽灵依赖。在这里插入图片描述
  • 依赖都是从全局 store 硬连接到了 node_modules/.pnpm 下,然后之间通过软链接来相互依赖在这里插入图片描述
    总结:
  • npm2 是通过嵌套的方式管理 node_modules 的,会有同样的依赖复制多次的问题。
  • npm3+yarn 是通过铺平的扁平化的方式来管理 node_modules,解决了嵌套方式的部分问题,但是引入了幽灵依赖的问题,并且同名的包只会提升一个版本的,其余的版本依然会复制多次。
  • pnpm 则是用了另一种方式,不再是复制了,而是都从全局 store 硬连接到 node_modules/.pnpm,然后之间通过软链接来组织依赖关系。这样不但节省磁盘空间,也没有幽灵依赖问题,安装速度还快,从机制上来说完胜 npmyarn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

切片工具tippecanoe的全网最详细的解释

1.下载和安装 tippecanoe工具是mapbox官方提供的一个服务端切片工具,因此它是运行在服务器上的,它比较友好的支持mac和linux机器。对于windows来讲,就比较麻烦了。 首先对于mac系统,你只需配置好自己的homebrew,保证homebrew能够正常下载东西。 然后只需要一个命令: …

Jmeter 压测工具进行压力测试

需求:接口需要进行压力测试,有减库存的场景,要求并发不能超库存,接口鉴权类似token方式校验。 一、jemter 下载安装Java Downloads | Oracle ,下载安装可以自行翻帖子,很多教程,本次实验用的是…

用Python体素化3D网格和点云

推荐:用 NSDT设计器 快速搭建可编程3D场景。 3D 数据的持续学习正在成为机器学习和理解我们周围世界的越来越重要的部分。 随着新的 3D 数据提取硬件(如深度相机和 LiDAR)在闭路电视、相机和智能手机中变得司空见惯,越来越多的人正…

法线贴图的类型

1、切线空间法线贴图 这是当今最常见的法线贴图,也是我们在本系列中讨论的法线贴图。它根据模型顶点的法线方向修改模型的法线方向(因此我们必须控制lowpoly的顶点法线)。 请记住,切线法线贴图是使用顶点指示的方向进行计算的。这…

【WPF】数据绑定,资源字典

数据绑定 将数据与视图分开,创建MainViewModel .cs 作为数据源的处理 MainViewModel using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading…

华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路

一、题目描述 小王是一名基站维护工程师,负责某区域的基站维护。 某地方有n个基站(1<n<10),已知各基站之间的距离s(0<s<500),并且基站x到基站y的距离,与基站y到基站x的距离并不一定会相同。 小王从基站1出发,途径每个基站1次,然后返回基站1,需要请你…

Swift 中的 Actors 使用以及如何防止数据竞争

文章目录 前言Actors 的基本原理Actor 是引用类型&#xff0c;但与类相比仍然有所不同 为什么会出现数据竞争如何防止数据竞争使用 async/await 访问数据防止不必要的暂停非隔离(nonisolated)访问为什么在使用 Actors 时仍会出现数据竞争&#xff1f;总结 前言 Actors 是 Swif…

FFMPEG常用命令 音视频合并

目录 一、音频合并 1.获取音频时长 2.合并两段音频 3.合并音频插入空白 二、视频加背景图 三、音视频合成 1.保留视频声音 2.不保留视频声音 四、合并视频 本文将用几个实例&#xff0c;介绍ffmpeg命令的综合使用&#xff0c;主要涉及音频处理、视频处理和音视频合成。…

如何搭建自己的CentOS系统

CentOS是一个完全免费的操作系统&#xff0c;这对于开发人员来说非常有吸引力。他们可以使用CentOS来开发和测试应用程序&#xff0c;而不需要支付任何费用。那么作为程序员如果搭建自己的CentOS服务器呢&#xff1f; 搭建自己的CentOS系统需要以下步骤&#xff1a; 1、下载Ce…

借助KafkaTool在海量Kafka数据快速精准定位/查询目标数据

如何在海量的Kafka数据定位/查询精准到秒级的数据&#xff1f; 解决方案&#xff1a;Kafka命令 KafkaTool 1. 使用Kafka命令定位Offset sh ./kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list $ip:$port -topic ${topic.name} -time $timestamp参数说明&#…

程序员大战黄牛党,破解演唱会门票秒光之困

反黄牛&#xff0c;为何是场持久战&#xff1f; 撰文 | 林秋艺 编辑 | 龚 正 这个五月&#xff0c;似乎都被五月天霸屏了。从5月9日的30万张五月天演唱会门票被5秒扫光&#xff1b;到粉丝群起反抗&#xff0c;喊出“宁可鸟巢门口站&#xff0c;也不能让黄牛赚”&#xff0c;…

基于实体类导出excel模板

很多需求是导入excel的功能&#xff0c;但是导入的时候需要excel模板。如果很多模板的&#xff0c;就需要一个通过工具类来实现了&#xff0c;根据配置好一个实体类来实现模板的导出。 <dependency><groupId>org.jodd</groupId><artifactId>jodd-core&…

创建型设计模式03-原型模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 &#x1f3e1;账号&#xff1a;CSDN 、个人博客 、Github &#x1f38a;公众号&#xff1a;猫十二懿 原型模式 1、原型模式介绍 原型模式是一种创建型设计模式&#xff0c;它允许通过复制现有对象来生成新对象&#xf…

【大数据处理与可视化】五、数据聚合与分组运算

【大数据处理与可视化】五、数据聚合与分组运算 实验目的实验内容实验步骤一、案例——运动员信息的分组与聚合1、统计男篮、女篮运动员的平均年龄、身高、体重2、统计男篮运动员的平均年龄、身高、体重的极差值3、统计男篮运动员的体质指数 实验小结 实验目的 能够熟练运用gr…

NISEDIT如何发布,Qt如何发布文章?难道还有人不会(超详细教学,跟着走,不会你怪我)

一、自动发布 直接运行即可&#xff0c;不过多阐述。 二、手动发布 文件清单&#xff1a; ExamSys.exe account.txt、exam.txt Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll libstdc-6.dll、libwinpthread-1.dll、libgcc_s_sjlj-1.dll、libgcc_s_dw2-1.dll 注意&#xff1a…

Vue项目中vuex的安装和使用

Vue项目中vuex的安装和使用 1. 安装vuex2. 导入vuex包并创建store仓库3. 在main.js中导入store实例4. 检测vuex是否能正常使用 1. 安装vuex npm install vuex --save2. 导入vuex包并创建store仓库 在项目文件目录中&#xff0c;在src目录下创建一个名为store的文件夹&#xf…

图表控件LightningChart JS使用指南 - 如何创建仪表图

LightningChart JS是性能最高的JavaScript图表库&#xff0c;专注于实时数据可视化。是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画。…

【大数据处理与可视化】六、数据可视化

【大数据处理与可视化】六、数据可视化 实验目的实验内容实验步骤一、案例——画图分析某年旅游景点数据1、河北省总面积和游客量位居前三的景点2、河北省旅游量的占比哪个最多&#xff0c;哪个最少。 实验小结 实验目的 1.能够详述常见图表的类型和特点。 2.能够熟练运用Matp…

ELFK日志分析系统并使用Filter对日志数据进行处理

目录 一、 FilebeatELK 部署Filebeat 节点上操作 二、Filtergrok 正则捕获插件内置正则表达式调用自定义表达式调用 mutate 数据修改插件multiline 多行合并插件date 时间处理插件 一、 FilebeatELK 部署 Node1节点&#xff08;2C/4G&#xff09;&#xff1a;node1/192.168.15…

【数据结构】虽然很难很抽象,但是你还是得努力弄懂的数据结构——数组,你常用但是你懂它吗

数组(Array) 数组是实现顺序存储结构的基础,数组(Array)存储具有相同数据类型的元素集合.一维数组占用一块内存空间,数组的存储单元个数称为数组容量,也称为数组长度. 每个存储单元的地址是连续的,即每个元素连续存储,计算第i个元素地址所需时间是一个常量,时间复杂度是O(1),…