【大前端 合集】包管理工具差异性

news2024/11/15 8:47:25

包管理工具

这里会对市场上使用最多的包管理工具 yarn/ npm 以及新秀 pnpm 做一个横向分析

1. 前言

在做分析以及学习之前,最好可以读下 pnpm 官网。可以理解下 pnpm 的核心宗旨

  • 当使用 npm 或 Yarn 时,如果你有 100 个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本。然而,如果是使用 pnpm,依赖包将被 存放在一个统一的位置,因此:
    • 如果你对同一依赖包需要使用不同的版本,则仅有 版本之间不同的文件会被存储起来。例如,如果某个依赖包包含 100 个文件,其发布了一个新 版本,并且新版本中只有一个文件有修改,则 pnpm update 只需要添加一个 新文件到存储中,而不会因为一个文件的修改而保存依赖包的 所有文件。
    • 所有文件都保存在硬盘上的统一的位置。当安装软件包时, 其包含的所有文件都会硬链接自此位置,而不会占用 额外的硬盘空间。这让你可以在项目之间方便地共享相同版本的 依赖包。

2. 理想中包依赖

在这里插入图片描述

  • 理想中的依赖可以是上述这种。我们的XXX 项目依赖于多个插件,插件统一在文件夹node_moudles下进行管理
  • 而他们各自的依赖中,又依赖于别的插件。也是在各自node_moudles中进行管理
  • 这样相互依赖 其实就构成了一颗多叉树。如下图

在这里插入图片描述

问题

  • 虽然上述的依赖结构是清晰易懂的,但是同时存在了很多的问题:
    • 依赖层次过深
    • 依赖的子包的重复性很高。无法实现复用,占用了多余的磁盘空间
    • 如果一个包被多个项目依赖的话,就会在本地磁盘中出现多份
    • 那么不断的新的工具产生的话,就是为了解决上述的问题

3. 进化史

  • 这里会大致的说一下包管理工具的发展史。因为肯定是新工具的出现解决了一些老的问题
  • 同时也是会拿最新版的包管理工具做对比

npm(先)

  • 不确定性
    • 在 npm v5 版本之前是没有package.json文件的。是无法锁定版本的。这样就造成了很可能一个团队中依赖的项目的版本不同,这样会造成安全隐患
  • 下载速度缓慢
    • 这个需要结合yarn进行分析
  • 幽灵依赖
    • 在 npm v3 之后为了修改解决依赖过深以及无法利用的问题,改为扁平化管理。
    • 但是这样会造成一个问题不是在package.json中写的依赖,也会被提升到node_moudles的最顶端。
    • 而我们可以在项目中直接依赖他们。但是他们会在某一时刻随别的包一起被卸载,而我们却不得知
  • 依赖分身
    • 在这里插入图片描述
    • 上述存在两个一模一样的包D@2.0 其实就是依赖分身
    • 其实在实例项目中 只需要依赖包A/ B/ C. 但是 A => D@1.0/ B => D@2.0/ C => D@2.0
    • 因为包 A 优先被下载,所以子依赖D@1.0被提升到顶端了
  • 不能充分利用缓存
    • 如果本地磁盘中存在 100 个项目,每个项目都依赖一个相同版本的rollup 那么会在本地有 100 个相同版本的依赖。也是对本地磁盘的一种浪费

yarn(中)

为了解决 npm 的问题,yarn应运而生了。

  • yarn 引入了 yarn.lock 的概念,能更好的锁定版本,顺便解决了 npm 的问题
  • 同样 yarn 在下载机制中引入了线程池的概念,加载速度提高
  • 但是幽灵依赖/ 依赖分身/ 不能充分利用缓存 依旧没有解决

pnpm(后)

