Node.js入門:JavaScriptでバックエンドを作る最初の一歩(2026年版)
文系未経験からフロントエンドエンジニアに転職した筆者がNode.jsの基礎から実際に動くサーバーを作るまでを丁寧に解説。JavaScriptを学んだ次のステップに最適です。
「JavaScriptはある程度書けるようになってきた。でも、Node.jsって結局何?」
この疑問、正直に言います。僕も独学を始めた頃、かなり長い間放置していました。フロントエンドで精一杯で、「バックエンドはいつかでいい」と思っていたんです。
結論から言うと、Node.jsを理解することで、JavaScriptエンジニアとしての価値が一段上がります。フロントもバックも同じ言語で書けるようになる、というのは採用市場でも明確なアドバンテージです。
この記事では、Node.jsの基礎から実際にシンプルなHTTPサーバーを作るところまで、コードを交えて解説します。
筆者について
文系大学卒→営業3年→独学8ヶ月でWeb系企業に転職した元未経験エンジニアです。現在はReact/Next.jsをメインにフリーランスで動いています。JavaScriptは独学の「最初の一本」として選んだ言語で、Node.jsはその延長で学びました。
Node.jsとは何か
JavaScriptをブラウザ外で動かす仕組み
もともとJavaScriptは「ブラウザの中でしか動かない」言語でした。HTMLのボタンを押したら何かが動く、入力欄をチェックする、そういった用途です。
Node.jsは、このJavaScriptをブラウザの外でも動かせるようにした「実行環境」です。
コードで言うなら、こういうイメージです。
通常のJS: [ブラウザ] の中だけで動く
Node.js: [ブラウザ] の外でも動く = サーバー、CLI、自動化ツール
なぜフロントエンドエンジニアがNode.jsを学ぶか
実は、フロントエンドの開発環境はすでにNode.jsの上で動いています。
npm install を実行するとき、npx create-react-app を使うとき、vite や webpack がバンドルするとき—これら全部、Node.jsが動いています。
つまり、フロントエンドエンジニアとして仕事をする段階で、すでにNode.jsのお世話になっているわけです。ここがポイントなんですが、「使っている」と「理解している」は全然違います。
Node.jsのインストール
nvmを使う(推奨)
Node.jsのバージョン管理ツール「nvm(Node Version Manager)」を使うのがおすすめです。プロジェクトごとにNode.jsのバージョンを切り替えられるため、実務では必須に近い知識です。
Macの場合:
# nvmのインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# Node.jsのインストール(最新LTS版)
nvm install --lts
# バージョン確認
node -v
npm -v
Windowsの場合:
nvm-windowsをGitHubからダウンロードしてインストールします。その後は同様のコマンドで動きます。
正直、当時の僕は公式サイトから直接インストーラーをDLしていました。バージョン管理なんて考えていなかったんです。でも実務でNode.js 16と18を同時に使うプロジェクトに入ったとき、nvmの存在を知ってすぐに乗り換えました。
最初のNode.jsプログラムを動かす
Hello World
まずは定番のHello Worldから。
// hello.js
console.log("Hello, Node.js!");
console.log("ブラウザなしでJavaScriptが動く。");
ターミナルで実行します。
node hello.js
# → Hello, Node.js!
# → ブラウザなしでJavaScriptが動く。
ブラウザなしでJavaScriptが動く。これが「Node.jsを理解した」最初の感覚です。
ファイルを読み書きする
Node.jsには標準モジュールが豊富にあります。ファイル操作のfsモジュールを使ってみます。
// file-read.js
const fs = require('fs');
// ファイルを同期的に読む
const content = fs.readFileSync('./hello.js', 'utf8');
console.log(content);
// ファイルを非同期で読む(実務ではこちらが主流)
fs.readFile('./hello.js', 'utf8', (err, data) => {
if (err) {
console.error('読み込みエラー:', err);
return;
}
console.log('非同期で読み込んだ内容:', data);
});
ここがポイントなんですが、Node.jsは「非同期処理」が得意です。同期処理と非同期処理の違いを理解することが、Node.jsを使いこなす第一歩です。
HTTPサーバーを作る
標準モジュールだけでサーバーを立てる
Node.jsの標準モジュールhttpを使えば、外部ライブラリなしでWebサーバーが作れます。
// server.js
const http = require('http');
const server = http.createServer((req, res) => {
// レスポンスヘッダーを設定
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
// URLに応じてレスポンスを変える
if (req.url === '/') {
res.end('<h1>トップページです</h1>');
} else if (req.url === '/about') {
res.end('<h1>About: 中村ソウマのサーバーです</h1>');
} else {
res.writeHead(404);
res.end('<h1>404 Not Found</h1>');
}
});
// ポート3000で起動
server.listen(3000, () => {
console.log('サーバー起動: http://localhost:3000');
});
実行してブラウザで http://localhost:3000 を開くと、「トップページです」と表示されます。
node server.js
# → サーバー起動: http://localhost:3000
正直、当時の僕はこれで「バックエンドって意外と難しくないかも」と感じました。もちろんここから先は複雑になりますが、土台はシンプルです。
Expressで本格的なAPIを作る
Expressとは
実務のNode.jsアプリは、ほぼExpressというフレームワークを使います。標準モジュールだけでは複雑になりすぎるルーティングや、ミドルウェア(認証、ログ等)の管理を楽にしてくれます。
# プロジェクトの初期化
mkdir my-api && cd my-api
npm init -y
# Expressのインストール
npm install express
シンプルなREST APIを作る
// app.js
const express = require('express');
const app = express();
// JSONリクエストを解析するミドルウェア
app.use(express.json());
// サンプルデータ
let users = [
{ id: 1, name: '中村ソウマ', role: 'フロントエンドエンジニア' },
{ id: 2, name: '田中テスト', role: 'バックエンドエンジニア' },
];
// GET: ユーザー一覧を返す
app.get('/api/users', (req, res) => {
res.json(users);
});
// GET: 特定のユーザーを返す
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({ message: 'ユーザーが見つかりません' });
res.json(user);
});
// POST: ユーザーを追加する
app.post('/api/users', (req, res) => {
const newUser = {
id: users.length + 1,
name: req.body.name,
role: req.body.role,
};
users.push(newUser);
res.status(201).json(newUser);
});
app.listen(3000, () => {
console.log('API起動: http://localhost:3000');
});
これが「REST API」の基本形です。フロントエンドのReactアプリと、このバックエンドAPIを繋げることで、本格的なWebアプリが作れます。
非同期処理の3つのパターン
Node.jsを学ぶ上で、ここが最初の壁になりやすいです。3つのパターンをしっかり理解しておきましょう。
const { readFile } = require('fs/promises');
// パターン1: コールバック(古いスタイル)
require('fs').readFile('./data.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log('コールバック:', data);
});
// パターン2: Promise(モダンなスタイル)
readFile('./data.txt', 'utf8')
.then(data => console.log('Promise:', data))
.catch(err => console.error(err));
// パターン3: async/await(最もシンプル・読みやすい)
async function readData() {
try {
const data = await readFile('./data.txt', 'utf8');
console.log('async/await:', data);
} catch (err) {
console.error(err);
}
}
readData();
プログラミング的に言うと、「同時に複数の作業をこなせる」のがNode.jsの強みです。レストランで例えるなら、一人のウェイターが複数のテーブルを掛け持ちするようなイメージです。実務ではasync/awaitが最も読みやすいため、新しいコードはほぼこのパターンで書きます。
Node.jsの次のステップ
Node.jsの基礎を掴んだら、次は以下に進むことをおすすめします。
- TypeScriptを導入する: 型安全なコードで実務レベルへ → TypeScript入門:型でコードの品質を上げる方法
- Dockerで環境構築: チームでの開発環境統一 → Docker入門:開発環境をコンテナで管理する
- Next.jsのAPIルートを使う: フロントとバックを一体化 → Next.js vs React CRAの違いを解説
まとめ
大事なのは「JavaScriptはもうフロントだけの言語じゃない」という認識です。
Node.jsを理解すると、フロントエンドとバックエンドの両方を視野に入れたエンジニアになれます。これは採用市場でも、フリーランスで案件を取る上でも、明確なアドバンテージになります。
まずは今日の内容を手元で動かしてみてください。node hello.js の一行から始まります。独学でプログラミングを進めている方は、独学プログラミングのロードマップも参考にしてみてください。
独学に限界を感じたら:
正直、Node.jsあたりまで来ると「誰かに聞けたら10倍速いのに」と思う場面が増えます。非同期処理まわりで3週間ハマりましたが、あれは誰かに一言聞けば5分で解決できた話でした。
もし独学に限界を感じたら、プログラミングスクールという選択肢も検討してみてください。現役エンジニアのメンタリングがある環境では、こういったギモンを即解決できます。