pnpm、Yarn 和 npm 的区别?

embedded/2024/12/27 19:35:22/

pnpm、Yarn 和 npm 都是 JavaScript 生态系统中流行的包管理工具,但它们在设计理念、性能特点和功能上存在一些差异。以下是这三种工具的主要区别:

1. 安装机制
  • npm

    • 使用扁平化的 node_modules 结构(从版本 3 开始),即所有依赖尽可能地安装在顶层。
    • 每次安装时都会复制文件到 node_modules 文件夹中。
  • Yarn

    • 同样使用扁平化的 node_modules 结构。
    • 引入了全局缓存来避免重复下载相同的包,并通过硬链接将缓存中的包链接到项目中。
    • 使用锁定文件 (yarn.lock) 来确保跨环境的一致性。
  • pnpm

    • 使用非扁平的 node_modules 结构,保持依赖树的层次结构。
    • 采用内容可寻址存储(CAS)来存储所有已下载的包,通过符号链接或硬链接将这些包引入项目的 node_modules 中。
    • 这种方式显著减少了磁盘空间占用并提高了安装速度。
2. 性能
  • npm:随着版本迭代,npm 的性能有了很大提升,但在处理大型项目时仍可能较慢。
  • Yarn:比早期版本的 npm 更快,特别是在网络请求方面进行了优化,减少了冗余下载。
  • pnpm:通常被认为是最快的包管理器之一,因为它避免了不必要的文件复制,利用了更高效的依赖解析和安装方法。
3. 依赖解析规则
  • npm:默认情况下允许幽灵依赖的存在,即项目可以访问未显式声明的依赖。
  • Yarn:提供了较为严格的依赖解析规则,但仍可能存在某些情况下幽灵依赖的问题。
  • pnpm:采用了最严格的依赖解析规则,确保每个包只能访问自己声明的直接依赖及其子依赖,从而彻底消除了幽灵依赖的可能性。
4. 工作区支持
  • npm:从 v7 开始正式支持工作区(workspaces),允许多个包共享一个根 package.json 文件。
  • Yarn:很早就支持了工作区,并且有丰富的配置选项。
  • pnpm:也支持工作区,并且由于其高效的依赖管理和安装机制,在多包仓库(monorepos)中表现尤为出色。
5. 锁文件
  • npm:使用 package-lock.json 文件。
  • Yarn:使用 yarn.lock 文件。
  • pnpm:使用 pnpm-lock.yaml 文件,提供与 Yarn 类似的锁定机制以保证依赖版本的一致性。
6. 社区和支持
  • npm:作为官方 Node.js 包管理器,拥有最大的市场份额和最强的社区支持,如果你重视兼容性和社区资源,npm 可能是一个不错的选择。
  • Yarn:由 Facebook 发起,得到了广泛采用,尤其在 React 社区中非常流行。如果你希望更快的安装速度和更好的安全性,那么 pnpm 或 Yarn 都比价适合你。
  • pnpm:虽然相对较新,但因其独特的优势迅速获得了开发者的好评,尤其是在对性能敏感的应用场景中。对于大型项目或者 monorepo 管理,pnpm 凭借其独特的依赖管理和出色的性能表现尤为突出。
产生幽灵依赖的原因?

在项目中,它的 node_modules 里有依赖 A,A 又依赖了 B,而现有 npm 的依赖存储方式是将所有依赖都铺平了放在 node_modules 下(就是无论层级关系事什么都铺平放)。这个时候我们可以在项目中直接引用 B。

产生幽灵依赖的场景 1:
在项目中,它的 node_modules 里有依赖 A,A 又依赖了 B,而你的项目中引入了依赖 B,这个时候将依赖 A 删除,依赖 B 也会跟着删除。再去访问 B 里面的方法就会报错。


http://www.ppmy.cn/embedded/149248.html

相关文章

《Opencv》基础操作详解(1)

目录 一、Opencv简介 OpenCV 的主要特点 二、Opencv库安装 1、opencv-python库安装 2、opencv-contrib-python库安装 三、Opencv 基础操作 1、opencv库的导入 2、读取、展示图片 3、查看图片信息 4、控制图片显示时间、关闭窗口 5、读取灰度图 6、彩色图片转灰度图 …

小程序canvas画环形百分比进度图

组件封装 component/canvas-ring目录下 canvas-ring.js <canvas style"width:{{canvasWidth}}px;height:{{canvasWidth}}px; margin:0 auto;position:relative" type"2d" id"myCanvas"><view class"circle-bar" style&quo…

Element分阶段逐步升级

这里写目录标题 1. 模块划分策略2. 模块化升级的步骤3. 示例&#xff1a;表单模块分阶段升级4. 整体项目的分阶段规划 1. 模块划分策略 在分模块升级之前&#xff0c;必须对项目进行模块化分析。模块可以按以下几种方式划分&#xff1a; 按功能划分 将项目划分为不同的业务模…

Ubuntu下通过Docker部署NGINX服务器

Yo! 大家好&#xff0c;Hitch在此带来一篇关于在Ubuntu下通过Docker部署NGINX服务器的技术博客。废话不多说&#xff0c;让我们直奔主题&#xff01; Docker和NGINX简介 Docker是一个开源的容器化平台&#xff0c;可以轻松创建、部署和运行应用程序。NGINX是一个高性能的Web服…

Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍

前文指路&#xff1a;《Vue零基础教程》&#xff0c;从前端框架到GIS开发系列课程 Vue零基础教程|从前端框架到GIS开发系列课程&#xff08;二&#xff09; Vue零基础教程|从前端框架到GIS开发系列课程&#xff08;三&#xff09;模板语法 Vue零基础教程|从前端框架到GIS开发…

攻防世界 PHP2

开启场景 访问 /index.php&#xff0c;页面无变化 访问 /index.phps index.php 和 index.phps 文件之间的主要区别在于它们的文件扩展名。 index.php&#xff1a;这是一个标准的 PHP 文件&#xff0c;通常用于编写 PHP 代码。当用户访问 index.php 文件时&#xff0c;Web 服务器…

细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV

目录 一、工程配置 1、时钟、DEBUG 2、GPIO 3、SPI2 4、USART6 5、NVIC 二、软件设计 1、FALSH &#xff08;1&#xff09;w25flash.h &#xff08;2&#xff09; w25flash.c 1&#xff09;W25Q16基本操作指令 2&#xff09;计算地址的辅助功能函数 3&#xff09;器…

RK356x bsp 7 - PCF8563 RTC调试记录

文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件&#xff1a;原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…