最終更新:

Node.js・Bun・Denoの違いは?TypeScriptと互換性で選ぶ


JSランタイム:目的から選ぼう Node.js既存アプリ運用の基準Bun実行とツールまとめて扱うDenoI/Oの権限既定で制限.ts実行できる≠型が正しい別に検査tsc / deno check で型を確認 JSランタイムの選び方 Node.js既存アプリ運用の基準Bun実行・道具まとめて扱うDenoI/Oの権限既定で制限TypeScriptを実行できる≠ 型が正しいtsc / deno check で確認
各ランタイムには異なる特徴があります。TypeScriptを実行できることと型が正しいことは別で、互換性・型検査・実アプリの動作を確認します。
ひよこ ひよこ
3つともJavaScriptを動かすの?
ペンギン先生 ペンギン先生
そうだよ。ランタイムはJavaScriptを実行し、ファイルやネットワークなどを扱う環境だね。BunやDenoにはテストなどの開発ツールも含まれる。ただし、同じ言語を実行できてもAPIやパッケージの挙動まで同一とは限らないよ。
ひよこ ひよこ
既存のNode.jsアプリは、そのまま移せる?
ペンギン先生 ペンギン先生
まず依存パッケージと利用APIを確認しよう。BunはNode.js互換を目指しているけれど、公式の対応表にも差異がある。Denoもnpm・package.jsonに対応するけれど、ネイティブアドオンや権限、モジュール解決を含めた確認が必要なんだ。
ひよこ ひよこ
TypeScriptはどれでも直接動くんだよね?
ペンギン先生 ペンギン先生
対応範囲が違うよ。Node.jsの組み込み機能は、型注釈などを取り除いて実行する方式。型検査はせず、tsconfig.jsonも読まない。JSXやコード生成が必要なenumなどはその機能だけでは扱えないので、必要に応じてtsxやコンパイル工程を使うんだ。
ひよこ ひよこ
動けば型も正しいってこと?
ペンギン先生 ペンギン先生
そこは別だよ。Bunも実行時に型検査はしない。Denoも通常のdeno runと型検査は別で、deno checkやdeno run --checkで確認する。Node.jsやBunでは、たとえばTypeScriptのtsc --noEmitをCIへ入れて、実行できても型が間違ったコードを見つけよう。
ひよこ ひよこ
Denoなら安全なパッケージだけ動くの?
ペンギン先生 ペンギン先生
Denoは既定でファイル・ネットワークなどへのアクセスを制限し、必要な権限を許可する設計だよ。ただし許可は同じスレッドのコードで共有されるし、サブプロセスなどにも注意が必要。権限を広く許したら安全になるわけではなく、依存関係の確認も必要なんだ。
ひよこ ひよこ
Node.jsには権限を制限する機能がないの?
ペンギン先生 ペンギン先生
あるよ。--permissionで有効にするPermission Modelが用意されている。ただし公式には、信頼したコードの意図しない操作を防ぐ仕組みで、悪意あるコードを安全に隔離する保証はないと説明されている。Denoと同じ安全性だとも決めつけないでね。
ひよこ ひよこ
Bunは必ず速いの?
ペンギン先生 ペンギン先生
起動、インストール、ビルド、HTTP処理は別の測定項目だよ。DB待ちが大きいアプリでは、ランタイムを替えても効果が小さいことがある。同じ依存関係・入力・マシン・キャッシュ条件で、実アプリの応答時間とメモリを測ろう。
ひよこ ひよこ
結局どこから選べばいい?
ペンギン先生 ペンギン先生
既存システムなら、まず現在のNode.jsと運用を基準にする。Bunの統合ツールやDenoの権限設計に具体的な利点があれば、一部の処理で試そう。インストール用ツールだけを替えるのと、本番ランタイムまで替えるのは別の変更だよ。

比較するときにそろえる条件

確認点Node.jsBunDeno
TypeScript実行組み込みの型除去には構文上の制約TS・TSXを変換して実行TSを変換して実行
型検査tscなどを別途実行tscなどを別途実行deno checkを利用できる
既存npm資産対象Node.js版での対応を確認公式互換表と実アプリで確認npm対応・権限・アドオンを確認
移行の単位現行環境の基準パッケージ管理だけの採用も可能ツール群・実行環境の採用範囲を決める

tsxとBunは同じもの?

tsxはNode.jsでTypeScriptを実行するためのツール、Bunはランタイムも含むツールキットです。TypeScriptを実行したいだけなのか、本番の実行環境も替えたいのかを先に分けると比較しやすくなります。型検査の有無も別に確認してください。

移行前には、テストだけでなく起動・終了処理、ファイル操作、環境変数、DB接続、エラー監視を実際のデプロイ環境で確認します。最新版の番号や「互換率99%」だけでは、自分のアプリが動く根拠になりません。

TypeScriptの「実行」と「型検査」を試す

次をexample.tsに保存します。型注釈と値が食い違う、意図的に型が間違った例です。

const count: number = "3";
console.log(count);

型検査をしない実行では型注釈が取り除かれ、文字列の3を表示できます。一方、型検査ではnumberに文字列を代入した誤りが報告されます。

目的Node.jsBunDeno
このファイルを実行するnode example.tsbun run example.tsdeno run example.ts
型の誤りを検出するtsc --noEmit example.tstsc --noEmit example.tsdeno check example.ts

Node.jsのこの実行例は組み込みの型除去が既定で使える22.18以降を想定し、enumやJSXなどは含みません。tscはTypeScriptを導入した環境で使います。実プロジェクトでは、対象ランタイムに合う型定義と設定もそろえてください。

選び方のまとめ

既存のNode.jsアプリなら互換性と運用を基準にし、Bunの統合ツールやDenoの権限設計が解決したい課題に合うか試します。パッケージのインストールだけをBunに替えることと、本番の実行環境を替えることは別です。採用後も型検査・動作テストを残しましょう。

参考資料

確認日:2026年10月4日。製品の仕様・料金・対応環境は導入時にも確認してください。