跳转到内容

Node.js

一位学生问道:“古代的程序员只使用简单的机器,没有编程语言,但他们却编写出了漂亮的程序。为什么我们要使用复杂的机器和编程语言?”夫子回答道:“古代的建筑师只使用木棍和粘土,但他们却建造了漂亮的小屋。”

—— 元马大师,编程之书

chapter_picture_20.jpg

到目前为止,我们只在一个环境中使用了 JavaScript 语言:浏览器。本章和下一章将简要介绍 Node.js,这是一个允许您在浏览器之外应用 JavaScript 技能的程序。有了它,您可以构建任何东西,从小型命令行工具到支持动态网站的 HTTP 服务器。

这些章节旨在向您介绍 Node.js 使用的主要概念,并为您提供足够的信息来为其编写有用的程序。它们并不试图完整甚至彻底地介绍该平台。

虽然您可以直接在这些页面上运行前面章节中的代码,因为它要么是原始的 JavaScript,要么是为浏览器编写的,但本章中的代码示例是为 Node 编写的,通常不会在浏览器中运行。

如果您想继续并运行本章中的代码,则需要安装 Node.js 版本 18 或更高版本。为此,请访问 nodejs 并按照您的操作系统的安装说明进行操作。您还可以在那里找到有关 Node.js 的更多文档。

背景

在构建通过网络进行通信的系统时,管理输入和输出的方式(即从网络和硬盘读取和写入数据)会对系统响应用户或网络请求的速度产生很大影响。

在这样的程序中,异步编程通常很有用。它允许程序同时从多个设备发送和接收数据,而无需复杂的线程管理和同步。

Node 最初的设想是让异步编程变得简单方便。JavaScript 非常适合 Node 这样的系统。它是少数几种没有内置输入和输出方式的编程语言之一。因此,JavaScript 可以适应 Node 相当古怪的网络和文件系统编程方法,而不会产生两个不一致的接口。2009 年,当 Node 被设计出来时,人们已经在浏览器中进行基于回调的编程,因此该语言的社区已经习惯了异步编程风格。

node 命令行

当 Node.js 安装在系统上时,它会提供一个名为 的程序 node,用于运行 JavaScript 文件。假设你有一个文件 hello.js,其中包含以下代码:

let message = "Hello world";
console.log(message);

然后,您可以使用命令行 node 来执行该程序:

Terminal window
$ node hello.js
Hello world

Node 中的方法 console.log 与浏览器中的方法类似。它会打印出一段文本。但在 Node 中,文本将进入进程的标准输出流,而不是浏览器的 JavaScript 控制台。从命令行运行时 node,这意味着您会在终端中看到记录的值。

如果您在运行时 Node 没有提供文件,它会为您提供一个提示,您可以在其中键入 JavaScript 代码并立即查看结果。

Terminal window
$ node
> 1 + 1
2
> [-1, -2, -3].map(Math.abs)
[1, 2, 3]
> process.exit(0)
$

绑定与绑定 process 一样 console,在 Node 中全局可用。它提供了多种方法来检查和操作当前程序。该 exit 方法结束进程,并可以给出退出状态代码,该代码告诉启动的程序 node(在本例中为命令行 shell)程序是成功完成(代码零)还是遇到错误(任何其他代码)。

要查找脚本中提供的命令行参数,您可以阅读 process.argv,它是一个字符串数组。请注意,它还包含命令的名称 node 和脚本名称,因此实际参数从索引 2 开始。如果 showargv.js 包含语句,您可以像这样运行它:console.log(process.argv)

Terminal window
$ node showargv.js one --and two
["node", "/tmp/showargv.js", "one", "--and", "two"]

所有标准 JavaScript 全局绑定(例如 Array、Math 和 JSON)也存在于 Node 环境中。但浏览器相关的功能(例如 document 或 prompt)则不存在。

模块

除了我提到的绑定(例如 console 和 process),Node 还在全局范围内放置了一些其他绑定。如果要访问内置功能,则必须向模块系统请求。

Node 最初使用基于 require 函数的 CommonJS 模块系统,我们在第 10 章中看到过。当你加载 .js 文件时,它仍会默认使用该系统。