关于 Node.js®

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

const { function createServer<Request extends typeof IncomingMessage = typeof IncomingMessage, Response extends typeof ServerResponse = typeof ServerResponse>(requestListener?: RequestListener<Request, Response>): Server<Request, Response> (+1 overload)createServer } = 
var require: NodeJS.Require
(id: string) => any
require
('node:http');
const const hostname: "127.0.0.1"hostname = '127.0.0.1'; const const port: 3000port = 3000; const const server: Server<typeof IncomingMessage, typeof ServerResponse>server = createServer<typeof IncomingMessage, typeof ServerResponse>(requestListener?: RequestListener<typeof IncomingMessage, typeof ServerResponse> | undefined): Server<...> (+1 overload)createServer((req: IncomingMessagereq,
res: ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
res
) => {
res: ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
res
.ServerResponse<Request extends IncomingMessage = IncomingMessage>.statusCode: numberstatusCode = 200;
res: ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
res
.
OutgoingMessage<IncomingMessage>.setHeader(name: string, value: number | string | readonly string[]): ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
setHeader
('Content-Type', 'text/plain');
res: ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
res
.
Stream.Writable.end(chunk: any, cb?: () => void): ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
} (+2 overloads)
end
('Hello World');
}); const server: Server<typeof IncomingMessage, typeof ServerResponse>server.Server.listen(port?: number, hostname?: string, listeningListener?: () => void): Server<typeof IncomingMessage, typeof ServerResponse> (+8 overloads)listen(const port: 3000port, const hostname: "127.0.0.1"hostname, () => { var console: Consoleconsole.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)log(`Server running at http://${const hostname: "127.0.0.1"hostname}:${const port: 3000port}/`); });

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

如果对其中一些语言不熟悉,可以阅读关于 Blocking vs. Non-Blocking 的完整文章。


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 模块,它允许您在进程之间共享套接字,从而实现对核心的负载均衡。

阅读时间
3分钟
贡献
编辑此页