Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn
在探索现代 JavaScript 生态系统时,我们常常会遇到新兴技术的快速迭代和改进。其中,包管理工具的发展尤为重要,因为它们直接影响开发效率和项目性能。最近,pnpm 作为一种新的包管理工具引起了广泛关注。它不仅挑战了传统工具如 npm
和 Yarn
,还提供了一些独特的优势,使其在许多方面超越了前辈。
为了更好地理解 pnpm 的优势,我们从包管理工具的历史开始探索,从 npm2
开始的各个阶段。我们将看到 pnpm 如何通过技术创新解决历史遗留问题,并极大地提高性能和效率。接下来,深入了解 pnpm 的核心机制以及它如何改变开发者处理依赖管理的方式。
npm2
使用 Node 版本管理工具将 Node 版本降级到 4,然后 npm 版本将是 2.x
。
在一个目录中运行 npm init -y
快速创建一个 package.json
文件。
然后运行 npm install express
,express 包及其依赖项将被下载:
展开 express
,它也有 node_modules
:
继续展开几层,每个依赖项都有自己的 node_modules
:
换句话说,npm2 的 node_modules
是嵌套的。
这正常吗?这有什么问题吗?
实际上,这确实有问题。多个包不可避免地具有共同的依赖项。当像这样嵌套时,相同的依赖项将被多次重复,占用了相对较大的磁盘空间。
这还不是最大的问题;致命的问题是 Windows 中文件路径的最大长度超过 260 个字符。像这样嵌套会超过 Windows 的路径长度限制。
在 npm 尚未解决这个问题时,社区出现了一个新的解决方案:yarn。
yarn
Yarn 如何解决重复依赖和过长嵌套路径的问题?
扁平化。所有依赖项不再逐层嵌套,而是全部处于同一层级,因此不再存在重复依赖或路径过长的问题。
我们删除 node_modules
,使用 Yarn 重新安装并执行 yarn add express
:
此时,node_modules
看起来像这样:
所有依赖项都在同一层级,大多数包在其下没有第二层 node_modules
:
当然,有些包仍然有 node_modules
,例如这个:
为什么仍然存在嵌套?
因为一个包可能有多个版本,并且只有一个版本可以被提升。因此,当遇到不同版本的同一包时,仍然使用嵌套。
npm 升级到版本 3 后,也采用了这种扁平化解决方案,与 yarn 非常相似:
当然,yarn 也实现了 yarn.lock
的功能来锁定依赖项版本,但 npm
也实现了这一点。
yarn
和 npm
都采用了扁平化解决方案。这种方法没有问题吗?
不完全是,扁平化解决方案也有自己的问题。
主要问题是幽灵依赖,这意味着在代码中可以引入未在依赖项部分声明的依赖项。
这很容易理解,因为一切都是扁平化的,所以可以找到依赖项的依赖项。
然而,这带来了风险,因为没有明确的依赖声明,如果有一天另一个包不再依赖于那个包,你的代码将无法运行,因为依赖于它,但现在没有安装。
这就是幽灵依赖的问题。
另一个问题是多个版本的依赖项,如上所述。只有一个版本会被提升,而其他版本则会重复多次,导致磁盘空间浪费。
社区有解决这两个问题的想法吗?
当然有!这就是为什么引入了 pnpm。
pnpm
回顾一下,为什么 npm3
和 yarn
扁平化 node_modules
?不就是因为相同的依赖项会被多次重复,并且长路径可能会在 Windows 上引发问题吗?
如果我们不重复它们,而是使用链接呢?
首先,介绍链接。它是操作系统提供的软链接和硬链接。硬链接是同一个文件的不同引用,而符号链接会创建一个新文件,其内容指向另一个路径。当然,这两种链接的使用方式是类似的。
如果不复制文件,而是将 npm 包的唯一副本存储在全局仓库中,并将其他位置链接到它呢?
这样就不会因多次复制而浪费磁盘空间,也不会有路径过长的问题。路径长度的限制本质上意味着不应该有太深的目录层级;现在所有位置的目录是链接在一起的,而不是在同一个目录中,因此没有长度限制。
是的,pnpm 通过这种方法实现了这一点。
再次删除 node_modules
,然后使用 pnpm 通过运行 pnpm install
重新安装。
你会注意到它打印出这样一句话:
软件包从全局存储硬链接到虚拟存储,这里的虚拟存储是 node_modules/.pnpm
。
我们打开 node_modules
看一看。
确实不是扁平的,依赖 express,所以在 node_modules
下只有 express,没有任何幽灵依赖。
展开 .pnpm
看看:
所有依赖项都在这里解决,全部从全局仓库直接链接过来,并通过符号链接组织包之间的依赖关系。
例如,.pnpm
下的 express,都是符号链接。
换句话说,所有依赖项都是从全局仓库硬链接到 node_modules/.pnpm
,然后它们通过符号链接相互依赖。
官方提供了一个示意图,结合起来看很清楚:
这就是 pnpm 的实现原理。
pnpm 的优越性
首先,最大的优势是节省磁盘空间。包只在全局保存一份,其余的都是符号链接或硬链接。这节省了大量磁盘空间。
其次,它很快,因为它使用链接而不是复制,这自然使它更快。
这些也是它所宣称的优势:
相比 npm2,优势在于不会多次重复相同的依赖项。
相比 yarn 和 npm3+,没有幽灵依赖,也没有未提升依赖项的重复问题。
这已经足够优秀,可以说是对 yarn 和 npm 的一次打击。
结语
最近,pnpm 频繁被提及,可以说是当下的趋势。在本文中,我们总结了其受欢迎的原因:
npm2 以嵌套方式管理 node_modules,导致多次重复依赖项的问题。
npm3+ 和 yarn 通过扁平化方式管理 node_modules
,解决了嵌套方式的一些问题,但引入了幽灵依赖的问题。此外,同名包只有一个版本被提升,而其他版本仍会重复。
pnpm 通过不复制文件,而是从全局仓库硬链接到 node_modules/.pnpm
,并通过符号链接组织依赖关系,解决了这些问题。
这不仅节省了磁盘空间,消除了幽灵依赖问题,还加快了安装速度。从机械角度来看,pnpm 超越了 npm 和 yarn。
通过这种对 npm 和 yarn 的创新方法,pnpm 正在通过简化依赖管理的方式产生影响。
最后:
vue2与vue3技巧合集
VueUse源码解读
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/600dd09771bbf79e8fa2f1b062dc65e2.png)
Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn
在探索现代 JavaScript 生态系统时,我们常常会遇到新兴技术的快速迭代和改进。其中,包管理工具的发展尤为重要,因为它们直接影响开发效率和项目性能。最近,pnpm 作为一种新的包管理工具引起了广泛关注。它不仅挑战了传统工具如 np…...
![](https://www.ngui.cc/images/no-images.jpg)
汽车IVI中控开发入门及进阶(三十二):i.MX linux开发之Yocto
前言: 对于NXP的i.mx,如果基于linux开发,需要熟悉以下文档: IMX_YOCTO_PROJECT_USERS_GUIDE.pdf IMX_LINUX_USERS_GUIDE.pdf IMX_GRAPHICS_USERS_GUIDE.pdf 如果基于android开发,需要熟悉一下文档: Android_Auto_Quick_Start_Guide.pdf ANDROID_USERS_GUIDE.pdf …...
![](https://www.ngui.cc/images/no-images.jpg)
tessy 编译报错:单元测试时,普通桩函数内容相关异常场景
目录 1,失败现象 2,原因分析 1,失败现象 1,在 step 桩函数正常的情况下报错。 2,测试代码执行的数据流 和 step 桩函数内容不一致。 2,原因分析 桩函数分为 test object, test case, test step 三种类别。…...
![](https://www.ngui.cc/images/no-images.jpg)
计算机专业是否仍是“万金油”
作为一名即将参加高考的学生,我站在人生的分岔路口上,面临着选择大学专业的重大抉择。在这个关键节点,计算机相关专业是否仍是炙手可热的选择? 首先,从行业的角度来看,计算机相关专业确实在近年来持续火…...
![](https://img-blog.csdnimg.cn/img_convert/621ba0e6632b48d27fba0c3a452cdc94.png)
雷池社区版自动SSL
正常安装雷池,并配置站点,暂时不配置ssl 不使用雷池自带的证书申请。 安装(acme.sh),使用域名验证方式生成证书 先安装git yum install git 或者 apt-get install git 安装完成后使用 git clone https://gitee.com/n…...
![](https://www.ngui.cc/images/no-images.jpg)
怎样减少徐州服务器租用的成本?
服务器租用的出现,十分便于网络行业的发展,但是随着服务器租用的广泛应用,整体还是有着一定的成本的吗,不同的服务器类型在价格方面也是不同的,那么企业在选择服务器租用后,怎样才能减少服务器租用的成本呢…...
![](https://img-blog.csdnimg.cn/img_convert/79be6250fa9252d5eafb8f9d061964b4.png)
【性能优化】表分桶实践最佳案例
分桶背景 随着企业的数据不断增长,数据的分布和访问模式变得越来越复杂。我们前面介绍了如何通过对表进行分区来提高查询效率,但对于某些特定的查询模式,特别是需要频繁地进行数据联接查或取样的场景,仍然可能面临性能瓶颈。此外…...
![](https://www.ngui.cc/images/no-images.jpg)
数据仓库的挑战
建设数据仓库是一个复杂且资源密集的过程,需要考虑多个方面。以下是建设数据仓库时常见的挑战及其详细解释: 1. 数据集成 挑战: 数据来源多样:数据来自不同的系统、数据库、文件格式(如CSV、JSON、XML)、…...
![](https://img-blog.csdnimg.cn/direct/09d47f151a404209b846d31aacef9cf0.png)
基于ResNet-18的简单分类(新手,而且网络效果不咋滴,就是学个流程)
引言 先看问题: 我手边有一数据集,然后我想分分类!~~ 咳咳,最近刚做了一个:训练集有1143张,分为5类,里面图片是打乱的。测试集有248张,想把它分分类看看咋样。 再看一下效果: …...
![](https://img-blog.csdnimg.cn/direct/80b0049e0dea4d0e9e7d773898fef7b5.png)
自动化测试:Autorunner的使用
自动化测试:Autorunner的使用 一、实验目的 1、掌握自动化测试脚本的概念。 2、初步掌握Autorunner的使用 二、Autorunner的简单使用 autoRunner使用方法 新建项目 a) 在项目管理器空白区域,右键鼠标,选择新建项目 b) 输入项目名后,点击[确定]. 在初次打开aut…...
![](https://img-blog.csdnimg.cn/direct/630388ad1a25426aba045f306e45fba7.png)
时序预测 | Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测; 2.多变量时间序列数据集(负荷数据集),采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&…...
![](https://www.ngui.cc/images/no-images.jpg)
软考 系统架构设计师系列知识点之杂项集萃(42)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(41) 第67题 Windows操作系统在图形界面处理方面采用的核心架构风格是( )风格。Java语言宣传的“一次编写,到处运行”的特性,从架构风格…...
![](https://img-blog.csdnimg.cn/direct/61e5ed70b1764bfc825e964022af8ab8.png)
FastBoot刷机获取root权限(Magisk)
1.首先要下载ADB、Fastboot等工具。 1.ADB、Fastboot工具 https://developer.android.com/studio/releases/platform-tools 2.安装FastBoot的USB驱动 https://developer.android.com/studio/run/oem-usb 2.下载对应的镜像 https://developers.google.com/android/images?…...
![](https://www.ngui.cc/images/no-images.jpg)
信息检索(43):SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking
SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking 摘要1 引言2 相关工作3 方法3.1 SparTerm3.2 SPLADE:稀疏词汇和扩展模型 4 实验5 结论 发布时间(2021) 标题:稀疏词汇 扩展模型 摘要 稀疏的优点…...
![](https://www.ngui.cc/images/no-images.jpg)
DockerHub 镜像加速
Docker Hub 作为目前全球最大的容器镜像仓库,为开发者提供了丰富的资源。Docker Hub 是目前最大的容器镜像社区,DokcerHub的不能使用,导致在docker下pull镜像无法下载,安装kubernetes镜像也受到影响,下面请看解决方式。 1.加速原理 Docker下载加速的原理…...
![](https://www.ngui.cc/images/no-images.jpg)
Oracle 迁移 Mysql
-- Oracle->MySQL -- 使用时改一下where条件的owner和table_name -- 字段数据类型映射时会将Oracle中的浮点NUMBER转换为decimal(65,8)定点数 -- 可以识别主键约束、非空约束,但无法识别外键约束、唯一约束、自定义check -- 对于Oracle字符串长度为4000的&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
vue3父子组件通信
一,父传子——defineProps 方法: 在父组件的模板中使用子组件标签,并且给标签自定义属性和属性名,即通过v-bind绑定数值,而后传给子组件;子组件则通过defineProps接收使用。 父组件: <tem…...
![](https://www.ngui.cc/images/no-images.jpg)
CSS中使用应用在伪元素中的计数器属性counter-increment
在CSS中,counter-increment 是一个用于递增计数器值的属性。它通常与 counter-reset 和 content 属性一起使用,以在文档中的特定位置(如列表项、标题等)插入自动生成的数字或符号。 counter-increment 基本用法: 使…...
![](https://img-blog.csdnimg.cn/direct/30a0e3b86245445aae55867cabae0b46.png)
【SkiaSharp绘图08】SKPaint方法:自动换行、是否乱码、字符偏移、边界、截距、文本轮廓、测量文本
文章目录 SKPaint方法BreakText 计算指定宽度内可绘制的字符个数ContainsGlyphs字体是否包含文本字符(是否会乱码)GetGlyphOffsets 字符偏移量GetGlyphPositions 偏移坐标GetGlyphWidths 每个字符的宽度与边界GetHorizontalTextIntercepts 轮廓截距GetPositionedTextIntercepts…...
![](https://www.ngui.cc/images/no-images.jpg)
深入理解Servlet Filter及其限流实践
引言 在Java Servlet技术中,Filter是一个拦截器,它允许开发者在请求到达目标资源之前或响应发送给客户端之后,对请求或响应进行拦截和处理。这种机制为实现诸如身份验证、日志记录、请求修改等功能提供了极大的灵活性。 Filter基础 Filter…...
![](https://www.ngui.cc/images/no-images.jpg)
使用cv2对视频指定区域进行去噪
视频去噪其实和图象一样,只是需要现将视频截成图片,在对图片进行去噪,将去噪的图片在合成视频就行。可以利用cv2.imread()、imwrite()等轻松实现。 去噪步骤 1、视频逐帧读成图片 2、图片指定区域批量去噪 2、去噪后的图片写入视频 1、视频逐…...
![](https://www.ngui.cc/images/no-images.jpg)
AI在创造还是毁掉音乐?
AI对音乐产业的影响是复杂而多维的,既有创造性的贡献也存在潜在的挑战。我们可以从以下几个角度来分析这个问题: ### 创造性贡献 1. **音乐创作**:AI可以帮助音乐家创作新的旋律和和声,甚至生成完整的音乐作品。例如,…...
![](https://www.ngui.cc/images/no-images.jpg)
【2023年全国青少年信息素养大赛智能算法挑战赛复赛真题卷】
目录 2023全国青少年信息素养大赛智能算法挑战赛初中组复赛真题 2023全国⻘少年信息素养⼤赛智能算法挑战复赛⼩学组真题 2023全国青少年信息素养大赛智能算法挑战赛初中组复赛真题 1. 修复机器人的对话词库错误 【题目描述】 基于人工智能技术的智能陪伴机器人的语言词库被…...
![](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg2.imgtp.com%2F2024%2F05%2F27%2FecnWy72K.jpg&pos_id=img-qv6XnfkS-1718993667533)
Android系统揭秘(一)-Activity启动流程(上)
public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) { IApplicationThread whoThread (IApplicationThread) contextThread; … try { … int result …...
![](https://www.ngui.cc/images/no-images.jpg)
使用Java实现哈夫曼编码
前言 哈夫曼编码是一种经典的无损数据压缩算法,它通过赋予出现频率较高的字符较短的编码,出现频率较低的字符较长的编码,从而实现压缩效果。这篇博客将详细讲解如何使用Java实现哈夫曼编码,包括哈夫曼编码的原理、具体实现步骤以…...
![](https://img-blog.csdnimg.cn/img_convert/f951deec2807ddecc68fdf8a59d30872.png)
IDEA、PyCharm等基于IntelliJ平台的IDE汉化方式
PyCharm 或者 IDEA 等编辑器是比较常用的,默认是英文界面,有些同学用着不方便,想要汉化版本的,但官方没有这个设置项,不过可以通过插件的方式进行设置。 方式1:插件安装 1、打开设置 File->Settings&a…...
![](https://img-blog.csdnimg.cn/direct/36e3d6e15a584742802bae9bfcd6ef9e.png)
visual studio 创建c++项目
目录 环境准备:安装 visual studiovisual studio 创建c项目Tips:新建cpp文件注释与取消注释代码 其他初学者使用Visual Studio开发C和C时常遇到的3个坑 环境准备:安装 visual studio 官网:https://visualstudio.microsoft.com/zh…...
![](https://img-blog.csdnimg.cn/direct/7c78dcbd456647e083e49d8146ef0acd.jpeg)
MGV电源维修KUKA机器人电源模块PH2003-4840
MGV电源维修 库卡电源模块维修 机器人电源模块维修 库卡控制器维修 KUKA电源维修 库卡机器人KUKA主机维修 KUKA驱动器模块维修 机械行业维修:西门子系统、法那克系统、沙迪克、FIDIA、天田、阿玛达、友嘉、大宇系统;数控冲床、剪板机、折弯机等品牌数控…...
![](https://img-blog.csdnimg.cn/direct/3593273a133643069ba9b03e860a3fae.png)
设置浏览器互不干扰
目录 一、查看浏览器文件路径 二、 其他盘新建文件夹Cache 三、以管理员运行CMD 四、执行命令 一、查看浏览器文件路径 chrome://version/ 二、 其他盘新建文件夹Cache D:\chrome\Cache 三、以管理员运行CMD 四、执行命令 Mklink /d "C:\Users\Lenovo\AppData\Loca…...
![](https://www.ngui.cc/images/no-images.jpg)
kafka操作命令详解
目录 1、集群运维命令 1.1、集群启停命令 1.3、集群迁移命令 1.4、权限管理命令 1.4.1、权限参数介绍 1.4.2、增加权限命令 1.4.3、移出权限命令 1.4.4、查看所有topic权限命令 1.4.5、查看某个topic权限命令 2、生产者命令 2.1、创建topic命令 2.2、删除topic命令 …...
![](https://img-blog.csdnimg.cn/2019082014271444.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1Y2hlbl93YW5n,size_16,color_FFFFFF,t_70)
信息流广告视频/电脑优化是什么意思
本文用于自己记录,忘记时可以用来回顾。点击这里进入JQuerydatatable官网API地址 JQuery Datatables初始化 个人比较喜欢JQueryDatatables的Bootstrap4风格,所以文章以Bootstrap4风格为例。 JQueryDatatable的初始化很简单,按照官网的举例说明…...
![](https://img-blog.csdnimg.cn/img_convert/a5c9404e60aeb493ef9f0aebd6d18bd5.png)
西安手机网站定制网站建设/郴州网络推广公司排名
一、准备工作微信公众平台:https://mp.weixin.qq.com/申请测试账号:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?actionshowinfo&tsandbox/index微信推送消息模板不需要发布服务器,也不需要填写授权回调域名,只需要…...
![](/images/no-images.jpg)
wordpress 有赞云/打开百度网址
最近想升级mesos0.23.0,结果编译mesos0.23.0需要gcc4.8,可是centOS6.6最高版本的gcc也只到4.4.7版本,只好手动升级一下了。 下载4.8.2源码 wget ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.8.2/gcc-4.8.2.tar.bz2 下载依赖(gmp-4.3.2、mpfr-2.4.2、mpc-0.8.1) /us…...
![](@MSITStore%3AF%3ATDdownloadPascal%E7%B2%BE%E8%A6%81.chm%3A%3A/Pascal%E7%B2%BE%E8%A6%81.files/epf0404fr.gif)
内网门户网站建设/竞价外包代运营公司
第四章用户自定义数据类型 Pascal 语言的一个重要特征是它能自定义数据类型。通过各种类型构造器,你可以定义自己的数据类型,如子界类型、数组类型、记录类型、枚举类型、指针类型和集合类型。最重要的用户定义数据类型是类(class)…...
![](http://osxdn70ll.bkt.clouddn.com/17-7-15/32550293.jpg)
政府网站后台/长沙网站制作推广
编辑插件 sublime自带的markdown语法高亮并不是很友好,推荐安装Markdown Editing,github主页然后在视图->语法里选择MarkdownEditing启用,支持三种风格,分别是Standard Markdown, GitHub flavored Markdown, MultiMarkdown. 在首选项->Package Setting->Markdown Edi…...
![](https://img-blog.csdnimg.cn/2d1801fddb834ef58ebaae13551b4012.png)
社交类网站手机模版/软文营销的概念
目录 1、什么是自动化测试 2、自动化测试的发展前景怎么样 3、自动化测试难不难? 4、目前市场上自动化测试岗位的薪资是多少? 5、自动化测试学习方法好渠道 6、自动化测试怎么学? 学习基础知识 选择自动化测试框架 开始编写测试脚本 …...