关于 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 二进制文件和访问官方文档,请仅使用以下域名
- nodejs.org
- nodejs.dev (重定向到 https://nodejs.ac.cn)
- iojs.org (重定向到 https://nodejs.ac.cn)
官方 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 状态页面。