在本 npm 指南中,我们已经对 npm 有了大致的了解——它代表 Node 包管理器。在此过程中,我们讨论了命令行的重要性以及它如何与 npm 一起使用。
我们还专门研究了 npm 中的“n”——Node——并了解到 Node 非常类似于我们在浏览器中运行网站的 JavaScript 代码。事实上,Node 就是 JavaScript;它只是在浏览器外部运行,并且能够执行与其基于浏览器的对应物不同的操作。
现在让我们关注 npm 中的最后两个字母,即“包管理器”部分。为了充分理解 npm 是什么,我们需要知道包管理器是什么。因此,很自然地,为了理解那,我们需要了解“包”到底是什么。
“包”是一个总称,用于您添加到项目中并以某种方式使用的任何外部代码文件。也许您过去曾在项目中使用过 jQuery、Bootstrap 或 Axios。这些是包的常见示例。
我们称它们为“包”,因为它们已“打包”并准备好使用。某些语言称它们为其他名称(例如,Ruby 称它们为“gem”),但概念相同。为了避免过度简化,包 是您没有编写但从某些公共来源获取以用于项目的代码。 您知道的,第三方代码。
或者,如果您更喜欢使用助记符的音乐模仿:
? 当您选择代码时 ? 不是您的,但您使用 ? 这是一个包 ? 当您安装的东西时 ? 您导入并调用, ? 这是一个包
包也经常被称为“依赖项”,因为您编写的代码依赖于它们的存在。例如,使用 jQuery 的 $ 编写的代码如果 jQuery 本身没有加载,将无法正常工作。(因此,包管理器有时也称为“依赖项管理器”。)
就包含的代码量而言,包的大小可能会有所不同。一个包可能执行一些巨大的操作,从而改变您编写整个项目的方式(例如整个框架),或者它可能执行一些非常小的、专注的操作,您只需在需要的地方添加即可(例如小部件或特定任务的辅助程序)。
如果您过去使用过包,很可能您只是在 HTML 中使用脚本标签将其应用于从外部 URL(理想情况下是从 CDN)提取的脚本标签。以下是您如何在网站的 HTML 中包含 jQuery 的方法:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
另一种方法是下载包的副本,将其添加到项目的文件夹中,然后链接到它,如下所示:
<script src="./js/jquery-3.6.0.min.js"></script>
多年来,这两种方法都运行良好。它很简单。它很干净。就包而言,它通常可以让您“设置并忘记”。那么为什么您还需要其他东西呢?
您可以想象,对于可以方便地使用公共交通工具或不需要长途旅行的人来说,拥有汽车可能看起来并不吸引人。(这将与包管理器讨论相关,我保证。坚持下去。)
如果您方便地使用高效的公共交通工具,那么为一台大型机器支付高昂的价格,您必须将其存储在某个地方,定期清洁、维护和加注昂贵的燃料,从您的角度来看,可能不会带来太大的好处。在这种特定情况下,好处微不足道;成本相对来说是压倒性的。处于这种假设位置的人甚至可能会想知道为什么有人想要汽车!
我提出这个类比是因为当它解决您没有的问题时,学习一项新技术可能非常困难,这与购买汽车可能无法解决您已经拥有的交通工具非常相似。它可能看起来像是一笔巨大的、不必要的支出。
那么,包管理器解决的问题更多的是规模和处理问题。只要:
最后一个是最重要的,因为如果您只在浏览器中运行程序,那么您将永远无法使用大量的工具(稍后将详细介绍)。
如果您确实选中了所有这些复选框,那么您可能永远不会超过这种方法。您的开发方法可能看起来像这样:
但即使在这种情况下,当您有多个 <script></script>
标签时,每个标签都链接到某个脚本或库的特定版本,那么唯一可以查看您正在使用哪些包以及它们是否是最新的方法是手动打开 HTML 并查看代码。
这本身并不是什么大问题,但随着项目规模和范围的扩大,这个问题呈指数级增长。您也许可以手动跟踪几个包,但是当我们谈论的是数百个——如果不是数千个——包时,您怎么可能做到这一点呢?即使您可以手动跟踪这些包,这仍然会带来人为错误的高风险。
HTML 的工作不是成为项目中所有使用的包的真相来源。 除了混合关注点外,在尝试合并团队成员之间不相关的作品时,它还可能导致冲突。
所有这些都很重要,但只是更大问题的一小部分。请了解,客户端 JavaScript 可能不是您永远想要包含在项目中的唯一类型的包,即使目前是这样——这就是事情真正开始崩溃的地方。
许多生产应用程序使用以下工具和包的某种组合,如果不是全部的话:
所有这些听起来都很棒——而且确实很棒!——但是请注意,您现在有多个依赖项,这些依赖项不仅不存在于您的 <script></script>
标签中,而且根本没有在您的项目中任何地方说明!任何人都无法知道——包括您未来的自己——使用了哪些工具或需要哪些工具才能使该项目运行。
即使您可以通过这种方式准确地知道项目需要什么,您仍然需要自己手动找到、下载和安装所有这些包。根据项目的情况,这很容易成为一天或更长时间的任务。
所有这一切都意味着您的工作流程现在看起来更像这样:
所有上述工具都非常方便,您仍然需要管理它们。 依赖项也是项目,它们发布更新以修复错误并引入新功能。因此,简单地在 HTML 中粘贴一个指向 CDN 上包的链接的 <script></script>
标签然后认为它已经完成是不现实的。您必须确保每件事不仅在您的机器上安装并正常工作,而且在每个协作者的机器上也正常工作。
包管理器存在是为了使项目的包——或依赖项——易于管理,方法是知道安装了什么、有什么可更新的以及一个包是否可能与另一个包冲突。包管理器的优点是它可以直接从命令行完成所有这些操作,并且工作量最少。
许多包管理器,尤其是 npm,还提供其他功能,这些功能可以打开更多可能性,从而使开发更高效。但是管理包是主要吸引力。
这部分与 npm 本身无关,但为了完整起见,我还应该提到 npm 不是唯一的 JavaScript 包管理器。例如,您可能会在代码示例中看到 Yarn 的引用。Yarn 和 npm 的工作方式非常相似,它们之间的大量互操作性是特意构建的。
有些人更喜欢一个包管理器而不是另一个包管理器。就我个人而言,我认为 npm 和 Yarn 之间的差异最初更为明显,但现在两者比以往任何时候都更加相似。
您可能会看到代码示例(包括 CSS-Tricks 文章中的一些示例),这些示例同时引用 yarn 和 npm。这是为了让读者知道这两种方法都可以,而不是需要同时使用它们。
Yarn 和 npm 的语法有时有所不同,但当只有一个存在时,通常可以轻松地将命令或项目从一个转换为另一个。从功能上讲,您使用哪一个很少(如果有的话)很重要——当然,除了所有在同一项目上一起工作的人都需要使用相同的包管理器以确保兼容性和一致性之外。
虽然 npm 和 Yarn 构成了开发人员使用的绝大多数包管理器,但还有一个名为 PnPm 的包管理器实际上是 npm,但性能更高、效率更高。权衡是 PnPm 在某些情况下需要更多技术知识,因此它更高级。
同样,我只是提出其他包管理器是为了说明 npm 不是唯一存在的包管理器——但它通常是标准的。
是什么使它成为包管理器中的“标准”?包括 Ruby 和 PHP 在内的其他语言多年来都有包管理器;在 npm 之前,JavaScript 实际上没有任何好的包管理器。
npm 最初是一个独立的开源项目,但在 2020 年被微软收购。它技术上包含两个部分:实际的包管理器本身;以及包注册表,这是一个不断增长的列表,其中包含近 200 万个可供安装的包。
您可以将 npm 视为您可能想要在前端或基于 Node 的项目中使用的任何东西的应用程序商店。找到您想要的东西并通过命令行将其安装到您的系统。当发布新版本时,您可能会更新该包,或者如果项目不再依赖它,则完全删除它。
您也可能会看到 npx 命令出现。npx 实际上是 npm 的一部分,但是通过在命令中使用 npx 而不是 npm,您可以执行包的代码,而不会 永久 安装它。NPX 只安装它需要的东西,运行它,然后将其删除。
例如,如果您想运行安装程序脚本,这将很有用。npx 不需要下载安装程序,然后运行它,它允许您直接运行安装程序,之后不会在您的机器上留下任何东西。它就像一个清理自己东西的客人。
另一个很酷的例子:如果您只想编译项目中的 Sass 文件一次,而不必费心完全安装 Sass,您可以运行 npx sass(以及必要的输入和输出参数)。在大多数情况下,这可能不切实际,但如果您只是需要在这里和那里进行快速的一次性编译,那么 npx 将是一种方便的方法,因为它意味着需要更新和维护的已安装包更少。
好的,这就是我们称某个东西为包管理器时所指的深入探讨。对于 npm 而言,它专门用于安装和管理 Node 包,这些工具有助于向项目添加功能、添加方便的开发人员便利性……或所有上述内容!
接下来,我们将迈出使用 npm 的第一步。为此,我们需要将其安装到我们的系统中。这是本 npm 完全指南中的下一步。
← 第 4 章 第 6 章 →
以上是软件包经理是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!