在 pnpm 中 就很好的解决了 npm/ yarn 遗留下来的问题。但是也不是一点问题没有

  • 前奏知识
    • 硬链接的作用:是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的链接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录的链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除
    • 软连接的作用:有点像是 window 中的快捷方式,它本身也是一个文件,只不过保存的是它指向的文件的全路径,访问时将通过它访问所指向的文件路径以打开指定文件,所以当删除源文件时,打开它将报错指示无相关路径
    • 在这里插入图片描述
  • 其实就如上图所言,pnpm 中充分利用了硬链接/ 软连接的操作。那么是如何解决问题的呢

  • 首先 pnpm 同样有 package-pnpm.lock 存在,可以锁定版本

  • 其不是依靠扁平化策略来管理的的,所以所谓的依赖分身以及幽灵依赖问题不存在

  • 那如何进行操作的呢?

    • 在下载依赖的时候,会在盘符中建立一个.store文件夹用来做同一个的依赖仓库
    • 项目中所有的需要用到的依赖都是通过硬链接的作用,连接到项目的 node_modules 下面的
    • 如果项目中用到相同版本的依赖是通过软连接进行管理的
    • 这样就充分解决了依赖包重复性的问题(npm/ yarn 为了解决重复性的问题 才会有扁平化处理的)
  • 但是这样就很完美了吗???其实并不是的

    • 在 pnpm 中严重依赖硬链接/ 软连接。如果你的系统不支持这个操作也是不行的
    • 但是 pnpm 同样给了策略了。可以在.npmrc中添加配置 就跟 npm/ yarn 保持一致了

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

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

相关文章

matlab搭建IAE,ISE,ITAE性能指标

目录前言准备IAEISEITAE前言 最近在使用matlab搭建控制系统性能评价指标模型,记录一下 准备 MATLAB R2020 IAE IAE函数表达式如下所示: IAE函数模型如下所示: ISE ISE函数表达式如下所示: ISE函数模型如下所示&#xff…

来看看你的是否会正确的使用索引

索引,可以有效提高我们的数据库搜索效率,各种数据库优化八股文里都有相关的知识点可背,不过单纯的被条目其实很容易忘记。 所以我想和大家聊一聊这个索引的正确使用方法,结合一些具体的例子来帮助大家理解索引优化。 1、索引列独…

Redis使用方式

一、Redis基础部分: 1、redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1.取最新N个数据的操作 2.排行榜应用,取TOP N 操作 3.需要精确设定过期时间的应用 4.计数器应用 5.Uniq操作,获取某段时间所有数据排重值 6.实时系统,反垃圾系统7.P…

开源、低成本的 Xilinx FPGA 下载器(高速30MHz)

目前主流的Xilinx下载器主要有两种:一种是Xilinx官方出品的Xilinx Platfom Cable USB,还有一个就是Xilinx的合作伙伴Digilent开发的JTAG-HS3 Programming Cable。 JTAG-HS系列最大支持30MHz下载速度,基于FTDI的FT2232方案。 JTAG-HS系列对比…

ipv6上网配置

一般现在的宽带都已经支持ipv6了,但是需要一些配置才能真正用上ipv6。记录一下配置过程。 当前测试环境为移动宽带,光猫下面接了一个路由器,家里所有的设备都挂到这个路由器下面的。 1. 光猫改桥接 光猫在使用路由模式下,ipv6无…

一款针对EF Core轻量级分表分库、读写分离的开源项目

更多开源项目请查看:一个专注推荐.Net开源项目的榜单 在项目开发中,如果数据量比较大,比如日志记录,我们往往会采用分表分库的方案;为了提升性能,把数据库查询与更新操作分开,这时候就要采用读写…

谈谈SpringBoot(三)

1. SpringBoot依赖管理 1.1 父依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.8</version><relativePath/></parent> 点击进去&#xf…

Redis中的hash结构和扩容机制

1.rehash原理 hash包含两个数据结构为字典数组ht[0]和ht[1]。其中ht[0]用来存放数据&#xff0c;ht[1]在rehash时使用。 扩容时&#xff0c;ht[1]的大小为第一个大于等于ht[0].used*2的2的幂次方的数&#xff1b; 收缩时&#xff0c;ht[1]的大小为第一个大于等于ht[0].used的…

