はじめに
30代になって思うのは、技術選定で「なんとなく流行ってるから」という理由で選ぶと痛い目を見るということ。
でもNode.jsに関しては、「流行ってるから」ではなく「これがないと困る」というレベルで必須になっていますね。
GitHubで115,000スター以上、コントリビューター3,600名以上。OpenJS Foundationが支援するオープンソースプロジェクトとして、11年以上の実績があります。BunやDenoといった新しいランタイムが出てきても、Node.jsのエコシステムの厚みは圧倒的です。
フロントエンド開発するにもnpmが必要だし、ちょっとしたスクリプトを書くにもNode.jsが便利。避けて通れないなら、しっかり理解しておこうという話です。
Node.jsとは
Node.jsは、サーバーサイドでJavaScriptを実行するためのランタイム環境です。ブラウザの外でJavaScriptを動かせるようにしたもの、と理解すればOKです。
2009年にRyan Dahlが開発し、GoogleのV8 JavaScriptエンジンをベースにしています。当時は「サーバーサイドでJavaScript?」という反応が多かったそうですが、今やWeb開発のデファクトスタンダードになりました。
公式サイト: https://nodejs.org GitHub: https://github.com/nodejs/node
特徴・メリット
1. 非同期・ノンブロッキングI/O
これがNode.jsの最大の特徴です。
従来のサーバーサイド言語では、ファイルの読み込みやDBアクセス中は処理が止まってしまいます。Node.jsはイベントループという仕組みで、I/O処理を待っている間も他の処理を進められます。
// 非同期でファイルを読み込む
import { readFile } from 'node:fs/promises';
const data = await readFile('file.txt', 'utf8');
console.log(data);
大量の同時接続を捌く必要があるWebアプリケーションには、この特性がめちゃくちゃ効いてきます。
2. JavaScriptでフルスタック開発
フロントエンドとバックエンドを同じ言語で書ける。これ、地味にでかいんですよ。
コンテキストスイッチが減るし、コードの共有もできる。チーム内で「フロントの人」「バックの人」という壁がなくなります。
3. 世界最大のパッケージエコシステム
npm(Node Package Manager)には200万以上のパッケージが登録されています。やりたいことの大半は、すでに誰かがライブラリを作ってくれている。
npm search 何か欲しい機能
# 大体見つかる
車輪の再発明を避けられるのは、時短になりますね。
4. 企業での採用実績
Netflix、LinkedIn、PayPal、Uber、NASA。名だたる企業がNode.jsを本番環境で使っています。「実績がないから不安」という心配は無用です。
5. 活発なコミュニティ
OpenJS Foundationのもと、Technical Steering Committee(TSC)が約20名の投票メンバーで構成されています。月1回以上のリリースがあり、継続的に改善されています。
インストール方法
推奨:バージョン管理ツールを使う
正直なところ、直接インストールするよりバージョン管理ツールを使う方がおすすめです。プロジェクトごとにNode.jsのバージョンを切り替えられます。
nvm(Node Version Manager)- macOS / Linux
# nvmのインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# シェルの再読み込み
source ~/.bashrc # または ~/.zshrc
# Node.js LTSのインストール
nvm install --lts
# バージョン確認
node --version
# v24.11.1
直接インストール
公式サイトからダウンロードする方法です。
# macOS(Homebrew)
brew install node
# Ubuntu / Debian
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
# Windows
# 公式サイトからインストーラーをダウンロード
バージョン確認
node --version
# v24.11.1(最新LTS)
npm --version
# 10.x.x
現在の最新バージョンは以下の通りです:
- LTS(長期サポート): v24.11.1
- 最新版: v25.2.1
個人的には、本番環境ではLTS一択ですね。安定性が違います。
基本的な使い方
Hello World
// hello.mjs
console.log('Hello, Node.js!');
node hello.mjs
# Hello, Node.js!
シンプル。
HTTPサーバーの作成
// server.mjs
import { createServer } from 'node:http';
const server = createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World!\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Listening on http://127.0.0.1:3000');
});
node server.mjs
# Listening on http://127.0.0.1:3000
たった数行でHTTPサーバーが立ち上がります。
ファイル操作
// file-ops.mjs
import { readFile, writeFile } from 'node:fs/promises';
// ファイルの読み込み
const content = await readFile('input.txt', 'utf8');
console.log(content);
// ファイルの書き込み
await writeFile('output.txt', 'Hello from Node.js!');
npmパッケージの利用
# プロジェクトの初期化
npm init -y
# パッケージのインストール
npm install express
# devDependenciesに追加
npm install -D typescript @types/node
package.jsonのscripts
{
"name": "my-app",
"scripts": {
"start": "node src/index.mjs",
"dev": "node --watch src/index.mjs",
"test": "node --test"
}
}
npm run dev
# ファイル変更時に自動リロード
Node.js v18以降は--watchフラグが標準で使えます。nodemonいらず。
実践的なユースケース
1. Expressでの REST API
// app.mjs
import express from 'express';
const app = express();
app.use(express.json());
const users = [
{ id: 1, name: 'User 1' },
{ id: 2, name: 'User 2' },
];
app.get('/api/users', (req, res) => {
res.json(users);
});
app.get('/api/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) {
return res.status(404).json({ error: 'User not found' });
}
res.json(user);
});
app.post('/api/users', (req, res) => {
const newUser = {
id: users.length + 1,
name: req.body.name,
};
users.push(newUser);
res.status(201).json(newUser);
});
app.listen(3000, () => {
console.log('API server running on http://localhost:3000');
});
Expressは軽量で学習コストが低い。個人開発ならこれで十分です。
2. CLIツールの作成
// cli.mjs
#!/usr/bin/env node
const args = process.argv.slice(2);
const command = args[0];
switch (command) {
case 'hello':
console.log(`Hello, ${args[1] || 'World'}!`);
break;
case 'version':
console.log('v1.0.0');
break;
default:
console.log('Usage: cli.mjs <command>');
console.log('Commands: hello [name], version');
}
chmod +x cli.mjs
./cli.mjs hello easegis
# Hello, easegis!
ちょっとした自動化スクリプトを作るのに便利。
3. ストリーム処理
// stream.mjs
import { createReadStream, createWriteStream } from 'node:fs';
import { pipeline } from 'node:stream/promises';
import { createGzip } from 'node:zlib';
// 大きなファイルをgzip圧縮
await pipeline(
createReadStream('large-file.txt'),
createGzip(),
createWriteStream('large-file.txt.gz')
);
console.log('Compression complete!');
メモリ効率よく大きなファイルを処理できます。
4. ワーカースレッド
// main.mjs
import { Worker } from 'node:worker_threads';
const worker = new Worker('./worker.mjs');
worker.on('message', (result) => {
console.log('Result:', result);
});
worker.postMessage({ task: 'heavyCalculation', data: 1000000 });
// worker.mjs
import { parentPort } from 'node:worker_threads';
parentPort.on('message', ({ task, data }) => {
// 重い処理
let result = 0;
for (let i = 0; i < data; i++) {
result += i;
}
parentPort.postMessage(result);
});
CPUバウンドな処理はワーカースレッドに逃がすことで、メインスレッドをブロックしない。
5. テストの実行
// math.test.mjs
import { test } from 'node:test';
import assert from 'node:assert';
test('addition', () => {
assert.strictEqual(1 + 1, 2);
});
test('async test', async () => {
const result = await Promise.resolve(42);
assert.strictEqual(result, 42);
});
node --test
# または
node --test math.test.mjs
Node.js v18以降は標準でテストランナーが付属しています。Jestなしでも基本的なテストは書ける。
BunやDenoとの違い
最近はBunやDenoといった新しいランタイムも注目されています。
| 項目 | Node.js | Bun | Deno |
|---|---|---|---|
| エンジン | V8 | JavaScriptCore | V8 |
| 起動速度 | 普通 | 速い | 普通 |
| npm互換性 | 標準 | 互換 | 互換レイヤー |
| TypeScript | 設定必要 | ネイティブ | ネイティブ |
| 歴史 | 15年+ | 2年+ | 5年+ |
| エコシステム | 最大 | 互換 | 独自+互換 |
個人的には、エコシステムの成熟度と実績を考えると、まだまだNode.jsが本命という認識です。新しいものを試したい気持ちはわかりますが、仕事で使うならNode.jsの安定感は捨てがたい。
まとめ
Node.jsは「JavaScriptでサーバーサイドを書く」という選択肢を現実的にしたツールです。
正直なところ、今からWeb開発を始めるなら、Node.jsは避けて通れません。フロントエンドの開発環境としても必須ですし、サーバーサイドでも十分な選択肢になります。
こんな人には特におすすめです:
- JavaScriptでフルスタック開発したい
- フロントエンド開発環境を構築したい
- ちょっとしたCLIツールやスクリプトを作りたい
- 非同期処理が得意なWebサーバーを構築したい
- 巨大なnpmエコシステムを活用したい
BunやDenoも面白いですが、まずはNode.jsをしっかり理解しておくと、それらの新しいランタイムとの違いも見えてきます。基礎は大事ですね。
公式サイト: https://nodejs.org GitHub: https://github.com/nodejs/node ドキュメント: https://nodejs.org/docs