深入了解pnpm:一种高效的包管理工具

✨专栏介绍

在当今数字化时代,Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序,就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术,以及各种框架、库和工具。在本专栏中,我们将深入学习前端技术的各个方面。我们将学习如何使用HTML构建语义化的网页结构,如何使用CSS进行样式设计和布局,以及如何使用JavaScript实现交互功能和动态效果。此外,我们还将介绍各种流行的前端框架和库,并学习如何使用它们来提高开发效率和用户体验。通过学习这些内容,你将能够成为一名熟练的前端开发者,并能够应用这些知识来构建出现代化且高质量的Web应用程序。让我们一起开始前端技术的学习之旅吧!

在这里插入图片描述

文章目录

    • ✨专栏介绍
    • 引言
    • pnpm介绍
      • 什么是pnpm?
      • pnpm的特点
    • pnpm的原理
      • 共享依赖
      • 硬链接
      • 举个例子
    • pnpm的使用方法
    • 与npm、yarn的区别对比
      • 1. 安装速度
      • 2. 磁盘空间占用
      • 3. 生态系统支持
      • 4. 兼容性
    • pnpm的优缺点
      • 优点
      • 缺点
    • 结论
    • 😶 写在结尾


引言

在前端开发中,包管理工具是不可或缺的一部分。随着项目规模的增长,传统的npm和yarn在安装和更新依赖包时面临着性能和磁盘空间的挑战。为了解决这些问题,出现了一种新的包管理工具——pnpm。本文将深入介绍pnpm的原理、使用方法,并与npm和yarn进行对比,以帮助读者更好地理解pnpm并做出合适的选择。

pnpm介绍

什么是pnpm?

pnpm是一种快速、高效且磁盘空间友好的包管理工具。它通过共享依赖来减少磁盘空间占用,并通过硬链接来加快安装速度。

pnpm的特点

  • 快速安装:pnpm使用硬链接技术,将依赖包直接链接到项目中,避免了复制文件所带来的性能损耗。

  • 并行安装:pnpm可以并行地安装多个依赖包,提高了安装速度。

  • 安全可靠:pnpm使用了类似于npm的安全机制,确保依赖包的完整性和安全性。

  • 磁盘空间友好:由于共享依赖,不同项目之间可以共享相同版本的依赖包,大大减少了磁盘空间占用。

    当使用 npm 时,如果你有 100 个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本。然而,如果是使用 pnpm,依赖包将被存放在一个统一的位置。

下面是官方给出的一些对比数据

actioncachelockfilenode_modulesnpmpnpmYarnYarn PnP
install49.6s13.9s22.1s20.2s
install4s1.7s695msn/a
install15.6s4.8s8.8s668ms
install25.3s9.4s22.8s15.2s
install31.2s10.1s8.9s670ms
install4.4s3.6s16sn/a
install3.8s1.7s681msn/a
install4.4s9.3s16.6sn/a
updaten/an/an/a13.1s6.4s8.7s16.9s

在这里插入图片描述

pnpm的原理

共享依赖

pnpm通过将依赖包链接到项目中的.node_modules目录下,实现了共享依赖。这意味着不同项目可以共享相同版本的依赖包,从而减少了磁盘空间占用。

硬链接

pnpm使用硬链接技术来加快安装速度。当多个项目使用相同版本的依赖包时,pnpm会创建硬链接指向这些共享的依赖包,而不是复制文件。这样可以避免重复下载和复制文件所带来的性能损耗。

举个例子

假设有两个项目A和B,它们都需要安装lodash这个依赖包。使用npm或yarn进行安装时,每个项目都会在自己的node_modules目录下复制一份lodash的代码。这样就导致了重复的磁盘空间占用。

而使用pnpm进行安装时,它会在全局的.pnpm目录下维护一个共享的依赖包存储库。当项目A和B都需要安装lodash时,pnpm会将lodash链接到各自项目的.node_modules目录下。这样就实现了共享依赖,并且不会占用额外的磁盘空间。

例如,在项目A中执行pnpm install lodash命令后,.node_modules目录中会创建一个指向.pnpm目录中lodash版本的硬链接。然后,在项目B中执行同样的命令后,.node_modules目录中也会创建一个指向同一份lodash代码的硬链接。这样就实现了共享依赖,并且不会重复占用磁盘空间。

