一文带你了解前端包管理工具npm、yarn和pnpm

目录
  • 为什么需要包管理工具?
  • 版本管理规范
  • 前端主流包管理工具
    • yarn vs npm vs pnpm
      • 包管理工具安装和版本切换
      • 安装项目依赖
      • npm 、yarn 和 pnpm 常用命令
      • 安全性
      • lock 文件
      • 性能对比
      • pnpm 的优势
  • 总结

为什么需要包管理工具?

每种主流编程语言都有包管理工具,比如 java 的 Maven、Gradle,Python 的 pip,nodejs 的 npm、yarn、pnpm 等。

包管理工具的主要作用是管理第三方依赖,也可以看成一个"轮子"工厂,每个人都可以上传自己造的"轮子"和下载使用别人的"轮子",包管理工具顾名思义就是统一管理这些轮子的软件或者工具,它以多种方式自动处理项目依赖关系、提供了命令行工具(CLI)、支持跟踪依赖项和版本等功能,
除此之外还可以安装、卸载、更新和升级包,配置项目设置,运行脚本等等。

有了包管理工具,我们可以很简单地构建一个项目或者引入和管理一个库,留给我们的则是愉快地编码。

npm 不只是包管理工具,它是世界上最大的软件注册表(registry),每星期大约有 30亿次 的下载量,包含超过 600000个包,开发者使用 npm 互相分享和借鉴。

版本管理规范

版本管理规范 - 语义化版本控制规范 SemVer

在使用 npm 和 yarn 安装完依赖时,package.json 会有类似以下的版本号:

"vue": "^2.6.11",
"vue-router": "~3.1.3"

2.6.11、3.1.3 这个版本号就是遵循了 SemVer 语义化版本控制的规范。

SemVer规范规定,版本的格式为:主版本号.次版本号.修订号-预发版本(可选),版本号递增规则如下:

  1. 主版本号:当你做了不兼容的 API 修改
  2. 次版本号:当你做了向下兼容的功能性新增
  3. 修订号:当你做了向下兼容的问题修正。
  4. 预发布版本:
    1. alpha(Alpha 版本,通常用于进行中的工作和实验)
    2. beta(Beta 版本,通常是下一个计划发布的功能完整的版本,但可能包含已知错误)
    3. rc: 候选版本,通常是可能最终(稳定)的版本,除非出现重大错误。

在 nodejs 版本管理中,还允许使用 ~ ^ * 字符来管理版本的范围:

  • ^: 不允许修改最左边非0版本 (^2.6.11: 版本 >= 2.6.11 且 < 3.0.0)
  • ~: 如果指定了次要版本,则只允许补丁版本更新,如果没有,则允许次要版本更新 (~3.1.3: 版本 >= 3.1.3 且 < 3.2.0)
  • *: 任何非预发版本 (版本 >=0.0.0)

前端主流包管理工具

主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这是包管理器都是基于 nodejs。

npm 是 2010 年发布的 nodejs 依赖管理工具,在此之前,前端的依赖管理都是手动下载和管理的。

yarn 是 Facebook 于 2016 年 发布的替代 npm 的包管理工具,还可以作为项目管理工具,定位是快速、可靠、安全的依赖管理工具。

pnpm 是 2017 年发布的一款替代 npm 包管理工具,具有速度快、节省磁盘空间的特点。

2010:npm 发布,支持 Node.js。
2016:yarn 发布,生成 yarn.lock 文件用于确定 repos 的精确版本,并且比 npm 性能更好。
2017:npm 5 发布,提供类似 yarn.lock 的 package-lock.json 文件。
2017:pnpm 发布,pnpm 具有 yarn 相对于 npm 的所有附加功能,并解决了 yarn 没有解决的磁盘空间问题。
2018:npm 6 发布,在 npm 在安装依赖项之前检查安全漏洞,提高了安全性。
2020:yarn 2 和 npm 7 发布,这两个软件包都具有出色的新功能。
2021:yarn 3 发布并进行了各种改进。

yarn vs npm vs pnpm

包管理工具安装和版本切换

因为 node 预装了 npm ,所以安装 node 后,不需要手动安装 npm。

相反地,yarn 需要手动安装。建议全局安装 yarn:

npm install yarn -g

然后,我们在项目的根目录设置需要的 yarn 版本:

# yarn set version latest # 最新版
# yarn set version canary # 最新的经典版
# yarn set version classic # 最新的经典版
# yarn set version 3.x
yarn set version <version>

使用 Yarn,在每个项目我们可以使用不同的版本,而在 npm 中,要安装 nvm 才能完成版本切换。

