JavaScriptランタイム入門:Node.jsを理解する

others

こんにちは、KIYONOエンジニアです。

みなさん、普段当たり前に Node.js を使っていますよね。
npm install、ビルド、テスト、Next.jsの起動、CLIの実行……。
でも「Nodeってそもそも何?」「ランタイムって何?」を説明できますか?

この記事では、JavaScriptが“ブラウザの中だけの言語”だった時代から辿りながら、
なぜランタイムが必要になったのか、そして現在の代表的なランタイム(Node / Deno / Bun / Edge系)の違いと使い分けを整理します。

そもそも「ランタイム」とは何か?(よくある誤解から整理する)

まず最初に整理したいのは、ランタイムは「言語」でも「フレームワーク」でもないということです。

よくある誤解

  • ❌ Node.js = JavaScriptという言語
  • ❌ Node.js = Expressのようなフレームワーク
  • ❌ Node.js = サーバーそのもの

これらはすべて微妙に違います。

言語・ランタイム・フレームワークの違い

概念 役割
言語 JavaScript 文法・書き方のルール
ランタイム Node.js / Deno / Bun その言語を「実行する環境」
フレームワーク Express / Next.js / NestJS アプリを効率的に作るための設計テンプレート

例えるなら、

  • 言語 = レシピの書き方
  • ランタイム = キッチン(コンロ・冷蔵庫・調理器具が揃っている場所)
  • フレームワーク = よく使われる料理の型(テンプレート)

JavaScriptというレシピを書いても、
キッチン(ランタイム)がなければ実際には何も作れません。

ランタイムは「実行環境」である

ランタイムとは、コードを実際に「動かすために必要なもの一式」を指します。

JavaScriptの場合、ランタイムには大きく次の要素が含まれます。

  • JavaScriptエンジン(コードを解釈・実行する部分)
  • 標準API(ファイル操作、ネットワーク通信、タイマーなど)
  • イベントループ(非同期処理を制御する仕組み)
  • モジュール管理の仕組み

重要なのは、JavaScriptそのものには「ファイルを読む機能」は存在しないということです。

例えばこのコード:

const fs = require("fs");
fs.readFileSync("data.txt", "utf-8");

これは「JavaScriptの機能」ではありません。
これは Node.jsというランタイムが提供している機能 です。

つまり、

JavaScript = 言語仕様(ECMAScript)

Node.js = JavaScript + OSアクセスAPI + 実行基盤

という関係になります。

JavaScriptは“ブラウザでしか動かなかった”

JavaScriptは元々、ブラウザ上で動くことが前提の言語として普及しました。
ブラウザはHTML/CSS/JSを表示するために、次の機能を最初から持っています。

  • DOM(画面)を操作するAPI
  • HTTP通信(fetchなど)
  • イベントループ(クリック、入力、非同期処理)
  • セキュリティ制約(サンドボックス:ローカルファイルを勝手に触れない等)

つまり当時のJavaScriptは、「ブラウザという巨大なランタイムの上で動く言語」でした。
逆に言うと、ブラウザの外(サーバーやOS上)で動かすには、ブラウザ以外のランタイムが必要になります。

Node.jsとは何か(何がスゴいのか)

Node.jsは、ひとことで言うと 「サーバー/OS上でJavaScriptを動かすためのランタイム」です。
そしてNodeが革命だった点は、単に「JSがサーバーで動く」だけではありません。

Node.jsが提供した価値

  • OS機能へアクセスできるAPI(ファイル、プロセス、TCP/HTTPなど)
  • イベントループ + 非同期I/Oが得意(大量のI/O処理と相性が良い)
  • npmによる巨大なエコシステム(依存管理が標準化)
  • フロントと同じ言語でサーバーを書ける(人・知識・ライブラリが共有される)

Node.jsは何で動いている?(ざっくり構造)

  • JavaScriptエンジン:V8
  • 非同期I/O:libuv(イベントループやI/O抽象化)
  • Node API:fs / http / crypto など
  • パッケージ:npm(今はpnpm/yarnも含めた“文化”になっている)

ランタイムの種類:Node / Deno / Bun

現在の“サーバーサイドJavaScript”の代表的なランタイムは以下です。

ランタイム 思想/特徴 強み 注意点
Node.js 最も普及。歴史・互換性・エコシステムの中心 npm資産、情報量、ライブラリ/フレームワークの対応が圧倒的 設定やツールが増えがち(プロジェクト規模で複雑化)
Deno “Web標準寄り” + セキュリティ志向。近年はNode互換も重視 標準でTypeScript、権限管理、ツール内蔵(fmt/lint/testなど) Node互換は改善中(とはいえ動く範囲は年々広がる)
Bun “速さ”と“全部入り”志向(runtime + bundler + test + package) 高速起動/高速I/O、開発体験がシンプル、統合ツールが強い 急速に成熟中。巨大プロダクトでは検証・運用ノウハウがまだ浅い領域も

それぞれの強み・使うべき場面

Node.js を選ぶべき場面

  • 既存のnpmライブラリに強く依存している
  • チームの運用知見、デプロイ先、監視、トラブルシュートがNode前提
  • Next.js/NestJS/Expressなど、Node中心のフレームワークを使う
  • “まず確実に動く”ことが重要(採用・保守・長期運用)

Deno を選ぶべき場面

  • Web標準API中心で実装したい(fetch, URL, Web Streams など)
  • セキュリティ(権限)を強めたい(例:ファイルアクセスを明示的に許可)
  • TS/フォーマット/テストなどを“標準装備”で揃えたい
  • 将来的にNode互換も活かしつつ、DXを軽くしたい

Bun を選ぶべき場面

  • 起動・ビルド・インストール速度を効かせたい(CI時間短縮など)
  • “全部入り”で開発体験を簡略化したい(bundler/test/packageを統合)
  • プロトタイプ〜中規模で、検証しながら速度メリットを取りにいきたい

結局どれが人気?(現状の立ち位置)

現時点の肌感としては、Node.jsが圧倒的にデファクトです。
一方で、BunやDenoは「Node互換を強めつつ、DXや性能で差別化」する流れが強く、特にBunは“2番手として存在感が増している”という見方もよく見ます。

  • Node.js:当面は中心(エコシステムが巨大)
  • Bun:速度と統合ツールで伸びやすい(採用検討が増える)
  • Deno:Web標準 + セキュア設計、互換改善で使いどころが増える

まとめ

  • JavaScriptは元々“ブラウザの中で動く言語”で、ブラウザ自体が巨大なランタイムだった
  • サーバー/OS上でJSを動かすためにNode.jsが登場し、エコシステム(npm)と合わせて普及した
  • 今は Node / Deno / Bun など選択肢が増え、目的に応じて使い分ける時代

ここまで読んでいただきありがとうございました!

PAGE TOP
タイトルとURLをコピーしました