现在我们知道了npm代表什么,并且对它的作用和它如何融入Web开发有了一个超级概括的概念,我们应该花一点时间看看命令行,因为它是我们与npm互动的方式。
指南章节
- 这本指南到底是为谁准备的?
- npm "到底是什么意思?
- 命令行是什么鬼东西? (你在这里!)
- Node到底是什么?
- 软件包管理器是什么?
- 你是如何安装npm的?
- 如何安装npm包?
- npm命令到底是什么?
- 如何安装一个现有的npm项目?
关于命令行的概述
命令行是一个我们可以输入(可以预见的)命令,由我们的计算机直接执行的地方。它非常快,而且比大多数试图为你处理命令行的应用程序允许更大的管理权限。需要在你的系统上安装一些东西,或者也许要更新它?命令行可以做到这一点,更不用说卸载它们了。哎呀,甚至服务器端语言也可以在命令行上运行,开辟了一个广泛的工具和开发技术。
正是由于这些原因,命令行被认为是许多开发者不可缺少的工具。即使你不是一个开发者,你也有可能在某些时候遇到过命令行。也许你在MacOS中打开终端应用时访问过它。也许你已经使用了直接内置于你的代码编辑器中的命令行--VS Code和许多其他代码编辑器都有集成的终端。也许你甚至遇到过第三方终端应用,如iTerm或Hyper。

如果你使用了终端,那么你的命令行的使用有可能在这一点上仅仅是输入(或粘贴)别人给你的命令。这很好;这通常是我们完成事情的方式。
但是,让我们花点时间来了解一下命令行到底是什么*,*以及为什么它被如此广泛地使用。
命令行与终端
从技术上讲,"命令行 "和 "终端 "是两种不同的东西,但经常被交替使用。你也可能听到命令行被称为 "shell",或者看到它被缩写为 "CLI",是 "命令行界面 "的简称。
撇开这些迂腐的区别,这些术语经常被用来表示几乎相同的东西。因此,为了使事情尽可能简单,从这里开始,我将交替使用它们。
打开命令行
不管你怎么称呼它,你可能知道命令行就是那个看起来很可怕的窗口,也许有深色的背景和白色(有时是绿色)的文字,你在那里输入命令,你的计算机似乎能理解,即使你不理解。

默认情况下,终端窗口可能看起来像这样,尽管它的外观可能有所不同。
根据你在哪里以及如何在命令行上工作,你可能首先注意到的是一个不显眼的美元符号,$ ,它显示在你能够开始输入的第一行。你甚至可能在其他文章或文档中看到它。