同样的,pnpm 也需要全局安装,才能使用

npm install pnpm -g

pnpm 其他使用命令和 npm 使用方法一致。

安装项目依赖

在执行 npm install 安装项目依赖时,依赖项是顺序安装,并且终端会输出很多的警告日志,导致覆盖报错的日志,从而难以排查问题。

使用 yarn 安装依赖时,运行 yarn 命令即可,yarn 是并行安装依赖项,这是它比 npm 快的原因之一,yarn 1 中的日志比较简介干净,是以树形的形式显示,但是在 yarn 2 和 yarn 3 中日志发生了变化,并不像以前直观。

并且,yarn 还支持离线安装,只要以前装过的包,可以在没有网络链接的情况下进行。yarn 具有重试机制,单个包安装失败不会导致整个安装失败。

在 yarn 安装不同版本的依赖时,会将多个版本归结为单个版本,避免创建多个副本。

npm 、yarn 和 pnpm 常用命令

  • npm init| yarn init| pnpm init: 初始化命令
  • npm run| yarn run/yarn | pnpm: 运行脚本
  • npm publish| yarn publish: 发布包
  • npm cache clean| yarn cache clean:清除缓存
  • npm install| yarn | pnpm install/i: 安装所有依赖
  • npm install [package]| yarn add [package]| pnpm add [package]: 安装某个依赖项
  • npm install --save-dev/-D [package]| yarn add --dev/-D [package]| | pnpm add --dev/-D [package]: 安装开发依赖
  • npm uninstall [package]| yarn remove [package]| pnpm remove/rm [package]: 卸载依赖
  • npm update| yarn upgrade| pnpm update/up: 更新全部依赖
  • npm update [package]| yarn upgrade [package]| pnpm update/up [package]|: 更新某个依赖

安全性

npm 最不好的缺点之一就是安全性,曾经的版本发生过几个严重的安全漏洞, npm 6 开始则是在安装之前会检查安全漏洞,并且支持使用 npm audit 手动检查安装包的安全性,如果发现安全问题,可以运行 npm audit fix 修复漏洞。

因为 npm/yarn 是扁平化依赖结构,有个非常严重的问题就是可以非法访问未声明的包,而 pnpm 是将依赖通过 link 的形式避免了非法访问依赖的问题,如果没在 package.json 声明的话,是无法访问的。

yarn 和 pnpm 同样也支持 yarn/pnpm audit 手动检查安装包的安全性。

yarn 和 npm 都是使用 hash加密算法 确保包的完整性。

lock 文件

在 package.json 跟踪的依赖项和版本总是不准确的,因为 ~ ^ * 等前缀表示依赖更新时对应的版本范围。

范围版本可以在更新依赖时自动升级依赖到兼容性的次要版本或者补丁版本,让软件包支持最新的功能或者修复最近的错误。

所以,为了避免不同设备安装依赖时的版本不匹配的问题,在 lock 文件中定义了精确的安装版本。在每次新装(更新)依赖时,npm 和 yarn 会分别

创建(更新) package-lock.json 和 yarn.lock 文件。这样就能保证其他设备安装完全相同的包。

在 pnpm 中,则是使用 pnpm-lock.yaml 文件定义依赖包的精确版本。

性能对比

npm/pnpm/yarn/yarnPnp install 性能对比

测试 package.json 位置

action cache lockfile node_modules npm pnpm Yarn Yarn PnP
install       51s 14.4s 39.1s 29.1s
install 5.4s 1.3s 707ms n/a
install   10.9s 3.9s 11s 1.8s
install     33.4s 6.5s 26.5s 17.2s
install     28.3s 11.8s 23.3s 14.2s
install   4.6s 1.7s 22.1s n/a
install   6.5s 1.3s 713ms n/a
install     6.1s 5.4s 41.1s n/a
update n/a n/a n/a 5.1s 10.7s 35.4s 28.3s

根据上面的测试结果我们可以看出,首次执行 npm install 安装依赖时 pnpm 比 npm 和 yarn 大约快了 3 倍左右,在有缓存和已安装过依赖的情况,比 npm 也快了不少,yarn 则是更快,其他场景 pnpm 也是占了很大优势。

pnpm 的优势

速度很快、节约空间

pnpm 的所有依赖包统一存储在 store,不会出现像 npm 或 yarn 每个项目会下载独立的依赖,yarn 是从缓存下载文件,而 pnpm 是从 store 中链接依赖,pnpm 更节约空间,当安装某个依赖时,新项目会使用硬链接到 store 的这个依赖,多个项目不会出现多次安装依赖的情况,磁盘只有一次写入。

