命令行到底是什么?

Avatar of Josh Collinsworth
Josh Collinsworth on

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费额度!

现在我们已经知道 npm 代表什么 以及对它的作用以及它如何融入 Web 开发有一个非常普遍的了解,我们应该花一点时间看看命令行,因为它是我们与 npm 交互的方式。

指南章节

  1. 这个指南适合谁?
  2. “npm” 到底是什么意思?
  3. 命令行到底是什么? (您现在所处位置!)
  4. Node 到底是什么?
  5. 包管理器到底是什么?
  6. 如何安装 npm?
  7. 如何安装 npm 包?
  8. npm 命令到底是什么?
  9. 如何安装现有的 npm 项目?

命令行概述

命令行是我们可以在其中键入(可以预见)命令以直接由我们的计算机执行的地方。 它非常快,并且允许比大多数尝试为您处理命令行的应用程序更高的管理员权限。 需要在您的系统上安装某些东西,或者也许更新它? 命令行可以做到这一点,更不用说卸载它们了。 Heck,即使是服务器端语言也可以在命令行上运行,从而打开了广泛的工具和开发技术。

出于这些原因,命令行被认为是许多开发人员不可或缺的工具。 即使您不是开发人员,您也可能在某个时候遇到过命令行。 也许您在 macOS 中打开终端应用程序时访问过它。 也许您使用的是直接内置在代码编辑器中的命令行 - VS Code 和许多其他代码编辑器都带有集成终端。 也许您甚至遇到过像 iTermHyper 这样的第三方终端应用程序。

A collage of screenshots showing a terminal and the command line in different applications.

如果您使用过终端,那么您之前的大部分命令行使用可能只是键入(或粘贴)其他人给您的命令。 这很好;这通常是我们完成事情的方式。

但让我们花点时间来理解命令行到底是什么,以及为什么它被如此广泛地使用。

命令行与终端

“命令行”和“终端”在技术上是两个不同且独立的事物,但通常可以互换使用。 您可能还会听到命令行被称为“shell”或看到它缩写为“CLI”,它是“命令行界面”的缩写。

除了迂腐的区分之外,这些术语通常用于表示几乎相同的东西。 为了尽可能地保持简单,我将从现在开始互换使用它们。

打开命令行

无论您想称它为什么,您可能都知道命令行是一个看起来很吓人的窗口,也许它有一个黑色的背景和白色的(有时是绿色的)文本,您可以在其中键入您的计算机似乎理解的命令,即使您自己不理解。

Screenshot of a blank open terminal window with a dark background.
默认情况下,终端窗口可能看起来像这样,尽管它的外观可能有所不同。

根据您在命令行上工作的位置和方式,您可能注意到的第一件事之一是显示在您能够开始键入的第一行的不起眼的美元符号字符$。 您可能甚至在其他文章或文档中见过它。

This screenshot of Vue’s documentation for using npm includes the $ character in a command example.

在命令前加$字符是一种常见的约定,但这确实是一个令人困惑的约定。 这是因为没有必要键入它。 它实际上不是命令的一部分。 相反,$表示要在终端中运行的命令。

所以这是关于使用命令行的第一条规则:如果您发现自己键入或复制包含$字符的指令,请知道您无需将其包含在您的工作中; 终端已经覆盖了它。

## No need to copy the $
$ npm run build

您可能会看到其他东西而不是$开始一行,例如>_,甚至箭头。 同样,无论它是什么,几乎可以肯定的是,它不打算直接键入或粘贴到命令行中。 文档或其他教程是否应该包含一行的开始字符是一个完全不同的讨论(Chris 已经详细讨论过)。 无论哪种方式,它都可能令人困惑,因此我想确保这一点被提出来。

命令行做什么?

电影和电视剧经常将终端描绘成快速打字的黑客在黑暗、僻静的房间里使用的工具。 这部分是因为它对那些可能不知道真正的终端和黑客帝国中层层叠叠的字母的人来说是一种很好的娱乐方式。 (他们也不应该知道;我无法判断电视节目中所描绘的手术是否准确,并且完全满意将这种区别留给专业人士。)

但命令行并不完全是为了编写代码。 正如“命令行”这个名字所暗示的那样,它是为了编写命令。 我想您可以说所有编码在某种程度上都是命令,所以这无疑是一个模糊的界限。 但总的来说,终端中的代码与代码编辑器中的代码编写方式不同。 相反,您使用终端来用您希望它立即运行的命令来指挥您的计算机。

命令行的优势

您可能想知道为什么开发人员首先喜欢在命令行中工作。 您可能更喜欢一个不错的应用程序,或者图形用户界面(简称 GUI,有时发音为“gooey”),您可以在其中看到所有选项并直观地找到最佳选项。 这完全没问题,我们将在本章中讨论 GUI 并提供一些示例。

许多开发人员都有这种感觉,即使看起来不像那样。 但是,在命令行中工作带来了一些在视觉应用程序中并不总是容易复制的优势。

它赋予您类似神的系统权限

命令行是计算机科学人员所说的“特权环境”。 这听起来可能指的是耶鲁大学的一个兄弟会,但它只是意味着它是一个对您可以做的事情几乎没有限制的地方; 一个没有护栏的地方。

这就是命令行令人望而生畏的声誉的来源 - 您键入的任何命令,只要它有效,就会立即执行,而且通常是不可逆转的。 它能够与您的操作系统试图阻止您编辑的隐藏文件进行交互。 您有权力访问系统中的任何内容。 您甚至有权与远程服务器上的类似核心文件进行交互 - 我们都知道“能力越大,责任越大”这句话。

