はじめに
JavaScriptのサーバーサイド界隈、最近めちゃくちゃ賑やかですよね。Node.jsだけでも十分だったのに、DenoだBunだと新しいランタイムがどんどん出てきて「また勉強することが増えた...」って思ってる人、私だけじゃないはず。
重要なポイント:DenoとBunは、どちらもNode.jsの「代替」として設計された完全に独立したランタイムです。 つまり、Node.jsをインストールしなくても、それぞれ単体で動作します。これって結構重要な話で、「新しいツールを試すのにNode.jsも必要」みたいな誤解をしている人が多いんですよね。
というわけで、現場で実際に使ってみた感想も交えながら、この3つを正直ベースで比較してみました。
各ランタイムの第一印象
Node.js(ノードジェイエス):安心のベテラン
もう15年も現役で頑張ってるNode.js。正直、これを選んでおけば間違いないという安心感があります。ただ、最近は「古臭い」なんて言われることも...。でも実際のところ、まだまだ現役バリバリです。
Deno(ディーノ):理想主義者
Node.jsの作者が「あー、Node.js作り直したい」って言って作ったのがDeno。セキュリティとかTypeScriptとか、確かに理想的なんですが、現実的には「うーん...」となることも多い。
Bun(バン):新参の暴れん坊
「俺、めっちゃ速いんで」って登場したBun。確かに速いんですよ、マジで。でも新しすぎて不安になることもしばしば。
本音で比較してみた
項目 | Node.js | Deno | Bun |
---|---|---|---|
ランタイムエンジン | V8(Google) | V8(Google) | JavaScriptCore(Apple) |
学習コスト | 低(情報豊富) | 中(考え方が違う) | 低(Node.js経験者なら) |
実際の速度 | まあまあ | 速い | 爆速(マジで) |
安定性 | 抜群 | そこそこ | 未知数 |
エコシステム | 化け物級 | 発展中 | 追いかけてる |
TypeScript | 設定地獄 | 神 | いい感じ |
実際使ってみた感想
Node.js:やっぱり安定
// 普通にExpressでサーバー立てる
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('動くことは間違いない');
});
良いところ:
- 何でもnpmで解決できる(パッケージ数がえげつない)
- ググればなんでも出てくる
- 会社で「Node.js使います」って言って反対される確率は低い
- 枯れてるので変な挙動が少ない
イマイチなところ:
- TypeScript環境作るのが面倒(webpack、babel、設定ファイル地獄)
- なんでもできるから逆に迷う
- パフォーマンスはそこそこ止まり
Deno:思想は素晴らしいけど...
// TypeScriptがそのまま動くのは確かに気持ちいい
import { serve } from "https://deno.land/std@0.200.0/http/server.ts";
const handler = (req: Request): Response => {
return new Response("設定なしでTypeScript!");
};
serve(handler, { port: 3000 });
良いところ:
- TypeScriptの体験が最高(設定いらず)
- セキュリティ機能が本当に安心
- Web標準に忠実(将来性◎)
- URL importは慣れると便利
イマイチなところ:
- npm ecosystemとの相性が微妙(使えるけど...)
- 権限システムが面倒なときもある(
--allow-all
しがち) - まだ情報が少ない(StackOverflowで解決率低め)
- 会社で採用するには説得が必要
Bun:速すぎて逆に不安
// これだけでサーバーが立つ(しかも爆速)
const server = Bun.serve({
port: 3000,
fetch(req) {
return new Response("速すぎてちょっと怖い");
},
});
良いところ:
- とにかく速い(パッケージインストールが3秒とか意味不明)
- all-in-oneで楽(バンドラーもテストも全部入り)
- Node.js互換性が高い(大体そのまま動く)
- 開発体験が最高
イマイチなところ:
- 新しすぎて本番投入が怖い
- Windows対応がまだ微妙
- 会社で「Bun使います」は相当勇気が必要
速度比較(体感)
実際に同じAPIを3つで作って測ってみました:
# package install(React + TypeScript環境)
Node.js: 25秒(長い...コーヒータイム)
Deno: なし(URL importなので)
Bun: 3秒(は?って感じ)
# サーバー起動時間
Node.js: 200ms(普通)
Deno: 80ms(速い)
Bun: 30ms(一瞬)
# Hello World API レスポンス
Node.js: 普通に速い
Deno: 結構速い
Bun: 異次元(req/s が桁違い)
Bunの速度は本当にヤバいです。開発中にホットリロードが一瞬すぎて「あれ、保存できてる?」ってなります。
現実的な選び方
Node.js を選ぶべき人
- 「安定が一番」派
- 既存プロジェクトの拡張
- チーム全員Node.js経験者
- 「新しいもの追いかけるの疲れた」派
正直、これを選んでおけば間違いないです。15年の実績は伊達じゃない。
Deno を選ぶべき人
- 「TypeScript愛が強い」派
- 「セキュリティ大事」派
- 「Web標準に従いたい」派
- 新規プロジェクト&説得力がある人
個人的には一番思想が好きなんですが、現実的にはハードルが高いことも。
Bun を選ぶべき人
- 「速度こそ正義」派
- 「新しいもの好き」派
- 個人開発・小規模チーム
- 「設定ファイル書きたくない」派
速度に魅力を感じるなら、とりあえず触ってみる価値はあります。
本音の使い分け
個人開発なら
趣味プロジェクト: Bun(楽しい)
ポートフォリオ: Deno(モダンアピール)
副業案件: Node.js(安全)
会社なら
新規サービス: Node.js(安定志向)
実験的プロジェクト: Deno(説得できれば)
内部ツール: Bun(速度重視)
レガシー改修: Node.js(一択)
2025年のリアルな状況
Node.js: まだまだ王者。求人数も圧倒的。
Deno: 徐々に増えてるけど、まだニッチ。
Bun: スタートアップや先進的な企業で採用が増加中。速度を武器に存在感を示してる。
転職を考えてるなら、Node.jsのスキルは必須。DenoやBunは「知ってると良い」レベルです。
まとめ:結局どれを選ぶ?
個人的な推奨度:
- 初心者: Node.js 一択(情報量が違う)
- TypeScript好き: Deno(ストレスフリー)
- 速度厨: Bun(中毒性あり)
- 現場エンジニア: 用途によるけど Node.js が安牌
正直なところ、どれも良いツールです。ただ、現実的には:
- Node.js でしっかり基礎を固める
- 余裕ができたら Deno か Bun を触ってみる
- プロジェクトの要件に応じて選択
これが一番バランス良いかなと思います。
新しいツールに飛びつくのも楽しいですが、まずは手堅く実績を積むのが大事。そのうえで「ここは Bun の速度が欲しい」とか「ここは Deno のセキュリティが必要」とか判断できるようになれば理想的ですね。
あ、あと一つ本音を言うと...どのランタイムを選んでも、結局はコードの品質の方が大事です(当たり前だけど)。
Bunを実際に使ってみよう
せっかくなので、Bunを試してみたい人向けに基本的な使い方をまとめておきます。
インストール方法
# macOS/Linux(一番簡単)
curl -fsSL https://bun.sh/install | bash
# Homebrew(macOS)
brew tap oven-sh/bun
brew install bun
# npm経由(皮肉だけど動く)
npm install -g bun
# Windows(PowerShell)
powershell -c "irm bun.sh/install.ps1 | iex"
インストール後、ターミナルを再起動して確認:
bun --version
基本的な使い方一覧
プロジェクト管理
# 新しいプロジェクト作成
bun init
# 既存のプロジェクトにBunを導入
cd your-project
bun install # package.jsonがあれば自動で依存関係をインストール
パッケージ管理
# パッケージのインストール
bun install # package.jsonの依存関係を全てインストール
bun add react # パッケージを追加
bun add -d typescript # 開発依存として追加
bun add -g some-cli-tool # グローバルインストール
# パッケージの削除
bun remove react
# パッケージの更新
bun update
bun update react # 特定のパッケージのみ更新
ファイル実行
# JavaScriptファイルを実行
bun run script.js
# TypeScriptファイルを直接実行(トランスパイル不要)
bun run app.ts
# package.jsonのスクリプト実行
bun run dev
bun run build
bun run test
# または短縮形
bun dev
bun build
bun test
バンドル作成
# 基本的なバンドル
bun build ./src/index.ts --outdir ./dist
# 最適化されたバンドル(minify付き)
bun build ./src/index.ts --outdir ./dist --minify
# ブラウザ向けバンドル
bun build ./src/index.ts --outdir ./dist --target browser
# 実行可能ファイルとしてコンパイル
bun build ./src/index.ts --compile --outfile myapp
# 複数のエントリーポイント
bun build ./src/index.ts ./src/worker.ts --outdir ./dist
テスト実行
# 全テストを実行
bun test
# 特定のファイルをテスト
bun test src/utils.test.ts
# watchモードでテスト
bun test --watch
# カバレッジ付きでテスト
bun test --coverage
実践的な例:Reactアプリを作ってみる
# Reactプロジェクトの作成
bun create react-app my-react-app
cd my-react-app
# 依存関係のインストール(爆速)
bun install
# 開発サーバー起動
bun run dev
Node.jsプロジェクトからの移行
既存のNode.jsプロジェクトをBunに移行するのは超簡単:
# 既存プロジェクトのディレクトリで
rm -rf node_modules # 既存のnode_modulesを削除
rm package-lock.json # ロックファイルも削除(あれば)
bun install # Bunでインストール(爆速で終わる)
bun run dev # 普通に動く(はず)
よく使うBunの便利機能
# パッケージ情報を確認
bun pm ls # インストール済みパッケージ一覧
bun pm cache # キャッシュ情報
# 依存関係の問題をチェック
bun install --dry-run
# ホットリロード付きで実行
bun --hot script.ts
# 静的ファイルサーバーを一瞬で立てる
bunx serve ./public
つまづきポイントと対処法
Windows使いの場合:
- まだ実験的なので、WSL2を使う方が安定
- PowerShellでインストールがうまくいかない場合は、WSL2でLinux版を使う
既存プロジェクトで動かない場合:
# デバッグ情報を出力
bun --verbose run script.js
パッケージが見つからない場合:
- npm registryを明示的に指定
bun install --registry https://registry.npmjs.org/
これで基本的なBunの使い方はマスターできるはず。速度にビックリすること間違いなしです!