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

news2024/11/17 3:37:59

✨专栏介绍

在当今数字化时代,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)专栏

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

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

相关文章

Golang 交叉编译之一文详解

博客原文 文章目录 Golang 中的交叉编译不同操作系统间的编译Linux 下编译windowsmacos windows 下编译Linuxmacos macos 下编译Linuxwindows 不同架构下的编译amd64x86 参考 Golang 中的交叉编译 在 Golang 中,交叉编译指的是在同一台机器上生成针对不同操作系统或…

关于最近VSCode的Python代码格式化失效问题的解决办法

隔了一段时间再次打开VSCode写Python脚本,Python扩展弹出一条警告 查看日志输出发现Python的代码格式化设置发生了变化 简单来说就是Python扩展已经将原有的默认代码格式化工具 "ms-python.python" 弃用,格式化功能已移交到单独的格式化工具…

CUDA安装一直卡在检查系统兼容性,或花费极长的时间检查兼容性,但最后显示NVIDIA安装程序失败

CUDA安装一直卡在检查系统兼容性,或花费极长的时间检查兼容性,但最后显示NVIDIA安装程序失败 ⚙️1.软件环境⚙️🔍2.问题描述🔍🐡3.解决方法🐡🤔4.结果预览🤔 ⚙️1.软件环境⚙️ W…

【算法与数据结构】70、LeetCode爬楼梯

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:因为每次可以爬1阶或者2阶台阶,若想到达第i阶,则有两种情况:在第i-…

【数据结构专题】「延时队列算法」史上手把手带你认识一下数据结构的基本概念与术语

在本节中,我们将对一些概念和术语赋以确定的含义,以便与读者取得“共同的语言”。这些概念和术语将在以后的章节中多次出现。 数据 概念 数据(data) 是对客观事物的符号表示, 在计算机科学中是指所有能输人到计算机中并被计算机程序处理的…

强烈推荐!2024年设计师必备的10款Sketch插件

在现在的设计领域内,Sketch 已然成为设计师们最信赖的工具之一。为了更高效、更便捷地完成设计任务,Sketch 插件市场还提供了丰富的辅助插件。本文将深入盘点Sketch设计中不可或缺的10款插件,为广大设计师提供更丰富的设计体验。 1、摹客插件…

预付费平台在转供电的应用

安科瑞 崔丽洁 前言 国家从2018年开始对转供电加价开展规范清理以来,已经出来了一系列政策,不仅包括专门针对转供电问题的政策,18-20年间还在每次降电价政策中突出强调了转供电主体不得截留降价红利的要求。从具体内容看,各地政策…

test fuzz-01-模糊测试(Fuzz Testing)入门 Atheris、Jazzer、jqf、kelinci、FLA、libfuzzer 对比

拓展阅读 开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) 开源 Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) test fuzz-01-模糊测试(Fuzz Testing) test fuzz-…

计算机毕业设计选题分享-SSM书籍借阅管理系统04770(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

SSM书籍借阅管理系统 摘 要 随着科学技术的告诉发展,我们已经步入数字化、网络化的时代。图书馆是学校的文献信息中心,是为全校教学和科学研究服务的学术性机构,是学校信息化的重要基地。图书馆的工作是学校和科学研究工作的重要组成部分&…

ChatGPT付费创作系统V2.5.5独立版+前端

ChatGPT付费创作系统V2.5.5版本优化了很多细节,功能增加增加长篇写作功能。该版本为编译版无开源,本版本特别处理了后台弹窗、暗链网址。特别优化了数据库。升级过程中未发现任何BUG,全新安装或者升级安装均未出现400或者500错误,…

性能分析与调优: Linux 实现 缺页剖析与火焰图

目录 一、实验 1.环境 2.缺页(RSS增长)剖析与火焰图 一、实验 1.环境 (1)主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter…

密码输入检测 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 给定用户密码输入流input,输入流中字符 ‘<’ 表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密码安全要求。 密码安全要求如下: 密码长度&…

哈希-力扣202快乐数

题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&…

gdal获取最小外接矩形

地理信息系统中常用最小外接矩形&#xff08;MBR)表示一个地理要素的大致位置&#xff0c;地理系统中的许多操作&#xff0c;例如空间查询&#xff0c;空间检索&#xff0c;都需要用最小外接矩形建立RTree&#xff0c;以提升运算速度。 gdal中使用OGREnvelope定义最小外接矩阵&…

Linux Debian12系统gnome桌面环境默认提供截屏截图工具gnome-screenshot

一、简介&#xff1a; 在Debian12中系统gnome桌面环境默认提供一个截图捕获工具screenshot,可以自定义区域截图、屏幕截图、窗口截图和录制视频&#xff0c;截图默认保存在“~/图片/截图”路径下。 可以在应用程序中搜索screenshot,如下图&#xff1a; 也可以在桌面右上角找到…

使用JGit拉取代码提示未授权not authorized

原因&#xff1a;2021年8月13日后不支持密码登录&#xff0c;需要使用token验证 调用时候需要先去git仓库创建个人令牌 需要在安全中心创建个人token&#xff0c;使用token名称作为账号&#xff0c;使用token作为密码。 另&#xff1a; Github克隆仓库的三种方式对比&#xff…

数据结构实验2:队列的应用

目录 一、实验目的 二、实验原理 1.1 队列的基本操作 1.1.1 队列的定义 1.1.2 队列的初始化 1.1.3 入队操作 1.1.4 出队操作 1.1.5 检查队列是否为空 1.1.6 返回队列的长度 2.1队列的运用 三、实验内容 问题描述 代码 截图 分析 一、实验目的 1、理解并掌握队列…

基于Python爬虫的B站弹幕可视化

介绍 这是一个基于Python的B站弹幕可视化项目&#xff0c;主要使用了python django、requests、jieba等库。该项目实现了以下功能&#xff1a; 1. 爬取Bilibili视频弹幕数据&#xff1a;通过爬虫获取视频的标题、视频总时长、封面图&#xff0c;视频地址以及所有弹幕数据等。 …

C#.Net学习笔记——CLR核心机制

一、CLR基本介绍 &#xff08;1&#xff09;C(Common) L&#xff08;Language&#xff09; R&#xff08;Runtime&#xff09; IL的运行环境 &#xff08;2&#xff09;从下图可以看到&#xff0c;我们的计算机会先把我们写的语言&#xff0c;编写成IL语言&#xff0c;再给计…

伺服电机:伺服电机的控制模式

一、伺服电机基本的控制模式 在AC伺服系统中&#xff0c;对编码器所发出的脉冲信号或伺服电机的电流进行检测&#xff0c;将检测结果反馈给伺服驱动器&#xff0c;伺服驱动器根据检测结果和相应的控制指令&#xff0c;对伺服电机进行相应的控制&#xff0c;根据指令的不同&…