3秒でわかる
JavaScript をブラウザの外で動かす実行環境。Web サーバやコマンドラインツールを、フロントと同じ言語のまま書けるようになります。
30秒図解
もう少し詳しく
どういうものか
Node.js は、ブラウザに載っている JavaScript エンジン (V8) を取り出して、単体で動くようにした実行環境です。ブラウザには無いファイル操作やネットワークの待ち受けができるため、Web サーバ、ビルドツール、コマンドラインツールを JavaScript で書けます。特徴は、処理を待つ間に別の仕事を進めるイベントループの構造で、スレッドを増やさずに多数の接続をさばけます。
なぜ必要か
多くの Web アプリはフロントエンドが JavaScript です。サーバ側も同じ言語なら、型定義や入力チェックのコードを両側で共有でき、担当を分けずに済みます。
もうひとつは待ち時間の扱いです。従来型のサーバは 1 接続に 1 スレッドを割り当てるため、DB の応答を待つ間もスレッドが占有されます。Node.js は待ちに入った時点で次の処理へ移り、結果が返ったところで続きを実行します。API の中継やチャットのように、計算は軽いが待ちが多い処理と相性が良い設計です。
具体例
import { createServer } from "node:http";
const server = createServer(async (req, res) => {
const r = await fetch("https://api.example.com/items");
const data = await r.json();
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(data));
});
server.listen(3000);node --version
npm init -y
npm install express
node server.js似た用語との違い
| 名前 | 位置づけ |
|---|---|
| Node.js | JavaScript の実行環境 |
| npm | 付属するパッケージ管理ツール |
| Express | Node.js 上で動く Web フレームワーク |
| Deno、Bun | Node.js と同じ領域の別実装 |
Node.js 自体は言語ではありません。言語は JavaScript で、Node.js はそれを動かす側です。
つまずきやすいところ
モジュールの形式が 2 つあります。require で読み込む CommonJS と、import で読み込む ES Modules です。package.json の type を module にすると後者になり、混在させると読み込みでエラーになります。エラーメッセージに ERR_REQUIRE_ESM が出たらこの問題です。
もうひとつは、重い計算を書くと全体が止まることです。イベントループは 1 本しか無いため、10 秒かかる同期処理を走らせている間、他のリクエストは 1 件も処理されません。画像変換のような重い処理は、worker_threads に逃がすか別のサービスに切り出します。
非同期の書き方の取り違えもよく起きます。await を付け忘れると、値ではなく Promise がそのまま渡り、undefined として扱われて原因が分かりにくくなります。