Node是什么?(附安装方法)

227 阅读10分钟

以下是你需要知道的关于Node.js(或简称Node)以及它与npm的关系的内容。

  • Node是JavaScript,但作为一种服务器端语言。
  • 这是因为Chromium的JavaScript引擎V8的存在,它可以在浏览器的范围之外独立运行。
  • Node和基于浏览器的JavaScript可以有很大不同,也有不同的能力,尽管两者的核心都是JavaScript。
  • 你不需要知道Node来使用npm。

正如你现在可能知道的那样,npm代表Node Package Manager(即使npm官方网站在每次加载页面时在其标题中显示有趣的替代名称,如 "Ninja Pumpkin Mutants")。

要马上理解的关键事情是这样的。"Node "和 "软件包管理器 "是组合成npm的两个大的、不同的部分。

我们将介绍什么是软件包管理器,以及为什么你会考虑使用它,当我们进入本npm指南的下一章时。不过现在,让我们专注于理解什么是Node,因为它是理解现代网络开发的一个关键部分。

指南章节

  1. 本指南到底是为谁准备的?
  2. npm "到底是什么意思?
  3. 命令行是什么?
  4. Node到底是什么? (你在这里!)
  5. 软件包管理器到底是什么?
  6. 你是如何安装npm的?
  7. 如何安装npm包?
  8. npm命令到底是什么?
  9. 如何安装一个现有的npm项目?

Node是JavaScript,但不包括所有的浏览器

你可能知道JavaScript主要是作为一种在浏览器中运行的语言,类似于HTML和CSS。是的,这些语言中的每一种都有抽象和超集(比如HTML的HAML、CSS的Sass和JavaScript的TypeScript,都是例子),还有编译器和转码器以及各种将它们转化为这种或那种形状的东西。但最终,这些工具生成的是正确语法的香草(即纯)代码,就像从未使用过抽象概念一样,在浏览器中运行,而且只在浏览器中运行。

这是我花了最长时间才理解的事情,而且,说实话,这可能是比整个npm的事情还要大的遗漏。JavaScript不再需要浏览器就能运行了。所以,你有时会看到我在区分Node JavaScript和 "基于浏览器 "的JavaScript时提到它。

服务器端与客户端语言

在这一点上,我觉得有必要花点时间来探讨一下客户端语言(HTML、CSS、JavaScript)和服务器端语言(基本上是所有其他的语言)之间的区别。我不会假设你对服务器端语言(如PHP、Ruby或Python)有任何经验,但如果服务器端语言的概念对你来说是完全陌生的,可能值得阅读一下它们是什么。(简而言之:它们是纯粹在服务器上而不是在浏览器上运行的代码语言,通常具有更广泛和更强大的功能)。

这与此有关,因为几年前,大约是2009年,有一些非常聪明的人非常喜欢JavaScript。特别是,他们喜欢JavaScript的速度(尤其是与当时主流的服务器端语言相比,最明显的是PHP和Ruby),而且他们希望JavaScript无处不在,而不仅仅是在浏览器中。

Ryan Dahl是其中最突出的人物,他被认为是Node的发明者(以及最近的Deno,它是Node的变形词)。这是一个有趣的事情,但在其他方面与本主题并不严格相关。

Node如何工作

不过,与此相关的是,Node本质上是一种在浏览器之外运行服务器端语言--JavaScript。

这怎么可能呢?在引擎内部,每个浏览器都有自己独立的JavaScript引擎。这是浏览器中实际运行JavaScript的部分。是的,这显然是浏览器的一个独立部分,而不是做HTML和CSS的同一个位的一部分--当你考虑到我们在文档和JavaScript之间有字面的API时,我想这是有道理的。糟糕的是,当你把处理JavaScript的部门看作是HTML部门的一个临时办公室时,甚至DOM的概念也更有意义。

基于Chromium的浏览器中的JavaScript引擎被称为V8,大概是以一种特定的汽车引擎(而不是主要由番茄汁制成的 "蔬菜饮料")命名。V8是迄今为止最流行的JavaScript引擎。由于ECMAScript在过去15年的标准化工作,就浏览器而言,JavaScript引擎之间已经没有什么大的区别。在Chrome中使用的引擎很像在Firefox中运行的引擎,而Firefox很像Safari,以此类推。V8如今的流行与其说是与它的区别有关,不如说是与Chrome的自我维持的普遍性有关。

(题外话:Firefox的JavaScript引擎被称为SpiderMonkey。这并不特别相关,但它进一步证明火狐是最酷的)。

这有什么关系呢?嗯,事实证明,你可以把JavaScript引擎从浏览器中取出来,经过一些修改,在自己的系统上运行--就像你决定把汽车的音响拉出来,修补一下,然后把它变成你家里的音响系统。V8(以及汽车音响)可以在任何环境下作为一个独立的单元完美地运作。

换句话说。V8让我们有可能在任何地方运行JavaScript。这就是为什么我们有 "Node "JavaScript和 "基于浏览器 "的JavaScript。

Node几乎是(但不完全是)JavaScript

简而言之。JavaScript现在是一种服务器端语言它被称为Node,它可能意味着你甚至不需要学习其他服务器端语言的任何知识。我们是前端开发者,我们现在有了超级大的权力。

不过,说了这么多,Node和你习惯于在浏览器中运行的JavaScript既有相似之处,也有很大的不同。