将命令行想象成一个懒惰的保安可能会有所帮助。 它假设你总是知道自己在做什么,并让你直接通过入口。 这确实有点冒险,是的,但它也让它非常强大,并且是某些任务和项目的完美选择。

它超级快

命令行相对于典型应用程序的另一个优势是:它很快

情况并非总是如此;命令行的速度往往被夸大了,很大程度上取决于所执行的任务。 但是,当它确实更快时,它通常可以快很多倍。 此外,命令行真正发挥作用的地方往往是代码项目最需要速度的地方,即下载和创建文件。

正如我们将在本指南的其他章节中看到的那样,npm 的一个关键部分是在您的机器上安装东西(通常是在您正在处理的项目的指定文件夹中)。这就是命令行非常适合与包管理器(我们也会了解它的含义)如 npm 一起工作的原因——它在计算机之间下载和传输文件——通常比使用浏览器快得多,快得多

命令行使 npm 能够以惊人的速度生成大量文件。能够运行单个命令以在一次操作中以高速安装、更新或删除这些文件,使终端成为许多工作的最快、最有效的工具。

它做到了其他语言做不到的事情

在终端中工作如此有利的另一个原因是,它为您提供了许多您可能希望在项目中使用的工具,无需任何额外的设置。

但让我们先退一步。

当您听到“服务器端语言”这个短语时,您可能会想到 PHP、Ruby 或 Java。也许它甚至包括更新的语言,比如 Rust 或 Go。您可能已经知道 Node 属于这个列表,但如果不是,请原谅我提前了一点。

无论如何,当大多数人想到这些服务器端语言时,他们往往会想到一个等待请求的 Web 服务器,然后响应这些请求。例如,WordPress 会一直处于闲置状态,直到它接收到一个触发 PHP 的请求。当您发送一条新推文时,这将是对 Twitter 服务器的一个请求,最终会命中 Rails 中的一个 Ruby 方法。

服务器端语言被认为比 Web 语言更强大。HTML、CSS 和 JavaScript 很棒,但它们不能操作文件系统、发送电子邮件、处理图像、发出系统命令、与操作系统交互或运行计划任务;以及应用程序或网站可能需要执行的许多其他事情。默认情况下,浏览器中的 JavaScript 甚至无法运行,除非有人正在浏览器中积极查看网页。

将服务器端语言视为更强大应用程序和软件背后的强大引擎是正常的。在许多情况下,这是准确的。但让我们花点时间认识到,为了运行代码,您的机器就是一台服务器。不是Web 服务器,尽管(它可以是,但这将很奇怪,而且可能不明智)。但它毕竟是服务器。

A photo of a laptop that is half-closed with a sheet of paper from a yellow legal pad that says This 9s a server (yes, really), do not close the lid!
您可能不会将您的机器视为服务器——也不应该这么认为。但它可以运行服务器端编程语言。

您可以安装并运行我们提到的任何服务器端语言,也许您之前已经做过(或者至少尝试过)。您可能已经安装了 PHP,以便您可以运行 WordPress(尽管现在有更好用的方法),或者您可能已经安装了 Ruby,以便您可以按照一些关于 Rails 的教程进行操作,仅举几个例子。

或者,也许没有。也许您以前从未安装过整个编程语言。无论哪种方式,请记住这些语言是在服务器上而不是在 Web 浏览器中运行的——为此,您的机器就是一台服务器。

除此之外,您可能希望与您的开发工作流程一起使用的许多工具——比如用于编译 CSS 的 Sass——实际上是在服务器端语言上运行的。因此,使用命令行可以让您置身于所有最强大工具随时可用的地方。

使用应用程序而不是命令行

我们在本文开头简要介绍了 GUI。值得注意的是,一些命令行任务有相应的 GUI,它们使使用命令行的工作更具视觉性和程序化。

很好的例子包括 GitHub Desktop(用于管理代码仓库)和 CodeKit(用于处理、捆绑和编译资产),尽管 VS Code 中的源代码管理选项卡也符合条件。即使这些 GUI 通常侧重于特定任务,它们也允许您通过友好的视觉用户界面完成工作,在一个实际的应用程序窗口中,该窗口位于终端窗口之外。

Screenshot of the CodeKit app after running ESlint showing how an app can visualize the command line.
CodeKit 可以执行一个命令来使用像 ESLint 这样的工具检查代码格式,而无需直接使用命令行。

GUI 作为一种选择非常棒,尽管多年来我已习惯使用命令行,但我仍然希望有更多 GUI 来执行命令行可以实现的功能——为了我自己的方便,并降低新开发人员的入门门槛。

然而,我相信没有更多此类应用程序的原因是速度。构建命令行界面 (CLI) 比构建一个完整的应用程序快得多,也容易得多,通常要快得多。因此,如果我们想要现在就得到美好的事物,命令行通常是我们需要去的地方。

接下来是什么

我们刚刚花了一些时间熟悉命令行。虽然命令行与 npm 不是特定的,但它是与 npm 一起工作的核心。它是我们告诉系统做什么的接口,它赋予我们在系统或服务器级别上以惊人的速度完成大量任务的强大功能。作为包管理器,npm 负责为 Web 项目安装、更新和删除文件(以及其他事情)。命令行是我们与 npm 交互以执行所有这些操作的方式。

接下来,我们将通过关注缩写中的第一个字母“n”来更深入地了解 npm 是什么:Node。它到底是什么,为什么它出现在名称中?我们将在下一步将我们的注意力转向这里。