Node.jsとは何か — ブラウザのJavaScriptとの違いと動く仕組み
この章の目次開く
Node.jsは、JavaScriptをブラウザの外で動かすための実行環境です。JavaScriptそのものは言語ですが、Node.jsはそのJavaScriptをサーバー、CLI、バッチ処理、開発ツールなどで動かすための土台です。
フロントエンドでJavaScriptを学んだ人がNode.jsで最初につまずくのは、「同じJavaScriptなのに、使えるものが違う」ことです。ブラウザには document や window がありますが、Node.jsにはありません。その代わり、Node.jsにはファイルを読む fs、パスを扱う path、HTTPサーバーを作る http、プロセス情報を扱う process があります。
学習者JavaScriptはブラウザで動くものだと思っていました。Node.jsになると、何が同じで何が変わるんですか?
先生文法は同じ。でも「周りに用意されているAPI」が違うんだ。ブラウザは画面操作が得意、Node.jsはファイル・通信・プロセス操作が得意、と考えると整理しやすいよ。
Node.jsでできること
Node.jsは、Web開発のいろいろな場所で使われています。
| 用途 | 例 |
|---|---|
| Webサーバー | APIサーバー、SSR、管理画面のバックエンド |
| 開発ツール | Vite、Next.js、ESLint、Prettier、TypeScriptコンパイラ |
| CLIツール | コマンドラインで動く変換・生成・自動化ツール |
| バッチ処理 | 定期実行、ログ処理、データ変換 |
| リアルタイム通信 | WebSocket、チャット、通知 |
実務では、Node.jsを「本番サーバーとして直接書く」場面だけでなく、Next.jsやViteのような開発環境の裏側として毎日使っています。npm install や npm run dev が動くのも、Node.jsがあるからです。
ブラウザのJavaScriptとの違い
JavaScriptの基本文法、配列、オブジェクト、関数、Promise、async/await などは、ブラウザでもNode.jsでも同じです。詳しい文法はJavaScript入門の各章で扱っています。
違うのは、実行環境が提供するAPIです。
| 観点 | ブラウザ | Node.js |
|---|---|---|
| 主な目的 | 画面を操作する | サーバー・ファイル・プロセスを扱う |
| 代表的なグローバル | window, document, location | globalThis, process, Buffer |
| ファイル操作 | 原則できない | fs でできる |
| HTTP | fetch() でリクエストする側が中心 | サーバーもクライアントも作れる |
| モジュール | ESM中心 | ESMとCommonJSが共存 |
| 実行場所 | ユーザーのブラウザ | サーバー、ローカルPC、CI環境 |
// ブラウザでは使えるが、Node.jsでは基本的に存在しない
console.log(document.title);// Node.jsでは使えるが、ブラウザでは基本的に存在しない
console.log(process.version);Node.jsの動く仕組み
Node.jsの中では、大きく分けて次の要素が協力しています。
| 要素 | 役割 |
|---|---|
| V8 | JavaScriptを実行するエンジン。Chromeにも使われている |
| libuv | 非同期I/Oやイベントループを支えるライブラリ |
| Node.js標準ライブラリ | fs, path, http, stream, buffer などのAPI群 |
| npmエコシステム | 外部パッケージを配布・利用する仕組み |
ブラウザでDOMを操作する代わりに、Node.jsではOSに近い処理を扱います。ファイルを読む、ポートを開いてHTTPリクエストを待つ、標準出力へログを出す、といった処理です。
なぜNode.jsは非同期I/Oが得意なのか
Node.jsは「シングルスレッドなのに速い」と説明されることがあります。ただし、これは「CPUを使う重い計算が何でも速い」という意味ではありません。
Node.jsが得意なのは、ファイル読み込み、データベースアクセス、HTTP通信のような待ち時間の多いI/O処理です。待っている間にプロセス全体を止めず、別のリクエストや処理を進められます。
import { readFile } from 'node:fs/promises';
const text = await readFile('message.txt', 'utf8');
console.log(text);このコードは一見「読み込みが終わるまで待っている」ように見えます。しかしNode.js全体が完全に停止しているわけではありません。ファイル読み込みの完了を待つ間、イベントループは他の処理を進められます。非同期処理の文法自体は非同期処理の基本でも扱っています。
Node.jsはCPUを使い切る計算より、I/O待ちが多いサーバー処理で力を発揮します。nodeコマンドでJavaScriptを実行する
Node.jsをインストールすると、node コマンドが使えるようになります。
node app.jsapp.js に次のように書くと、ターミナルに出力されます。
console.log('Hello from Node.js');
console.log(process.version);process は、現在動いているNode.jsプロセスの情報を持つグローバルオブジェクトです。ここでは process.version でNode.jsのバージョンを確認しています。
| プロパティ | 説明 | 値の例 |
|---|---|---|
process.version | 実行中のNode.jsのバージョン | 'v22.13.1' |
process.platform | OSの種類 | 'darwin', 'linux', 'win32' |
process.cwd() | 現在の作業ディレクトリを返すメソッド | '/Users/example/project' |
構文: process.cwd()
| 引数 | 説明 |
|---|---|
| なし | 引数は取りません |
戻り値: 現在のNode.jsプロセスの作業ディレクトリを表す文字列
console.log(process.cwd());Node.jsを学ぶ順番
Node.jsは範囲が広いので、最初から全部を覚えようとしない方がいいです。まずは次の順番で土台を作ると、Expressや本番運用までつながりやすくなります。
- Node.jsとブラウザの違いを理解する
- npmと
package.jsonを読めるようにする - CommonJSとES Modulesの違いを理解する
- 非同期処理とイベントループをNode.jsの文脈で理解する
- ファイル、Buffer、Stream、HTTPサーバーを触る
この章では全体像を扱いました。次章では、Node.jsをインストールし、プロジェクトごとにバージョンを管理する方法を見ていきます。