在这里,我们有可能走得太远:虽然两者的核心都是JavaScript,虽然语言和语法是相同的,但浏览器中的许多JavaScript主干(如windowdocument ,甚至经常被认为是alert )并不存在于纯粹的服务器端Node环境中。当然,当语言只是独立运行,而不是在浏览器中运行时,没有窗口的。新的Node JavaScript开发者经常惊讶地发现,即使是fetch ,实际上也是一个浏览器API,而不是 "纯 "JavaScript。

不过,不要害怕。console.log 仍然是你最好的朋友,Node JavaScript有许多新的、针对环境的特性,与浏览器的JavaScript实现不同,比如process 对象,它包含了当前正在运行的任何进程的所有细节。

多年来,Node及其生态系统往往出于需要,朝着与基于浏览器的JavaScript非常不同的方向发展。(作为一个明显的例子:两者之间的导入语法多年来一直是不同的,直到现在才开始重新合并在一起)。我们将在最后一章中再谈一谈这个问题)。

在获得新功能方面,Node长期以来一直拥有比浏览器快得多的特权,而且也有自己的一系列问题需要处理。它开始像Ruby和PHP多年来所做的那样为服务器端应用程序提供动力,甚至在浏览器仍在尝试凝聚标准的时候。这导致了Node JavaScript和基于浏览器的JavaScript变得更像表兄弟而不是克隆人。

我认为这是一个公平的比喻来解释这两个JavaScript表兄弟之间的差异:考虑两个类似的乐器,比如说立式贝斯和现代电贝斯吉他。两种乐器的调性相同,弹奏的音符也相同;如果你了解其中一种,在很多方面你也会了解另一种。但是,在你学会了另一种乐器之后,你会发现学习一种乐器要容易得多,而弹奏新的乐器将与你习惯的东西非常不同。

相同,但不同(图片:维基共享资源Unplash)

同样,虽然一个开发者可能写一种类型的JavaScript,第二个开发者用另一种类型的JavaScript写,但他们的工作不可能看起来一样。

Node是JavaScript,具有前面提到的其他服务器端语言的能力--比如从文件系统中读写、访问系统级API、电子邮件、监听和响应请求的能力、计划任务......这个清单还在继续。

我在这里就不多说了,但你要知道,虽然两者最后都是JavaScript,但它们在不同的环境中运行,都能做一些对方做不到的事情。即使你以前写过基于浏览器的JavaScript,Node对你来说仍然可能在基础语法之外感到有点陌生,而且通常会以非常不同的方式使用。

本地运行Node

与服务器端语言的一般情况一样,在使用Node之前,你确实需要安装它。

Node通常与npm一起安装,合二为一,因为软件包管理器部分需要Node,而Node部分在软件包管理器中更有用。(你可以说它们是一揽子交易。不,我不会为这个笑话道歉。我毕竟是个父亲)。

我想在这一点上强调,你不需要对Node有任何了解就可以使用npm。因此,尽管我将在这里介绍一些Node的例子,但请把这整个部分看作是很好的知识,但对这一目的来说是不必要的。我觉得对Node的工作原理有一个稍好的了解还是很有用的,只是为了描绘一个更完整的画面。

我们将在本指南的下一章中介绍如何安装Node和npm。所以,如果你还没有安装,你可以只看一下这一部分,或者等你准备好了再来这里。无论怎样,这对跟随本npm指南的学习都不是至关重要的。

如果你想尝试一下,你可以创建一个新的test.js 文件,并在其中放入一些通用的JavaScript。像下面这样的代码,将一些内容记录到控制台,应该可以起到作用。

console.log('Look, ma, Node hands!')

const oneThroughFive = [1, 2, 3, 4, 5]

oneThroughFive.forEach(number => {
  console.log(number)
})

假设你保存了这段代码,然后在终端窗口中打开命令行,导航到该文件所在的位置(使用cd ,或 "改变目录"),并运行node test.js ,得到以下输出。

Look, ma, Node hands!
1
2
3
4
5

也可以单独输入node (后面没有文件名)来打开一个交互式终端,在那里你可以运行任意的Node JavaScript。如果你曾经在浏览器的DevTools中打开控制台来输入一些代码,这正是它的作用,只是在命令行中用Node代替。

如果你愿意,可以尝试一下,前提是你已经安装了Node。但同样,这只是为了说明问题,并不是使用npm的必要条件。

A screenshot of an open terminal window showing Node version 17.0.1 running and the output from the previous example under it.

接下来是什么

我们在本章中所涉及的一切都很有趣,希望能帮助你(无论多么简单)了解Node的工作方式。记住,虽然我们没有涵盖任何具体的例子,但Node能够做任何服务器端语言能做的事情。希望你不难想象,在系统层面甚至在远程服务器上运行一些JavaScript来做几乎任何你能想到的事情,是非常有吸引力和优势的。

Node的概念是作为一种在浏览器之外运行JavaScript的方式开始的。因此,我们有基于Node的脚本包,用来帮助我们进行前端开发。那么,我们如何安装这些包,并确保它们不仅被更新,而且可以被卸载?这就包含在npm缩写的最后两个字母中:包管理器

换句话说,npm是一个管理用Node JavaScript编写的软件包的工具。究竟什么是包管理器,npm是如何成为一个包管理器的?这将是我们的npm指南的下一个内容。