软件包经理:了解NPM,NPX和纱线
#javascript #node #npm #yarn

在使用JavaScript/Typescript的开发方案中,在不使用软件包管理器的情况下构建专业应用程序是不可想象的。如此之多,以至于在计算机上安装node.js javascript运行时时,已经有一个选项(默认情况下检查)还可以安装其默认包装管理器:npm。

从NPM开始,我们还可以安装通常构成复杂应用程序基础的软件包,此外还可以在项目中嵌入管理系统及其依赖项。

在本文中,我将解释最受欢迎的经理及其差异的特征和历史。为了更好地理解,我们将以英语的方式解决这一术语,这是日常开发中最常用的形式。

为什么有必要拥有软件包管理器?

作为开发人员,我们有责任重视我们项目中时间和资源的优化。在一个流行的类比中,让我们想象我们的工作是组装汽车:我们可以从油提取到最终生产轮胎,因为我们可以将它们准备好并在所有生产的汽车中重复使用它们。

但是,确实有必要跟踪使用哪些组件及其版本,以确保在汽车上工作的每个人都使用相同的组件。有了开发项目,情况类似:考虑到已经执行了数千次相同的活动,每个项目都可以从头开始开发一个将服务器公开到网络的应用程序。

这就是包装管理器的需求:除了将我们指向资源存储库外,它还确保了项目开发中参与的所有人都遵循相同的依赖树。另外,使用软件包管理器时,更新这些依赖项的版本要容易得多。而不是必须更新软件包及其依赖项列表(以及这些依赖关系的依赖性列表)。所有这些都用一个简单的命令来解决,例如

npm update packagename

尽管使用了代表自己函数的名称,但NPM并不是节点中唯一的软件包管理器。正如我们稍后将看到的那样,公司也开发了自己的解决方案,就像纱线一样。

NPM的三个部分

