npm,yarn,pnpm

chatgpt/2023/9/26 14:40:03

原理

npm、yarn和pnpm都是用于管理Node.js项目依赖的包管理工具,下面对它们进行详细讲解:

  1. npm(Node Package Manager):

    • npm是Node.js的默认包管理工具,也是最早被广泛使用的。
    • npm使用package.json文件来管理项目依赖,通过运行npm install命令来安装依赖包。
    • npm的安装速度相对较慢,需要先下载所有包的压缩文件,再解压和安装。
    • npm的缓存机制相对简单,会将下载的包缓存在本地缓存中,有时候可能会导致缓存占用较大的空间。
    • npm使用package-lock.json文件来锁定项目依赖的版本,保证在不同的环境中依赖版本的一致性。
    • npm将每个包安装在项目的node_modules目录下,可能会导致空间占用较大。
  2. yarn:

    • yarn是由Facebook开发的包管理工具,旨在解决npm的一些性能问题。
    • yarn也使用package.json文件来管理项目依赖,通过运行yarn install命令来安装依赖包。
    • yarn的安装速度相对较快,它使用并行安装的方式,可以同时下载和安装多个包。
    • yarn的缓存机制较为智能,会检查本地缓存中的包是否已经被其他项目使用,如果没有则会删除,从而减少缓存占用空间。
    • yarn使用yarn.lock文件来实现版本锁定的功能,与npm的package-lock.json类似。
    • yarn的包安装在全局缓存目录中,多个项目可以共享相同的包,因此空间占用较少。
  3. pnpm:

    • pnpm是另一款包管理工具,它与npm和yarn的不同之处在于它使用了硬链接的方式来安装包。
    • pnpm也使用package.json文件来管理项目依赖,通过运行pnpm install命令来安装依赖包。
    • pnpm的安装速度更快,它使用硬链接的方式将包安装到一个共享的存储位置,不会多次下载相同的包。
    • pnpm的缓存机制类似于npm,但使用硬链接存储包,所以在缓存占用方面比较节省空间。
    • pnpm使用pnpm-lock.yaml文件来实现版本锁定的功能。
    • pnpm也将包安装在共享的存储位置,所以空间占用较少。

总体来说,yarn和pnpm相对于npm来说,在安装速度和空间占用方面有一定的优势,而且在缓存和锁定机制上也更加智能和高效。选择使用哪个工具可以根据具体的项目需求和个人偏好进行选择。在新项目中,可以考虑使用yarn或pnpm来获得更好的性能和用户体验。

区别

npm,yarn和pnpm都是用于管理Node.js项目依赖的包管理工具,它们之间有一些区别,下面是它们的主要区别:

  1. 安装速度:

    • npm:在安装包时,npm会先下载所有包的压缩文件,然后再解压和安装,因此安装速度相对较慢。
    • yarn:yarn使用并行安装的方式,可以同时下载和安装多个包,因此安装速度相对较快。
    • pnpm:pnpm使用硬链接的方式,将包安装到一个共享的存储位置,不会多次下载相同的包,因此安装速度更快。
  2. 缓存机制:

    • npm:npm的缓存机制较为简单,会将下载的包缓存在本地缓存中,但有时候可能会导致缓存占用较大的空间。
    • yarn:yarn的缓存机制更为智能,它会检查本地缓存中的包是否已经被其他项目使用,如果没有则会删除,从而减少缓存占用空间。
    • pnpm:pnpm使用了类似npm的缓存机制,但它使用硬链接方式存储包,所以在缓存占用方面比较节省空间。
  3. 锁定机制:

    • npm:npm使用package-lock.json文件来锁定项目依赖的版本,保证在不同的环境中依赖版本的一致性。
    • yarn:yarn使用yarn.lock文件来实现版本锁定的功能,与npm的package-lock.json类似。
    • pnpm:pnpm也有类似的锁定机制,但它将锁定信息存储在一个独立的文件中,名为pnpm-lock.yaml。
  4. 空间占用:

    • npm:npm会将每个包安装在项目的node_modules目录下,因此在多个项目中可能会存在多个相同的包,导致空间占用较大。
    • yarn:yarn的包安装在全局缓存目录中,多个项目可以共享相同的包,因此空间占用较少。
    • pnpm:pnpm使用硬链接的方式,将包安装到一个共享的存储位置,所以在空间占用方面也比较节省。

总体来说,yarn和pnpm相对于npm来说,在安装速度和空间占用方面有一定的优势,而且在缓存和锁定机制上也更加智能和高效。选择使用哪个工具可以根据具体的项目需求和个人偏好进行选择。

pnpm为什么安装速度快

pnpm之所以安装速度快,主要有以下几个原因:

  1. 共享依赖: pnpm采用了类似硬链接的技术,将相同的依赖包安装到共享的存储空间中。这样,当多个项目都依赖同一个包时,实际上只需要在磁盘上保存一份该包的内容,减少了重复的下载和存储开销。

  2. 符号链接: pnpm使用符号链接技术,而不是像npm和yarn那样将依赖包完全复制到每个项目的node_modules目录中。符号链接可以在不复制文件的情况下,让不同的文件路径引用同一个实际文件,从而节省了磁盘空间和文件复制时间。

  3. 并行安装: pnpm支持并行安装依赖包,即同时下载多个依赖包,而不是像npm那样一个一个地下载。这样可以显著提高安装速度,尤其是在大型项目中或者网络较慢的情况下。

  4. 版本嵌套: pnpm支持版本嵌套,即在同一个项目中可以同时使用不同版本的依赖包。这样可以避免版本冲突和冗余的依赖安装。

  5. 缓存: pnpm使用了本地缓存,可以将下载过的依赖包保存在本地,下次再安装相同的依赖包时,就可以直接从缓存中读取,节省了下载时间。

