Node.js
JavaScriptをブラウザの外(サーバー・CLI)で動かす実行環境
分野「言語・実行環境」:プログラムを書くための「言葉」と、それを動かす仕組み。 分野の役割とつながりは分野の解説へ。
別名:Node、node
できること
- 常時起動のプロセスを保持する :WebSocket や常駐ワーカーを動かしたい
- コマンドラインツールを作る :ターミナルから使う道具を作りたい
- HTTP API を公開する :自分のデータや処理を他から呼ばせたい
Node.js ができないこと
- 1つのプロセスで CPU 負荷の高い処理を並列に捌くこと(JavaScript は1スレッドで動く。worker_threads か複数プロセスが必要)
- ブラウザの中で動くこと(ブラウザは別の実行環境。ファイル操作などの Node.js API はブラウザにない)
- Node.js 固有の API をそのままエッジ環境で使うこと(Cloudflare Workers 等は互換レイヤ経由で一部のみ)
- 奇数バージョンを長く使い続けること(Node.js 26 までの奇数版は6か月で非対応になる)
制約
先頭の行が、このツールで最も先に当たる制約。値はすべて出典の一次情報で確認したもの。
| 項目 | 値 | 影響 | 出典 | 検証日 |
|---|---|---|---|---|
| JavaScript の実行スレッド (主要制約) | JavaScript のコードは1本のイベントループで実行され、ファイル I/O などの重い処理はワーカープールに委ねられる | イベントループを長時間止める処理(重い計算、同期的なファイル読み込み)があると、他の全リクエストが待たされる。悪意ある入力で止められれば DoS になる | nodejs.org | |
| バージョンのサポート期間 | メジャー版は6か月 Current。LTS 版は合計30か月(Active LTS + Maintenance)。26 までは偶数版のみ LTS、27 以降は年1回リリースで全メジャー版が LTS になる | 本番では LTS 版だけを使う。2026-09 時点の LTS は 24 と 22。30か月ごとにメジャー更新が必要で、依存パッケージの追従を確認する | nodejs.org | |
| ライセンス | MIT License | 商用利用・改変・再配布に制限はない | github.com |
典型的な落とし穴
- 同期 API(readFileSync 等)をリクエスト処理の中で使い、同時アクセス時に全体が遅くなる
- グローバルにインストールした Node.js のバージョンがプロジェクトごとに違い、「自分の環境では動く」が起きる。バージョン管理ツール(nvm、fnm、Volta)を使う
- 例外を捕まえずにプロセスごと落ちる。常駐させるならプロセス管理(再起動)を用意する
コスト
- 課金モデル
- 無料
- 跳ねる条件
MIT ライセンスで無償。費用は動かすサーバー側で発生する
- 出典
- github.com 検証
代替手段と差分
| 代替 | 何が違うか |
|---|---|
| Cloudflare Workers | Workers は V8 の isolate で動くエッジ環境で、起動が速く待機コストがない代わりに、Node.js API の一部しか使えず CPU 時間に上限がある。常駐サーバーや Node.js 前提のライブラリを使うなら Node.js |
| Python | Python は別言語で、データ処理と AI のライブラリが厚い。Node.js は画面と同じ言語(JavaScript / TypeScript)でサーバーも書ける点が利点 |
選定判断
TypeScript / JavaScript でサーバー、CLI、ビルドツールを動かすときの標準の実行環境。画面と同じ言語で裏側も書きたい場合の第一候補。CPU 負荷の高い処理を1プロセスで並列に捌く必要がある場合は Go などのコンパイル言語へ
ブラウザの中でしか動かなかった JavaScript を、サーバーやコマンドラインで動かせるようにした実行環境である。npm という巨大なパッケージの集まりと一体で、フロントエンドのビルドツール(Astro、Next.js の開発サーバー)もこの上で動いている。
最初に当たる制約は「1スレッド」である。I/O 待ちが多いサーバーでは効率がよいが、重い計算を1リクエストの中でやると全体が止まる。設計の前提として覚えておく。