跳转到内容

关于 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 包作用域 (scope):

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

使用来自 Node.js 团队的包可以确保你使用的是官方支持的 Node.js 组件。

官方 GitHub 组织

Node.js 及相关项目由以下官方 GitHub 组织维护:

官方交流渠道

Node.js 和 OpenJS 基金会通过各种官方和社区支持的渠道进行沟通。你可以在 参与贡献 (Get Involved) 页面上找到如何加入的详细信息。

报告网站问题与宕机

如果你在使用 Node.js 网站时遇到问题,请在 Node.js 网站仓库 中提交报告。如需了解中断的实时更新,请访问 Node.js 状态页面