关于 Node.js®

作为一个异步事件驱动的 JavaScript 运行时,Node.js 被设计用于构建可伸缩的网络应用。 在下面的“hello world”示例中,可以并发处理多个连接。 在每个连接上,都会触发回调,但是如果没有要完成的工作,Node.js 将会休眠。

const { createServer } = require('node:http');

const hostname = '127.0.0.1';
const port = 3000;

const server = createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

这与当今更常见的并发模型形成对比,在当今更常见的并发模型中,采用了操作系统线程。 基于线程的网络效率相对较低并且非常难以使用。 此外,Node.js 的用户无需担心进程的死锁,因为没有锁。 Node.js 中几乎没有函数直接执行 I/O,因此除了使用 Node.js 标准库的同步方法执行 I/O 之外,进程永远不会阻塞。 因为没有任何阻塞,所以在 Node.js 中开发可伸缩的系统非常合理。

如果对某些语言不熟悉,请阅读一篇关于阻塞与非阻塞的完整文章。


Node.js 在设计上类似于 Ruby 的 Event Machine 和 Python 的 Twisted 等系统,并受到它们的启发。 Node.js 将事件模型更进一步。 它将事件循环表示为运行时构造,而不是作为库。 在其他系统中,始终有一个阻塞调用来启动事件循环。 通常,通过脚本开始时的回调来定义行为,并在结束时通过像 EventMachine::run() 这样的阻塞调用来启动服务器。 在 Node.js 中,没有这样的启动事件循环调用。 Node.js 仅在执行输入脚本后进入事件循环。 当没有更多要执行的回调时,Node.js 退出事件循环。 此行为类似于浏览器 JavaScript - 事件循环对用户隐藏。

HTTP 是 Node.js 中的一等公民,设计时考虑了流式传输和低延迟。 这使得 Node.js 非常适合作为 Web 库或框架的基础。

Node.js 的设计中没有线程并不意味着你无法利用环境中的多个内核。 子进程可以使用我们的 child_process.fork() API 生成,并且被设计为易于通信。 构建在同一接口之上的是 cluster 模块,它允许你在进程之间共享套接字,以实现跨内核的负载平衡。

Node.js 官方资源

为确保在使用 Node.js 时的真实性和安全性,请始终使用官方来源。 避免信任来自非官方来源的电子邮件、二进制文件或下载。

Node.js 官方域名

要下载 Node.js 二进制文件和访问官方文档,请仅使用以下域名

官方 npm 包

Node.js 团队维护以下官方 npm 包范围

此外,Node.js 团队维护由 nodejs-foundation npm 帐户发布的包,尽管其他与 Node.js 相关的包(例如 undici)也可能由与项目密切相关的贡献者维护。

使用来自 Node.js 团队的包可保证你正在使用官方支持的 Node.js 组件。

官方 GitHub 组织

Node.js 和相关项目在以下官方 GitHub 组织下维护

官方沟通渠道

Node.js 和 OpenJS 基金会通过各种官方和社区支持的渠道进行沟通。 你可以在参与其中页面上找到有关如何参与的详细信息。

报告网站问题和停机时间

如果你遇到 Node.js 网站的问题,请在 Node.js 网站仓库中报告它们。 有关中断的实时更新,请访问 Node.js 状态页面