Webバックエンド - フレームワーク

Node.js のーどじぇいえす

JavaScriptサーバーサイド非同期処理npmV8エンジンイベントループ
Node.jsについて教えて

簡単に言うとこんな感じ!

もともとWebページを動かすためだけの言語だったJavaScriptを、サーバー側でも動かせるようにした仕組みだよ!「フロントもバックも同じ言語でOK」って開発チームがめちゃくちゃ助かるやつなんだ!


Node.jsとは

Node.js(ノードジェイエス)は、JavaScriptをWebブラウザの外、つまりサーバー側でも実行できるようにしたランタイム環境です。「ランタイム環境」とは、プログラムを動かすための土台のこと。Googleが開発した高速なJavaScript実行エンジン「V8エンジン」をベースに、2009年にRyan Dahlが公開しました。

従来、JavaScriptはWebブラウザの中でのみ動く言語でした。一方、サーバー側の処理(データベースへの問い合わせや認証処理など)にはPythonRubyPHPといった別の言語が必要で、フロントエンド(画面側)とバックエンド(サーバー側)で異なる言語を使うのが当たり前でした。Node.jsの登場により、JavaScriptひとつでフロントもバックも書ける時代が到来しました。

Node.jsの最大の特徴は非同期・ノンブロッキングI/Oという仕組みです。複数のリクエストが来ても、処理待ちの間に他の作業を進められるため、少ないリソースで高い同時接続数をさばけます。チャットアプリやリアルタイム通知など、大量の同時接続が必要なサービスで特に力を発揮します。


Node.jsの仕組みと構造

Node.jsを構成する3つの核心

要素役割たとえると
V8エンジンJavaScriptを機械語に変換して高速実行エンジン(車の動力源)
イベントループ非同期処理を効率よく順番に処理するしくみ回転ずしのレーン
libuvファイル・ネットワークなどOS機能を扱うライブラリ車のタイヤ・シャーシ

ノンブロッキングI/Oのイメージ

従来型(ブロッキング)のサーバー:

客A → リクエスト処理中(待機)→ 完了 → 次の客へ
客B →            ← 待たされる!
客C →                     ← さらに待たされる!

Node.jsのサーバー(ノンブロッキング):

客A → リクエスト受付 → DBに問合せ中(その間に次へ)
客B → リクエスト受付 → 処理中(その間に次へ)
客C → リクエスト受付 → 即対応!
      ↓ DBから返事が来たら順番に回答

料理を注文したあと、厨房が仕上げている間にも次のお客さんの注文を取り続けるウェイターのようなイメージです。

覚え方

「Node = 結び目」 ── ネットワーク上の「節(ふし)」という意味のNodeが語源。JavaScriptという糸で、フロントとバックを「結ぶ」存在、と覚えると◎


歴史と背景

  • 2009年 ── Ryan Dahlが発表。「大量の同時接続をシンプルに扱いたい」という課題感から生まれた
  • 2010年 ── パッケージ管理ツール「npm(Node Package Manager)」が登場。世界中の開発者が作ったライブラリを簡単に利用できる仕組みが整う
  • 2011年 ── Windows対応。普及が一気に加速
  • 2014年 ── コミュニティの一部が「io.js」としてフォーク(分岐)。開発方針をめぐる議論が活発化
  • 2015年 ── Node.jsとio.jsが統合。Node.js Foundationが設立され、企業主導のガバナンス体制へ
  • 2019年 ── JS Foundationと合併し、OpenJS Foundationに。LinuxFoundation傘下でオープンソースとして発展
  • 2020年代 ── Netflix・LinkedIn・PayPalなど大手企業が採用。npmのパッケージ数は200万を超え、世界最大規模のエコシステムに成長

Node.jsと関連技術の比較

他のバックエンド技術との比較

比較項目Node.jsPython (Django/Flask)Ruby on RailsPHP
言語JavaScriptPythonRubyPHP
得意な用途リアルタイム・APIAI/機械学習連携高速プロトタイプWordPress等CMS
非同期処理◎ 得意△ 追加実装が必要△ 追加実装が必要
学習コストフロント経験者は低い中程度中程度低い
エコシステム◎ npm(最大規模)○ PyPI○ RubyGems○ Composer

Node.jsを使った主要フレームワーク

Node.js(土台)
├── Express.js     ← 最も軽量・シンプル。自由度高い
├── Fastify        ← 高速性重視。Expressの後継候補
├── NestJS         ← 大規模開発向け。TypeScript対応
├── Next.js        ← フロントとバックを一体化(React向け)
└── Nuxt.js        ← Vue.js向けのNext.js的存在

フロントエンドとバックエンドの関係図

フロントエンド (ブラウザ) HTML / CSS JavaScript React / Vue npm パッケージ (開発ツール等) Node.js V8エンジン イベントループ npm エコシステム Express / NestJS … HTTP HTTP バックエンド周辺 (サーバー・インフラ) REST API データベース 認証・セッション クラウド / Docker (AWS / GCP等) API 応答 JavaScriptだけで両側をつなげる!

関連する規格・RFC

規格・RFC番号内容
RFC 7230HTTP/1.1 メッセージ構文(Node.jsのHTTPモジュールが準拠)
RFC 7540HTTP/2(Node.js v8.4以降でサポート)
RFC 6455WebSocket(Node.jsのリアルタイム通信で多用)
RFC 8259JSON仕様(Node.jsのAPI通信で標準的に利用)

関連用語

  • JavaScript — WebブラウザおよびNode.js上で動くプログラミング言語
  • npm — Node.jsのパッケージ管理ツール。世界最大規模のライブラリ集
  • REST API — Webサービス間でデータをやり取りする設計スタイル
  • Express.js — Node.js上で動く軽量なWebフレームワーク
  • WebSocket — ブラウザとサーバー間でリアルタイム双方向通信を実現する規格
  • Docker — Node.jsアプリをコンテナ化して環境差異をなくす仮想化技術
  • TypeScript — JavaScriptに型付けを追加した言語。Node.jsと組み合わせて大規模開発に使われる
  • フロントエンド — ユーザーが直接操作する画面側の総称。Node.jsの開発ツール群もここで活躍