npm由不同的部分组成:网站(https://www.npmjs.com/),注册表和命令行接口(CLI)。该站点用于发现软件包,配置配置文件并管理NPM体验的其他方面。 CLI来自终端,这是大多数开发人员与NPM互动的方式。最终,注册表是一个大型的JavaScript软件的公共数据库,也是围绕它的元信息。

NPM网站

NPM网站是您可以在其中注册出版包的帐户。通过它,除其他管理功能(属于组织和管理私人软件包)外,还可以查询注册表中的软件包。

NPM注册

公共NPM注册表是包含有关已发布软件包的信息的数据库,每个软件包都包含代码和元数据。开源开发人员和企业开发人员使用NPM注册表为整个社区或其组织成员贡献软件包,并下载软件包以在自己的项目中使用。

因为它是公共注册表,所以其他软件包经理(例如YARN,我们将稍后解释)使用与NPM相同的注册表。

NPM CLI

使用NPM CLI,您可以使用其名称和所需版本安装注册表中的软件包。可以在全球下载软件包(无论范围如何,都可以随时使用(无论范围如何)(在项目中专门使用并专门使用)。 CLI用法指南将需要一份针对此的文章,但最常见的命令分别用于安装和删除软件包:

npm install packageName
npm uninstall packageName

我们可以使用-g标志来定义该软件包的全局安装,该软件包通常用于针对开发本身的软件包,脚本可由NPX命令执行。

在项目范围内运行安装命令时,将软件包文件及其依赖项下载到一个名为node_modules的文件夹中,并通过项目root:package.json和package-lock.json中的两个文件进行组织。与往常一样,了解更多有关CLI命令的最佳来源是官方文档:https://docs.npmjs.com/

软件包文件

NPM安装的软件包的组织通过JSON格式的两个文件进行:软件包和软件包锁。接下来,我们将解释两者的交界。

package.json

使用NPM安装XXX命令安装软件包或使用NPM Init启动项目时,创建或修改了称为package.json的文件。该文件具有基本信息,因此每个人都可以看到有关该项目的基本信息,可用脚本以及依赖关系网络,包括生产和开发。

如果您只需在NPM Init命令的非初始化项目中安装一个软件包,则唯一的键将是带有已安装属性值的依赖项。执行快速安装的示例:

{
   "dependencies": {
   "express": "^4.18.2"
   }
}

package.json文件自然会自动增长项目的复杂性。要查看文件中可用的属性列表,我建议阅读文档,尤其是关于可以定义各种命令的脚本属性,例如运行测试或打开服务器进行开发。

包裹锁

package-lock.json文件将自动创建和更新。它描述了生成的确切文件树,因此随后的安装可以生成相同的树,无论中间依赖性更新如何。

与package.json不同,我们不应该手动更新此文件,因为它完全可以使用,以便NPM可以生成相同的操作,而无论其运行的上下文如何。后来,我们将看到NPM的替代品,称为YARN。该替代方案产生了一个称为yarn.lock的类似文件,该文件具有与package-lock.json相同的功能,但描述了YARN执行的安装。

NPX命令

上面,我们讨论了如何使用NPX命令从NPM安装的软件包运行脚本。用法很简单(在方括号中是可选参数):

npx packageName [@] [args...]

此命令允许您从NPM软件包运行任意命令(要么本地安装或远程获取 - 如果在本地项目依赖项中或全球机器中不存在任何请求的软件包,它将在文件夹中安装在文件夹中NPM缓存)。最常用的软件包脚本之一,尤其是对于前端开发人员,是创建反应应用:

npx create-react-app my-app-name

运行此脚本使用React创建项目的整个基本结构,从而大大加快了项目设置。鉴于命令的性质,可以将可执行文件集成到包装中,或者创建唯一函数是执行的软件包。为了灵感,我建议键入命令

npx azhariel

在NPM用户全球可用的简单名片示例中,

对于所有NPM的优点,一些开发人员认为需要改进软件包管理器。其中一个人是塞巴斯蒂安·麦肯齐;在葡萄牙语中,在Facebook工作时,Mais Um Gonegotiatia de Recursos。尽管与科技巨头的最初联系,但经理是开源的,并且没有直接由任何公司维护。

要使用纱线,我们必须使用NPM本身在全球安装它:

npm install --global yarn

当前,YARN使用NPM维护的相同注册表,仅指向另一个CNAME域。因此,与标准经理的主要区别在于经理的体系结构,策略和绩效。

命令

两位经理的命令存在一些差异。与往常一样,我总是建议咨询两者的官方文件,但总而言之,我们可以使用下表:

命令 npm
安装依赖项 NPM安装
安装软件包 NPM安装[软件包] 纱线添加[软件包]
安装开发软件包 NPM安装-Save-dev [package] 纱线添加-dev [package]
卸载软件包 NPM卸载[package] 纱线删除[软件包]
卸载开发程序包 NPM卸载-Save-dev [package] 纱线删除[软件包]
更新 NPM Update 纱线升级
更新软件包 NPM Update [package] 纱线升级[package]
全局安装软件包 NPM安装-Global [package] 纱全局添加[软件包]
全局卸载软件包 NPM卸载-Global [package] 纱线全局删除[软件包]

来源:https://www.digitalocean.com/community/tutorials/nodejs-npm-yarn-cheatsheet

安装软件包

npm将指定的软件包直接安装到node_modules文件夹中,而YARN默认情况下,从机器上全球使用的缓存文件夹中执行安装。尽管它还维护了一个缓存文件夹,但NPM从该项目的注册表中获取文件。这种缓存策略使纱线只要在本地缓存中已可用。

都可以安装依赖项。

仍在包装安装中,纱线选择并行下载和安装策略,以优化安装多个依赖项所需的总时间。相比之下,NPM下载并线性安装,一次包装。

插入n播放策略(PNP)

自2018年以来,Yarn可以使用优化的策略来帮助节点找到安装软件包的正确位置。通常,节点递归地查找已安装的模块:当有依赖关系要求时,运行时在node_modules文件夹中查找它。如果找不到它,它将返回到上面的node_modules文件夹中的一个级别,直到找到安装依赖关系的位置(或者找不到并生成依赖关系错误)。

作为此搜索序列的替代方法,YARN生成了一个.pnp.cjs文件,而不是Node_modules文件夹。 .pnp.cjs文件包含几个地图:一个将包装名称和版本链接到磁盘上的位置,另一个将链接的软件包名称和版本链接到其依赖项列表。使用这些查找表,只要它是依赖项树的一部分,纱线就可以立即告诉Node在哪里可以找到所需的任何软件包。

默认情况下,它在最新版本的Yarn(2,别名Berry)中使用。有关更多信息可以在官方文档中找到。

安全

两个经理都有保证包装安装和执行的安全性。但是,他们使用不同的策略。当请求安装软件包时,纱线通过生成与数据集成并在本地进行比较的校验和进行比较,保证数据的完整性,如果计算显示不同的结果,则拒绝数据。另一方面,NPM使用SHA-512算法来验证软件包的完整性,并将它们与package-lock.json文件中提供的哈希进行比较。

此外,NPM还具有NPM审核命令,该命令告知已安装的依赖版本中可能的漏洞和NPM Audit Fix命令,该命令旨在解决报告的漏洞,并升级到最近的版本。

速度

由于有几个因素可以影响包装管理器操作的最终速度,因此有必要分析不同的方案。考虑到这一点,另一位称为PNPM的软件包经理在NPM,YARN和PNPM本身之间执行每日基准。可以在PNPM网站上检查结果。例如,这些是本文发表日期获得的结果:

pnpm speed benchmark

在大多数情况下,纱线似乎比NPM操作具有优势,尤其是在使用PNP策略与CACHE和LOCKFILE结合使用时,几乎可以瞬时安装软件包。

结论

尽管偶尔有差异,归根结底,比选择管理器的选择更重要的是包装本身的选择。

当我们选择使用软件包时,我们还开始与该软件包相关的所有依赖项,这可以为项目的进度产生不必要的连锁效果。

说,构建现代,专业的应用程序几乎一定需要安装包裹,因此,对管理这些软件包的基本了解是开发人员的必要技能。