通过共享依赖和使用硬链接技术,pnpm能够显著减少磁盘空间的占用,并提高安装速度。

pnpm的使用方法

  1. 安装pnpm:首先,需要在系统中全局安装pnpm。可以使用以下命令进行安装:

    npm install -g pnpm
    
  2. 初始化项目:在要使用pnpm管理的项目根目录下执行以下命令,初始化项目:

    pnpm init
    

    这将创建一个新的package.json文件,用于管理项目的依赖包。

  3. 安装依赖包:使用以下命令来安装依赖包:

    pnpm install [package-name]
    

    可以一次性安装多个依赖包,也可以通过在命令后面添加--save--save-dev参数将依赖包添加到package.json文件中的dependencies或devDependencies字段中。

  4. 运行项目:安装完依赖包后,可以使用以下命令来运行项目:

    pnpm run [script-name]
    

    这里的script-name是在package.json文件中定义的脚本名称。

  5. 更新依赖包:当需要更新依赖包时,可以使用以下命令来更新:

    pnpm update [package-name]
    
  6. 删除依赖包:如果要删除某个已安装的依赖包,可以使用以下命令:

    pnpm uninstall [package-name]
    
  7. 查看已安装的依赖包:可以使用以下命令来查看已安装的依赖包列表:

    pnpm ls
    
  8. 清理缓存:pnpm会在全局的.pnpm目录下缓存依赖包,如果需要清理缓存,可以使用以下命令:

    pnpm cache clean
    

以上是pnpm的基本使用方法。

与npm、yarn的区别对比

1. 安装速度

  • npm:npm在安装依赖包时,会将每个包都复制到项目的node_modules目录下,这样会导致安装速度较慢。
  • yarn:yarn通过并行安装和缓存机制提高了安装速度,但仍然需要复制文件到node_modules目录。
  • pnpm:pnpm使用硬链接技术,将依赖包链接到项目的node_modules目录下,避免了复制文件的性能损耗。因此,在安装速度上明显快于npm和yarn。

2. 磁盘空间占用

  • npm:由于每个项目都会复制依赖包到自己的node_modules目录下,导致磁盘空间占用较大。
  • yarn:yarn通过缓存机制减少了磁盘空间占用,但仍然需要复制文件到node_modules目录。
  • pnpm:pnpm通过共享依赖包的方式,不同项目可以共享相同版本的依赖包。这样大大减少了磁盘空间占用。

3. 生态系统支持

  • npm:npm是最早的包管理工具之一,拥有庞大的生态系统和丰富的插件支持。可以方便地找到各种开源包和工具。
  • yarn:yarn兼容npm生态系统,可以使用npm的包和工具。同时,yarn也有自己的一些特性和插件支持。
  • pnpm:由于相对较新,pnpm的插件支持相对较少。虽然可以使用npm的包和工具,但在插件方面可能选择较少。

4. 兼容性

  • npm:由于npm是最早的包管理工具之一,几乎所有的前端项目都兼容npm。
  • yarn:yarn兼容npm生态系统,可以无缝切换使用。
  • pnpm:pnpm也兼容npm生态系统,并且可以直接使用已有的package.json文件。

综上所述,pnpm在安装速度和磁盘空间占用上具有明显优势。然而,在生态系统支持和插件方面可能相对较少。因此,在选择包管理工具时,需要根据项目需求和优先考虑的因素做出合适的选择。

pnpm的优缺点

优点

  • 快速安装:pnpm通过硬链接技术实现了快速安装。
  • 磁盘空间友好:共享依赖包减少了磁盘空间占用。
  • 安全可靠:类似于npm的安全机制确保依赖包的完整性和安全性。

缺点

  • 生态系统支持相对较少:由于相对较新,pnpm的插件支持相对较少。

结论

本文深入介绍了pnpm的原理、使用方法,并与npm、yarn进行了全面对比。通过比较可以看出,pnpm在性能和磁盘空间占用上具有明显优势,但由于相对较新,插件支持相对较少。因此,在选择包管理工具时,需要根据项目需求和优先考虑的因素做出合适的选择。


😶 写在结尾

