TL;DR
非同期のイベント駆動で動く JavaScript のランタイム。スケーラブルなネットワークアプリケーションを作るために設計されている。
なぜ必要か
公式サイトによると、一般的な並行処理のモデルは OS のスレッドを使うが、スレッドを使うネットワーク処理は比較的非効率で、扱いもとても難しい。Node.js にはロックがないので、プロセスがデッドロックする心配もない。
仕組み
Node.js はイベントループを、ライブラリではなくランタイムの構成要素として持つ。入力されたスクリプトを実行したあとに自動でイベントループに入り、実行するコールバックがなくなると抜ける。
Node.js の関数はほとんど I/O を直接行わないので、標準ライブラリの同期メソッドを使わない限りプロセスはブロックしない。HTTP は第一級の扱いで、ストリーミングと低遅延を考えて設計されている。
スレッドを持たない設計だが、child_process.fork() で子プロセスを作ったり、cluster モジュールでプロセス間でソケットを共有したりすれば、複数のコアを使える。
例
接続のたびにコールバックが呼ばれ、仕事がなければ Node.js は休む。
const { createServer } = require("node:http")
const server = createServer((req, res) => {
res.statusCode = 200
res.setHeader("Content-Type", "text/plain")
res.end("Hello World")
})
server.listen(3000, "127.0.0.1")