用$ 字符作为命令的前缀是常见的惯例,但这肯定是一个令人困惑的惯例。这是因为没有必要输入它。从字面上看,它不是命令的一部分。相反,$ 标志着一个要在终端运行的命令。
因此,这是使用命令行的第一条规则:如果你发现自己输入或复制的指令包括$ 字符,要知道没有必要在你的工作中包括它;终端已经覆盖了它。
## No need to copy the $
$ npm run build
你可能会看到其他东西代替$ 开始一行,如> 、_ ,甚至是一个箭头。同样,不管它是什么,几乎可以肯定它不应该被直接输入或粘贴到命令行中。文档或其他教程是否应该包括一行的起始字符是一个完全不同的话题(克里斯已经详细讨论过)。不管怎么说,这都有可能造成混乱,所以我想确保这一点被叫出来。
命令行是做什么的?
电影和电视节目经常把终端描绘成快速打字的黑客在一个黑暗、隐蔽的房间里使用的东西。这部分只是因为这对那些可能不会从*《黑客帝国》*中层层叠叠的字母中看出真正的终端的人来说是一种很好的娱乐。(他们也不应该这样做;我无法判断电视剧中的手术是否准确,我完全满足于把这种区分留给专业人士。)
但命令行并不完全是用来写代码的。正如 "命令行 "这个名字所暗示的,它是用来写命令的。我想你可以说,所有的编码在某种程度上都是命令,所以这确实是一个有点模糊的界限。但一般来说,终端中的代码与代码编辑器中的写法不同。相反,你用终端来指挥你的计算机,你希望它立即运行的命令。
命令行的优势
你可能想知道为什么开发人员首先喜欢在命令行中工作。你可能更喜欢一个漂亮的应用程序,或者图形用户界面(简称GUI,有时读作 "gooey"),在那里你可以看到你的所有选项,并直观地找到最佳选项。这完全没问题,我们将在本章中谈一谈GUI,并提供一些例子。
许多开发者都有这种感觉,即使看起来并不像。但是在命令行中工作会带来一些优势,而这些优势在可视化应用程序中并不容易复制。
它赋予你神一样的系统权限
命令行是计算机科学界人士所说的 "特权环境"。这听起来像是指耶鲁大学的兄弟会,但它只是意味着它是一个对你被允许做的事情限制很少的地方;一个没有护栏的地方。
这就是命令行令人生畏的声誉的来源--无论你输入什么命令,只要它是有效的,就会立即执行,而且往往是不可逆转的。它能够与你的操作系统试图阻止你编辑的隐藏文件互动。你有能力访问系统中的任何东西。你甚至有能力与远程服务器上的类似核心文件进行互动--我们都知道有句格言说,巨大的责任感伴随着这种权力。
把命令行想象成一个懒惰的保安可能会有帮助。它假定你总是知道你在做什么,并让你直接通过入口。这使得它有点风险,是的,但它也使得它非常强大,是某些任务和项目的完美选择。
它是超级快的
与典型的应用程序相比,命令行的另一个优势是:它很快速。
这并不总是这样;命令行的速度往往被夸大了,而且主要取决于相关的任务。但是,当它快的时候,往往可以快很多倍。此外,命令行真正闪亮的地方往往正是代码项目最需要速度的地方,即下载和创建文件。
正如我们在本指南的其他章节中所看到的,npm所做的一个关键部分是在你的机器上安装东西(通常是在为你正在工作的项目所指定的文件夹中)。这就是命令行对于像npm这样的包管理器(我们也会说到这是什么意思)的工作的好处--它在计算机之间下载和传输文件--通常比使用浏览器来做要快得多。
命令行使npm能够以难以置信的速度生成大量的文件。能够高速运行一条命令,将这些文件一起安装、更新或删除,使终端成为许多工作的最快、最有效的工具。
它能做其他语言不能做的事
在终端中工作的另一个原因是,它是你在项目中可能想要使用的许多工具已经可以使用的地方,而不需要任何额外的设置。
但让我们回过头来看一下。
当你听到 "服务器端语言 "这个短语时,你可能会想到PHP、Ruby或Java。也许它甚至是这个领域的新条目,如Rust或Go。你甚至可能已经知道Node属于这个名单,但如果不知道,请原谅我跳到前面去了。
无论如何,当大多数人想到像这样的服务器端语言时,他们往往会想到一个网络服务器在等待请求,然后对它们进行响应。例如,WordPress,在收到启动PHP的请求之前,一直处于闲置状态。当你发送一条新的推文时,那是Twitter服务器上的一个请求,最终会碰到Rails中的一个Ruby方法。
可以说,服务器端语言被认为比网络语言更强大。HTML、CSS和JavaScript非常棒,但它们不能与文件系统一起工作,不能发送电子邮件,不能处理图像,不能发布系统命令,不能与操作系统互动,也不能运行计划任务;还有许多其他应用程序或网站可能需要做的事情。默认情况下,除非有人在浏览器中主动查看网页,否则浏览器中的JavaScript甚至不能运行。
人们通常认为服务器端语言是更强大的应用程序和软件背后的强大引擎。而且,在许多情况下,这是很准确的。但是,让我们花点时间认识到,为了运行代码,你的机器就是一个服务器。虽然不是一个网络服务器(它可以是一个,但那将是奇怪的,可能是不明智的)。但是,还是一个服务器。

你可能不认为你的机器是一个服务器,你也不应该这样认为。但是它可以运行服务器端的编程语言。
你可以安装和运行我们提到的任何一种服务器端语言,也许你已经在某个时候这样做了(或者至少是尝试过)。你可能已经安装了PHP,所以你可以运行WordPress(尽管现在有更好的方法来做),或者你可能已经安装了Ruby,所以你可以跟随一些关于Rails的教程,只是作为例子。
或者,也许不是。也许你以前从未安装过一门该死的编程语言。无论怎样,你只需知道这些语言是在服务器上运行的,而不是在网络浏览器上,为此,你的机器就是一台服务器。
除此之外,许多你可能想在你的开发工作流程中使用的工具--比如用于编译CSS的Sass--实际上是在服务器端语言上运行。因此,使用命令行使你处于所有最强大的工具都可以随时使用的地方。
使用应用程序而不是命令行
我们在本文前面简要地谈到了图形用户界面。值得注意的是,一些命令行任务有相应的GUI,使命令行的工作更加直观和程式化。
很好的例子包括GitHub Desktop(用于管理代码库)和CodeKit(用于处理、捆绑和编译资产),尽管VS Code中的源代码控制标签也符合条件。尽管像这样的GUI通常专注于特定的职责,但它们让你在终端窗口之外的实际应用窗口中,通过一个漂亮的视觉用户界面来完成事情。

CodeKit可以执行一个命令,用ESLint等工具检查代码格式,而不需要直接使用命令行。
GUI作为一种选择是很可爱的,尽管多年来我已经很适应在命令行上工作,但我仍然希望有更多的GUI来做命令行所能做的事情--既是为了我自己的方便,也是为了降低新开发者的门槛。
然而,我相信之所以没有更多这样的应用程序,是因为速度问题。构建一个命令行界面(CLI)比构建一个完整的应用程序要快得多,也容易得多,通常是几个数量级。因此,如果我们今天想要好东西,命令行往往是我们需要去的地方。