前端设计模式专栏
在这里插入图片描述
设计模式是软件开发中不可或缺的一部分,它们帮助我们解决了许多常见问题,并提供了一种优雅而可靠的方式来构建应用程序。在本专栏中,我们介绍了所有的前端设计模式,包括观察者模式、单例模式、策略模式等等。通过学习这些设计模式,并将其应用于实际项目中,我们可以提高代码的可维护性、可扩展性和可重用性。希望这个专栏能够帮助你在前端开发中更好地应用设计模式,写出高质量的代码。点击订阅前端设计模式专栏

Vue专栏
在这里插入图片描述
Vue.js是一款流行的JavaScript框架,用于构建用户界面。它采用了MVVM(Model-View-ViewModel)的架构模式,通过数据驱动和组件化的方式,使开发者能够更轻松地构建交互性强、可复用的Web应用程序。在这个专栏中,我们将深入探讨Vue.js的核心概念、组件开发、状态管理、路由和性能优化等方面的知识。我们将学习如何使用Vue.js构建响应式的用户界面,并探索其强大的生态系统,如Vue Router和Vuex、Pinia。通过学习这些内容,你将能够成为一名熟练的Vue.js开发者,并能够应用这些知识来构建复杂而高效的Web应用程序。点击订阅Vue专栏

JavaScript(ES6)专栏在这里插入图片描述
JavaScript是一种广泛应用于网页开发和后端开发的脚本语言。它具有动态性、灵活性和易学性的特点,是构建现代Web应用程序的重要工具之一。在这个专栏中,我们将深入探讨JavaScript语言的基本语法、DOM操作、事件处理、异步编程以及常见算法和数据结构等内容。此外,我们还将介绍ES6(ECMAScript 2015)及其后续版本中引入的新特性,如箭头函数、模块化、解构赋值等。通过学习这些内容,你将能够成为一名熟练的JavaScript开发者,并能够应用这些知识来构建出高质量和可维护的Web应用程序。点击订阅JavaScript(ES6)专栏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python笔记03-判断和循环

文章目录 比较运算符if-else语句while语句for循环循环中断 比较运算符 字面量True表示真,字面量False表示假 if-else语句 if语句判断条件的结果一定要是布尔类型 不要忘记判断条件后的: 归属于if语句的代码块,需在前方填充4个空格缩进 age…

批量整理记账,让你的财务生活更轻松

每个月,每季度,每年,都需要花费大量的时间来整理、核对账单和记录每一笔支出。这种繁琐的工作真的太费时、费力了!但今天,我要给你介绍一个神奇的工具——晨曦记账本。 所需工具: 一个【晨曦记账本】软件…

常用类型_日期..

