Node.jsは、ブラウザの外でJavaScriptを動かすランタイムです。サーバー上でも、ターミナルでも、コマンドラインツールとしても動きます。プログラミング言語ではなく(言語はJavaScriptです)、フレームワークでもありません(ExpressはNode.jsの上で動くフレームワークです)。JavaScriptを実行するGoogleのV8エンジンに、イベントループと、ブラウザにはないファイル、ネットワーク、プロセス用の組み込みAPIを組み合わせたものです。
ファイルの中身、メジャーバージョン(v24)、そして window には undefined が表示されました。Node.jsには window を用意してくれるWebページがないからです。fs と process はNode.jsにしかありません。同じ行をブラウザのタブで実行すると、最初の行で例外が投げられます。
Node.jsはフレームワーク?それとも言語?
どちらでもありません。言語はJavaScriptで、Node.jsはそれを実行するプログラムです。JVMがJavaを、CPythonがPythonを実行するのと同じです。フレームワークはその上に乗ります。Express、Fastify、NestJSはNode.jsのプロジェクトにインストールするライブラリです。両者の詳しい比較はNode.js vs JavaScriptのページにあります。
中身を見ると、Node.jsは4つの部品でできています。
- V8:Chromeに入っているJavaScriptエンジンです。コードを機械語に変換して実行します。
- libuv:イベントループを提供するCのライブラリです。ディスク、ネットワーク、タイマーといった遅い処理を裏で行い、結果をコールバックに返します。
- Node自身のAPI:ファイル用の
fs、サーバー用のhttp、それにpath、process、crypto、eventsなど。インストール不要で、requireかimportですぐ使えます。 - npm:Node.jsに同梱されているパッケージマネージャーです。あらゆる言語の中で最大のパッケージレジストリを使えます。
Node.jsのファイルを実行する方法
公式サイトからNode.jsをインストールし(LTS版を選びます)、ターミナルで確認してからファイルを実行します。
node --version # prints v24.x.x or similar
node app.js # runs app.js and exits when it has nothing left to do
node # with no file: an interactive prompt (the REPL)
待っているものが何もなくなると、プログラムは自分で終了します。タイマーも、開いたサーバーも、途中のファイル読み込みもない状態です。スクリプトは終了するのにWebサーバーは動き続けるのはこのためです。
核となる考え方、ノンブロッキングI/O
Node.jsは遅い処理を待ちません。ファイルの読み込みやネットワークのリクエストを開始したら、そのまま次の行を実行し、結果が準備できた時点で関数を呼び出します。
readFile の後にある2つの console.log が先に実行され、ファイルの中身は最後に届きました。1つのNode.jsプロセスが何千もの接続をさばけるのはこの仕組みのおかげです。あるリクエストがデータベースを待っている間も、イベントループがほかのリクエストを進めます。
Node.jsとブラウザの違い
| ブラウザ | Node.js | |
|---|---|---|
| 動く場所 | Webページの中 | ターミナルやサーバー |
| あるもの | window、document、DOM、localStorage | fs、process、http、Buffer、require |
| グローバルオブジェクト | window(と globalThis) | global(と globalThis) |
| ディスク上のファイル | アクセスできない | ユーザーの権限の範囲で自由にアクセスできる |
setTimeout、console、fetch、URL | あり | あり |
Node.jsは何に使われるのか
- WebサーバーとAPI:RESTやGraphQLのバックエンド。Expressと組み合わせることが多いです。
- リアルタイムアプリ:チャット、ライブダッシュボード、WebSocketを使ったマルチプレイヤーゲームなど、多くの接続を同時に開いておくもの。
- コマンドラインツール:npm自体、Vite、ESLint、Prettier、TypeScriptのコンパイラはすべてNode.jsで動きます。
- スクリプトと自動化:ファイル名の一括変更、APIの呼び出し、データの移行。
いちばん多い使い方はHTTPサーバーで、最初の1つなら組み込みの http モジュールだけで作れます。
サーバーは GET /hello に対して、受け取ったパスを返しました。リクエストバーのパスを /anything に変えて送ってみてください。このサーバーはすべてのURLを1つの関数で処理しているので、返事もそれに合わせて変わります。
Node.jsを選ぶべきとき
処理の大半がI/O待ち(リクエスト、データベース、ファイル)で、フロントエンドとバックエンドを1つの言語で書きたいならNode.jsが向いています。動画のエンコードや大規模な数値計算のように、CPUを長時間使う処理にはあまり向きません。長い計算は1本しかないJavaScriptのスレッドをふさぎ、ほかのリクエストはすべてその終わりを待つことになるからです。
よくある質問
Node.jsはフロントエンドですか、バックエンドですか?
主にバックエンドです。Node.jsは訪問者のブラウザではなく、サーバーや自分のマシンで動きます。とはいえフロントエンドの開発者も毎日使っています。npm、Vite、ESLintといったツールがNode.jsのプログラムだからです。
Node.jsはいつ誰が作りましたか?
Ryan Dahlが2009年に公開しました。現在はOpenJS Foundationがメンテナンスしていて、半年ごとにメジャーバージョンが出て、偶数番号のバージョンが長期サポート(LTS)になります。
Node.jsの前にJavaScriptを知っている必要はありますか?
はい、少なくとも基本は必要です。変数、関数、オブジェクト、配列、そしてコールバックかPromiseです。Node.jsが足すのはAPIで新しい構文ではないので、言語について学んだことはそのまま使えます。
Node.jsはシングルスレッドですか?
あなたのJavaScriptは1つのスレッドで動きます。Node.jsは裏でファイルシステムの処理、DNS、一部の暗号処理のために小さなスレッドプールを使うので、遅いI/Oを待っている間もコードはブロックされません。