关于 Node.js®

作为一个异步事件驱动的 JavaScript 运行时,Node.js 旨在构建可扩展的网络应用程序。在下面的“hello world”示例中,许多连接可以被并发处理。每次连接时,都会触发回调函数,但如果没有工作要做,Node.js 就会进入休眠状态。

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

const  = '127.0.0.1';
const  = 3000;

const  = ((, ) => {
  . = 200;
  .('Content-Type', 'text/plain');
  .('Hello World');
});

.(, , () => {
  .(`Server running at http://${}:${}/`);
});

这与当今更常见的并发模型(使用操作系统线程)形成对比。基于线程的网络相对低效且非常难以使用。此外,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 状态页面