大数据时代的小数据神器 - asqlcell

自从Google发布了经典的MapReduce论文&#xff0c;以及Yahoo开源了Hadoop的实现&#xff0c;大数据这个词就成为了一个行业的热门。在不断提高的机器性能和各种层出不穷的工具框架加持下&#xff0c;数据分析开始从过去的采样抽查变成全量整体&#xff0c;原先被抽样丢弃的隐藏…

【Java开发笔记】线程池

【Java开发笔记】线程池 线程池 ThreadPoolExecutor 的七大核心参数&#xff1a; 核心线程数 corePoolSize最大线程数 maxinumPoolSize超过核心线程数的闲余线程存活时间 keepAliveTime存活时间单位 unit:keepAliveTime任务队列&#xff08;阻塞队列&#xff09; workQueue生…

内网渗透(二十)之Windows协议认证和密码抓取-域认证(Kerberos协议)

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

【LeetCode】1138. 字母板上的路径

1138. 字母板上的路径 题目描述 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”]&#xff0c;如下所示。 我们可以按下面的指令规…

Spring Security in Action 第一、二章 第一个Spring Security项目的建立以及基本

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…

Docker 搭建本地私有仓库

一、搭建本地私有仓库有时候使用Docker Hub这样的公共仓库可能不方便&#xff0c;这种情况下用户可以使用registry创建一个本地仓库供私人使用&#xff0c;这点跟Maven的管理类似。使用私有仓库有许多优点&#xff1a;1&#xff09;节省网络带宽&#xff0c;针对于每个镜像不用…

小灰的算法之旅---createBinaryTree 的一点点疑问

前言 深知自己算法薄弱&#xff0c;所以最近在补充自己算法方面的知识&#xff0c;《小灰的算法之旅》这本书作为入门书籍不错&#xff0c;当时在看到《树-深度优先遍历》的代码时&#xff0c;我碰到了一点疑问&#xff0c;经过我多次代码验证&#xff0c;确实是代码不太严谨。…

C语言基础(有基础)

linux下的 是一种通用的、面向过程式的计算机编程语言 #include <stdio.h> //#include 预处理命令&#xff0c;用来引用头文件&#xff0c; stdio.h 头文件 int main() //开始 {/* 一个注释 */printf("Hello, World! \n");return 0; …

docker安装mysql

在安装Mysql之前&#xff0c;我们可以先查看一下我们的镜像&#xff0c;输入命令&#xff1a; docker images 能发现&#xff0c;镜像里面只有一个Nginx&#xff0c;并没有Mysql 然后我们可以像上一篇安装Nginx一样&#xff0c;安装Mysql镜像。 输入以下命令&#xff0c;安装…

B站Python与OpenCV人脸识别项目超详细记录(对图片、视频、摄像头人脸的检测)

课程来源&#xff1a;一天搞定人脸识别项目&#xff01;学不会up直接下跪&#xff01;&#xff08;pythonopencv&#xff09;_哔哩哔哩_bilibili 图片来源&#xff1a;感谢王鹤棣先生友情出镜~ 环境配置详见&#xff1a; 在conda虚拟环境中安装OpenCv并在pycharm中使用_cond…

已解决io.UnsupportedOperation: not readable

已解决Python读取文件报错&#xff1a;io.UnsupportedOperation: not readable亲测有效 文章目录报错问题报错翻译报错原因解决方法联系博主免费帮忙解决报错报错问题 一个小伙伴遇到问题跑来私信我&#xff0c;想用Python读取文件&#xff0c;但是发生了报错&#xff08;当时他…

跟同事杠上了,Apache Beanutils为什么被禁止使用?

收录于热门专栏Java基础教程系列&#xff08;进阶篇&#xff09; 在实际的项目开发中&#xff0c;对象间赋值普遍存在&#xff0c;随着双十一、秒杀等电商过程愈加复杂&#xff0c;数据量也在不断攀升&#xff0c;效率问题&#xff0c;浮出水面。 问&#xff1a;如果是你来写…