总的来说,pnpm通过共享依赖、符号链接、并行安装等一系列优化措施,大大提高了依赖包的安装速度,特别是在多个项目共享依赖包的场景下,安装速度更加明显。同时,pnpm还保持了和npm一样的命令和功能,对现有的npm生态也有良好的兼容性。

软链接与硬链接区别

软链接(Symbolic Link,也称为符号链接)和硬链接(Hard Link)是两种不同的文件链接方式,它们在文件系统中的表现和使用上有一些区别:

  1. 定义:

    • 软链接:软链接是一个特殊的文件,它包含了指向另一个文件或目录的路径。软链接本身类似于一个快捷方式,通过软链接可以跨越文件系统边界链接文件或目录。
    • 硬链接:硬链接是文件系统中的多个文件条目指向同一个数据块的链接。这意味着多个硬链接实际上是同一个文件的不同名字,它们共享相同的数据内容。
  2. 跨文件系统:

    • 软链接:软链接可以跨越文件系统边界,可以链接到不同分区或不同设备的文件或目录。
    • 硬链接:硬链接不能跨越文件系统边界,必须在同一个文件系统内创建。
  3. 大小:

    • 软链接:软链接本身是一个很小的文件,它只包含了指向目标文件或目录的路径名。
    • 硬链接:硬链接没有额外的文件,它们与目标文件共享相同的数据块,因此没有额外的空间开销。
  4. 删除目标文件:

    • 软链接:如果目标文件被删除或移动,软链接将失效,指向一个不存在的目标。
    • 硬链接:如果目标文件被删除或移动,硬链接仍然存在且可以继续访问目标文件的内容,只有当所有的硬链接都被删除后,目标文件的数据块才会被释放。
  5. 使用场景:

    • 软链接:适用于需要跨文件系统链接的场景,或者需要创建一个指向目标文件或目录的快捷方式。
    • 硬链接:适用于在同一个文件系统内创建多个文件名指向相同数据块的场景,可以节省磁盘空间。

需要注意的是,不同操作系统对软链接和硬链接的支持可能有所不同。在Windows系统中,软链接称为符号链接,而在Linux和macOS等系统中都通常称为软链接。硬链接在Windows系统中的支持相对较少,主要在类Unix系统中使用较多。

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

No Silver Bullet

“No Silver Bullet” is a popular term in software engineering, originating from a famous paper titled “No Silver Bullet — Essence and Accidents of Software Engineering” written by Fred Brooks in 1986. In this paper, Brooks put forth his views on the di…

Rust- 智能指针

Smart pointers A smart pointer is a data structure that not only acts like a pointer but provides additional functionality. This “smartness” comes from the fact that smart pointers encapsulate additional logical or semantic rules, which are automaticall…

pyspark提交py文件指南

基本命令和参数 提交基本命令./bin/spark-submit \--master <master-url> \--deploy-mode <deploy-mode> \--conf <key<=<value> \--driver-memory <value>g \--executor-memory <value>g \--executor-cores <number of cores> \--…

【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名对象)

目录 一、初始化列表 ⭕初始化列表概念 ⭕初始化列表的优点 ⭕使用场景 ⭕explicit关键字 二、Static成员 ⭕Static成员概念 &#x1f534;静态数据成员&#xff1a; &#x1f534;静态函数成员&#xff1a; ⭕使用静态成员的优点 ⭕使用静态成员的注意事项 三、友…

Linux——进程控制

目录 1. 进程创建 1.1 fork函数 1.2 fork系统调用内部宏观流程 1.3 fork后子进程执行位置分析 1.4 fork后共享代码分析 1.5 fork返回值 1.6 写时拷贝 1.7 fork常规用法 1.8 fork调用失败的原因 2.进程终止 2.1 进程退出场景 2.2 strerror函数—返回描述错误号的字符…

golang静态编译及编译失败排查步骤

文章目录 一、背景前提 二、静态编译概述1、执行静态编译设置CGO_ENABLED方式指定link方式 2、编译报错分析&#xff08;1&#xff09;确认系统上有没有安装libopus&#xff08;2&#xff09;设置LD_LIBRARY_PATH 三、详细排查过程1、下载bpf排查工具bcc, bcc-tools,python-bcc…

vue3 封装一个事件方法,支持所有页面调用

我做的是路由跳转&#xff0c;因为需要支持跨项目使用&#xff0c;所以才使用这个方法 在router.js中 import { createRouter, createWebHistory } from vue-router;// 创建路由实例和路由配置... export const router createRouter({history: createWebHistory(),routes: [/…

MySQL的on duplicate key update 使用说明与总结

https://blog.csdn.net/weixin_44786530/article/details/123069755 <insert id"insertBatch" parameterType"java.util.List">insert into tb_water_source_station(ownership, station_name,date,current_capacity,max_capacity,current_level,ma
推荐文章