1.Date java.util.Date是开发中常用的日期处理类(并非java.sql.Date类) 现在这么一个需求: 就是获取当前时区的时间 public class Main{public static void main(String[] args) {// d1和d2表示的时间都是一样的 所以推荐使用第一种写法 比较简洁Date d1 new Da…

全新热门电商API接口,实现闲鱼商品详细搜索功能

近年来,电商行业蓬勃发展,API(Application Programming Interface)接口已经成为电商平台的重要组成部分。API接口联讯数据不仅可以实现平台间的数据交互,还可以为开发者提供丰富的功能,满足用户多样化的需求…

多模态推荐系统综述:五、挑战

五、挑战 1、Multimodal Recommender Systems: A Survey 2023 •通用解决方案。 值得注意的是,尽管针对模型中的不同阶段提出了一些方法[24],但没有提供这些技术组合的最新通用解决方案。 •模型可解释性。 多模态模型的复杂性会使系统生成的建议难以…

【数据结构篇】数据结构中的 R 树和 B 树

数据结构中的 R 树和 B 树 ✔️关于R树(RTree)✔️什么是B树(B-tree)✔️B树和B树的区别✔️B树和B树在数据存储方面的具体差异 ✔️拓展知识仓✔️R树和B树的区别✔️ 那在内存消耗上有什么区别?✔️ R树有哪些优点和…

【数据库】mysql事务

一、事务的基本概念 1、事务的定义 事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。。 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行&…

海外代理IP在游戏中有什么作用?

随着科技的飞速发展,手机和电脑等电子产品已成为互联网连接万物的重要工具,深度融入我们的日常生活,我们借助互联网完成工作、休闲和购物等任务,以求提升生活质量。 不仅如此,网络游戏也是人们心中最爱,它…

2024.1.8每日一题

LeetCode 回旋镖的数量 447. 回旋镖的数量 - 力扣(LeetCode) 题目描述 给定平面上 n 对 互不相同 的点 points ,其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式…

Prometheus Blackbox_exporter笔记

一、安装Promtheus 在 Prometheus 官网 Download | Prometheus 获取适用于 Linux 的 Prometheus 安 装包,这里我选择最新的 2.46.0 版本,我是 Linux 系统,选择下载 prometheus-2.46.0.linux-amd64.tar.gz 下载安装包: wget htt…

UI自动化测试神器:RunnerGo

UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势,包括提高测试效率、减少人力成本、提升软件质量等。同时,可视化工具为UI自动化测试带来了更多便利和灵活性。然而,可视化工具也存在一些潜在的劣势。本文将探讨…

读元宇宙改变一切笔记01_起源

1. 元宇宙是我们下一个生存之地 1.1. 1968年,只有不到10%的美国家庭拥有彩色电视,但当年票房排名第二位的电影《2001:太空漫游》(2001: A Space Odyssey)设想了这样的未来 1.1.1. 斯坦利库布里克(Stanley Kubrick) …

二 数据查询

1、实验目的 理解SQL成熟设计基本规范,熟练运用SQL语言实现数据基本查询,包括但表查询、分组统计查询和连接查询。 2、实验内容及要求 针对数据库设计各种单表查询SQL语句、分组统计查询语句;设计单个表针对自身的连接查询,设计…

lc 140. 单词拆分 II

回溯算法查询匹配单词 class Solution { public:unordered_map<string, int> word_map;void mapping(vector<string>& wordDict){for(auto &a : wordDict)word_map[a];}vector<string> ret;// s: 原始字符串// tmp: 已查询到的单词// …

【Flutter 开发实战】Dart 基础篇:最基本的语法内容

在深入了解 Dart 这门编程语言之前&#xff0c;我们需要了解一些关于 Dart 的最基本的知识&#xff0c;像是常量、变量、函数等等&#xff0c;这样才能够让我们的开发效率更上一层楼。在本节&#xff0c;我们将探讨一些基础语法&#xff0c;包括入口方法 main、变量、常量以及命…

光伏组件QUV紫外加速老化试验箱

一、产品特点 QUV紫外加速老化试验箱能模拟阳光中 UV340波段光谱的荧光紫外灯&#xff0c;并结合控温、供湿等装置来模拟对材料造成变色、亮度、强度下降&#xff1b;开裂、剥落、粉化、氧化等损害的阳光&#xff0c;以及高温、高湿、凝露、黑暗周期等因素&#xff0c;同时通过…

Linux文件系统与日志分析管理

目录 一、文件系统 1. inode表 2. 查看inode号 3. 文件目录 4. 三种时间戳 5. 删除文件空间不释放 6. 文件恢复extundelete 7. xfs类型备份和恢复 二、日志分析 1. 日志的种类 2. 内核和公共日志 3. 用户日志 3.1 查询当前登录的用户情况 3.2 查询用户登录的历史记…

Linux-添加虚拟内存,不添加硬盘方式操作

在linux中&#xff0c;当物理内存mem不足时&#xff0c;就会使用虚拟内存(swap分区) 例如增加2G虚拟内存&#xff0c;操作如下: 1.查看内存大小 [rootlocalhost ~]# free -m 2.创建要作为swap分区的文件:增加1GB大小的交换分区&#xff0c;则命令写法如下&#xff0c;其中的cou…

免费的开源低代码平台推荐

1.JNPF 最后&#xff0c;推荐一个近期用的不错的低代码。 应用地址&#xff1a;https://www.jnpfsoft.com?csdn 开发语言&#xff1a;Java/.net 这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类&#xff0c;方便扩展&#xf…

Redis分布式锁(二)基于Redis的分布式锁

一、redis锁 1、思路 利用set nx ex获取锁&#xff0c;并设置过期时间&#xff0c;保存线程标识释放锁时先判断线程标识是否与自己一致&#xff0c;一致则删除 2、特性 利用set nx满足互斥性利用set ex保证故障时锁依然能释放&#xff0c;避免死锁&#xff0c;提高安全性利…