对于依赖的不同版本,在 pnpm 中,则只会保存增量文件。比如:某个包有100个文件,如果更新版本只会修改其中的一个文件,不会因为新版本的存在而保存所有的依赖文件。

因为 pnpm 的依赖包存储在 store 同样也支持离线安装的功能。

没有扁平化 node_modules 结构

pnpm 不会扁平化依赖数,它的 node_modules 布局使用符号链接来创建依赖关系的嵌套结构。

pnpm 所有包都有自己的依赖项组合在一起,内部每个包使用符号链接将它们组合在一起。

一个 vue3 项目 的 pnpm node_modules 结构

vite 包的 pnpm 结构

参考链接

总结

到此这篇关于前端包管理工具npm、yarn和pnpm的文章就介绍到这了,更多相关前端包管理工具npm yarn pnpm内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pnpm的安装和使用指南(推荐!)

    目录 什么是pnpm pnpm优势 与 npm 的差别 pnpm使用 全局安装 设置源 使用 移除 更新 设置存储路径 个人使用 在系统上禁止使用脚本解决方法 总结 什么是pnpm pnpm是 Node.js 的替代包管理器.它是 npm 的直接替代品,但速度更快.效率更高. 为什么效率更高?当您安装软件包时,我们会将其保存在您机器上的全局存储中,然后我们会从中创建一个硬链接,而不是进行复制.对于模块的每个版本,磁盘上只保留一个副本.例如,当使用 npm 或 yarn 时,如果您有 100 个使

  • JS新包管理工具yarn和npm的对比与使用入门

    这篇文章会通过以下几个方面介绍yarn的: yarn对比npm解决了什么问题,带来哪些便利. 获取yarn的正确姿势 yarn的使用入门(介绍一些常用的命令 个人使用心得 yarn对比npm的优点 根据官方文档yarn具有6大优点 1.离线模式 yarn会有一个缓存目录,会缓存以前安装过的软件包,再次安装时就不必从网络下载了,大大加速安装速度. 这一点很重要,npm 饱受诟病的一点就是,每次安装依赖,都需要从网络下载一大堆东西,而且是全部重新下载,工程多的时候比较烦人. 我司部署node项目,是

  • yarn与npm的命令行小结

    一.首先需要了解的命令 npm install === yarn -- install 安装是默认行为. npm install taco --save === yarn add taco -- taco 包立即被保存到 package.json 中. npm uninstall taco --save === yarn remove taco 在 npm 中,可以使用 npm config set save true 设置 - -save 为默认行为,但这对多数开发者而言并非显而易见的.在 y

  • 使用pnpm包管理器替代npm及yarn的命令示例

    目录 前言 为什么会有 pnpm 不止于此 什么是扁平化的 node_modules pnpm 的 node_modules 如何使用 pnpm 安装 直接安装 通过 npm 安装 通过 HomeBrew 安装( 一种 MacOS 包管理器) 升级 使用 配置 命令 和其他包管理器比较 Monorepo 及 工作空间(Workspace) 什么是 Monorepo Workspace workspace: 协议 结语 前言 今天给大家介绍一种新的包管理器:pnpm,pnpm 由 zkochan

  • 一文带你了解前端包管理工具npm、yarn和pnpm

    目录 为什么需要包管理工具? 版本管理规范 前端主流包管理工具 yarn vs npm vs pnpm 包管理工具安装和版本切换 安装项目依赖 npm .yarn 和 pnpm 常用命令 安全性 lock 文件 性能对比 pnpm 的优势 总结 为什么需要包管理工具? 每种主流编程语言都有包管理工具,比如 java 的 Maven.Gradle,Python 的 pip,nodejs 的 npm.yarn.pnpm 等. 包管理工具的主要作用是管理第三方依赖,也可以看成一个"轮子"工厂

  • Web前端开发工具——bower依赖包管理工具

    Bower 是 twitter 推出的一款包管理工具,基于nodejs的模块化思想,把功能分散到各个模块中,让模块和模块之间存在联系,通过 Bower 来管理模块间的这种联系. 包管理工具一般有以下的功能: a)注册机制:每个包需要确定一个唯一的 ID 使得搜索和下载的时候能够正确匹配,所以包管理工具需要维护注册信息,可以依赖其他平台. b)文件存储:确定文件存放的位置,下载的时候可以找到,当然这个地址在网络上是可访问的. c)上传下载:这是工具的主要功能,能提高包使用的便利性.比如想用 jqu

  • Linux包管理工具yum、apt的区别

    目录 概述 RedHat 系列 Debian系列 系列对比 使用方式 1 dpkg包 2 APT 3 rpm包 3.1 安装 3.2 升级 3.3 卸载 3.4 查看 4 yum安装 yum特点 yum详细指令 总结 一般来说著名的 Linux 系统基本上分两大类:RedHat 系列:Redhat.Centos.Fedora 等:Debian 系列:Debian.Ubuntu 等. yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及

  • Perl图形化包管理工具PPM学习使用笔记

    PPM(Programmer's Package Manager)是ActivePerl自带的一个图形化管理工具,有了这个工具,要升级,更新,移除Perl的Package都非常方便.只需要输入ppm 或者 ppm gui就可以打开图形界面.毕竟用cpanm来安装的话,你也必须知道要安装的模块名,不是很方便,查询起来也麻烦,要上cpan专门的网页去查. 复制代码 代码如下: C:\>ppm 或者 复制代码 代码如下: C:\>ppm gui 横向的菜单说明如下: 可以使用过滤器来筛选: 可以查看

  • Node.js包管理器npm的具体使用

    目录 目的 npm init 与 package.json文件 模块安装与管理 安装模块 查看已安装模块 更新模块 删除模块 npx 模块编译 版本控制 换源 使用 nrm 工具换源 使用 cnpm 代替 npm 总结 目的 目前的Node.js安装包中都带有一个重要的工具 包管理器npm .npm主要有两方面功能:下载管理第三方模块:构建与运行项目.npm使用本身并不复杂,但是在大陆的网络环境下使用并不省心,徒增许多工作量.这篇文章将对相关内容做个说明. npm init 与 package.

  • Mac下python包管理工具pip的安装

    pip是常用的python包管理工具,用python的同学,都离不开pip -- 第一种 在系统自带的python2.7的路径下 pip是python的包管理工具,在Python2.7的安装包中,easy_install.py是默认安装的,而pip需要我们手动安装. 打开终端: sudo easy_install pip 第二种 在python3的路径下 curl https://bootstrap.pypa.io/get-pip.py | python3 安装后查看版本 pip --versi

  • Golang中的包及包管理工具go mod详解

    目录 一.包 二.包管理工具go mod 三.init函数 四.使用第三方包 一.包 1.包的种类:系统内置包.自定义包.第三方包. (1)系统内置包:go语言自带包,如str.conv.fmt等 (2)自定义包:开发者自己写的包 (3)第三方包:属于自定义包的一种,需下载到本地才能使用, 如可以从GitHub上下载的第三方包. 2.包是多个go源文件的集合,一个package下可以有多个go文件,归属于同一package 二.包管理工具go mod 1.在go的1.11版本之前如果想自定义包需

  • Python学习之pip包管理工具的使用

    目录 写文的原因 pip 简介 pip 安装/移除包 升级包和查看已安装包 搜索包 写文的原因 学习 Python 的过程中,经常会使用 pip 命令去安装第三方模块,但细细琢磨下来,我真的掌握这款工具了吗? 本文为你全面揭示一下 pip 包管理工具的使用! pip 简介 pip 是 Python 默认集成的包管理工具,而其本质就是 Python 标准库中的一个包,只是比较特殊一些,可以管理其它包,从 Python2.7 开始,Python 安装包中默认装载了 pip,而且如果使用虚拟环境,即使

  • bower 强大的管理web包管理工具

    Bower介绍 bower官方地址:http://bower.io/ bower是twitter的又一个开源项目,使用nodejs开发,用于web包管理.如果越来越多得开源项目都托管在github上,bower只需要将github上项目加上一个配置文件既可以使用bower方式使用安装包.作为包管理,bower能提供添加新web包,更新web包,删除web包,发布web包功能,管理包依赖.web包通常认为由html+css+javascript构成. quick start: 解决实际问题 试想我

  • 浅谈node模块与npm包管理工具

    在Node.js中,以模块为单位划分所有的功能,并且提供了一个完整的模块加载机制,所以我们可以将应用程序划分为各个不同的部分,并且对这些部分进行很好的协同管理.通过将各种可重用代码编写在各种模块中的方法,可以大大减少应用程序的代码量,提高应用程序的开发效率以及应用程序代码的可读性.通过模块加载机制,可以将各种第三方模块引入到我们的应用程序中. 在node.js中,提供npm包管理工具,用于从第三方网站上下载各种Node.js包. 一.模块 1.1 加载模块 在Node.js中,以模块为单位划分所

随机推荐