Skip to main content

Node.js vs. Deno vs. Bun:パフォーマンスとJavaScriptランタイムの比較

著者
feature node deno bun

2023年9月5日

0 分で読めます

適切なJavaScriptランタイムを選ぶことが重要な理由

JavaScriptランタイムを使うと、ブラウザーの外部でアプリケーションコードを実行できます。つまり、ホスト型アプリケーションとしてサイトを提供できます。また、汎用スクリプトの実行にJavaScriptランタイムを利用することもできます。

選択したランタイムは、アプリケーションのパフォーマンスに大きく影響します。リクエスト処理やデータベースへのアクセス速度には大きな差が生じます。また、開発のしやすさやスケーラビリティにも影響します。

Node.js、Deno、Bunの比較

Node.js

Node.jsはJavaScriptランタイムの第一人者であり、2023年にはStack Overflowの開発者から最も人気のあるWebテクノロジー第1位に選ばれました。Ryan Dahlによって開発され、2009年に公開されました。市場に登場したことで、JavaScriptでできることに革命をもたらしたと言っても過言ではありません。Node.jsを使えば、JavaScriptで高度なバックエンド主導型アプリケーションを開発できます。

現在、Node.jsを中心に膨大なエコシステムが形成されており、リソースやライブラリも豊富です。

Deno

DenoはRustベースのJavaScriptランタイムです。Node.jsと同じく、Ryan Dahlによって開発され、公開されました

主な目的の1つは、Node.jsのセキュリティを向上させることです。Denoでは、ファイル、ネットワーク、環境へのアクセスを明示的に許可する必要があるため、こうした領域でセキュリティ上の問題が発生する可能性を抑えられます。また、JSXやTypeScriptをより適切にサポートし、Web標準を重視するように設計されています。デプロイを簡素化するため、アプリケーションは単体で動作する実行ファイルとして提供されます。

Denoには、開発者がプロジェクトをすぐに始められるよう、ツールのエコシステムも整っています。FreshはDeno向けのWebフレームワークで、LumeはDenoの静的サイトジェネレーターです。

Bun

Bunは、注目を集める新しいランタイムです。Zigを基盤とし、速度、バンドル、テスト、Node.jsパッケージとの互換性に重点を置いた、オールインワンのランタイム兼ツールキットを目指しています。最大の魅力の1つはパフォーマンスで、Node.jsとDenoの両方より明らかに高速です。すべての機能を実現できれば、非常に魅力的な選択肢となるでしょう。

パフォーマンスについて、Bunのメンテナーは、ReactでサーバーサイドページをレンダリングするHTTPハンドラーのベンチマーク例を公開しています。このテストでは、Bunは1秒あたり約68,000件のリクエストを処理しました。一方、Denoは約29,000件、Node.jsは約14,000件でした。大きな差です。Jarred SumnerはTwitterで、ベンチマークの最新情報とともにBunの開発状況を定期的に発信しています。最新情報をチェックするには、ぜひフォローしてください。

Bunには、JavaScriptやTypeScriptベースのプロジェクト向けに、バンドル機能とタスク実行機能も備わっています。Denoと同様に単一のバイナリとして提供され、Web APIもサポートしています。また、npmとの互換性により、一部のNode.jsライブラリも利用できます。

JavaScriptランタイムを比較する

パフォーマンス、サポートとコミュニティ、安定性、セキュリティ、その他の機能に注目して、それぞれの違いを詳しく見ていきましょう。

パフォーマンスと速度

結論から言うと、Bunの勝利です。先ほど見たとおり、Bunは優れたパフォーマンスを発揮し、1秒あたりに処理できるリクエスト数も非常に多くなっています。データベース操作でも同様です。Bunのベンチマークサンプルを使ってSQLite用Northwindデータベースを読み込んだ場合の、1秒あたりの平均クエリ数は次のとおりです。

ランタイム

1秒あたりの平均クエリ数

Node.js

21.29

Deno

43.50

Bun

81.37

Node.js、Deno、Bunを比較した別のテストでも、同時接続の処理速度はBunが最速です。1秒あたりのリクエスト数もかなり多くなっています。たとえば同時接続が10件の場合、Bunは毎秒110,000件のリクエストを処理します。Node.jsは60,000件、Denoは67,000件です。同時接続数を増やしても、この傾向と各ランタイムのパフォーマンスは変わりません。

BunはなぜNode.jsよりもはるかに高速なのか?

パフォーマンステストで使われたシナリオの有効性には異論もありますが、それでもBunが優位です。Node.jsはすべての比較で最下位となり、特にデータベースの速度で苦戦しています。DenoとNode.jsの差はそれほど大きくありませんが、Bunは両者を大きく上回っています。この点でNode.jsは遅れを取っているものの、Yagiz Nizipliが、URL解析の速度を約80~90%向上させるなど、Node.jsのさまざまなパフォーマンス改善に取り組んでいます。

次のシナリオでは、独自の環境でBunのパフォーマンステストを実行し、結果を確認できます。

Bunの開発者は速度を重視しており、Safariで使われているJavaScriptCoreを採用しています。一方、DenoとNode.jsはChromeと同じV8 JavaScriptエンジンを使用しています。

Bunは高速に動作するだけでなく、すばやく起動するようにも設計されています。複数のインスタンスを起動する際も、高いパフォーマンスを維持することを目指しています。そのため、動的にスケールするアプリケーションに適しています。トラフィックが急増してインスタンスを迅速に作成する必要がある場合も、サービスをできるだけ早く利用可能にできるよう設計されています。

サポートとコミュニティ

3つのプロジェクトはいずれもオープンソースですが、すべてがコミュニティによって支えられているわけではありません。Node.jsはOpenJS Foundationの支援を受けており、コミュニティとボランティアを中心に運営されています。一方、DenoとBunは営利企業やベンチャーキャピタルの支援を受けています。

Node.jsには確立されたエコシステムと大規模なコミュニティがあり、あらゆる用途に関する情報をオンラインで見つけられます。それに対してDenoとBunは比較的新しく、参考資料はまだ多くありません。それでも、知識を共有しようとする意欲的な開発者は数多くいます。また、Deno 1.28ではnpmパッケージとの互換性が向上し、Node.jsから移行する開発者が導入しやすくなりました。

Stack Overflowで各ランタイムにタグ付けされた質問数を以下に示します(2024年12月時点)。

ランタイム

タグ付きの質問数

Node.js

475028

Deno

1105

Bun

264

JavaScriptランタイムの利用状況を示す棒グラフ:Node.js 27,976、Browser 24,369、Service workers 5,316、Deno 3,344、Bun 1,263、Hermes 884、ChakraCore 113。

毎年、開発者を対象とした「State of JavaScript」という調査が行われています。調査では、回答者が普段どのランタイムを使っているかを尋ねており、約3万人が回答しました。2022年の調査結果でもNode.jsが圧倒的な首位で、Denoは約5,300票、Bunは約1,200票でした。

2024年のState of JavaScriptの調査結果から、Bunが急速に成長してDenoを追い抜き、Node.jsランタイムに次ぐ第2位の選択肢となったことがわかります。

Node.jsの公式ドキュメントには、各種ガイドや充実したAPIリファレンス、始め方に関する情報が掲載されています。依存関係についての情報も確認できます。

Denoのサイトには、ランタイムに慣れ、プロジェクトで活用するための詳細なマニュアルがあります。すぐに使える標準ライブラリに関する情報も掲載されています。

安定性

業界で確立されたNode.jsは、実績のあるパフォーマンスを提供し、世界のWebサイトの2.1%を支えています。2020年5月のバージョン1.0のリリース以降、安定性を保ちながら開発者エクスペリエンスを向上させてきました。そのため、開発者は影響をほとんど、あるいはまったく受けることなく、各リリースにアップグレードできます。

Bunは現在バージョン1.1.42で、数週間おきに新しいリリースが公開されています。機能や修正が追加され、Node.jsコアランタイムとの互換性も向上しています。

セキュリティ

npmの依存関係管理にはセキュリティ上の弱点があり、Node.jsを使ったアプリケーション開発では、一般的なアプリケーションセキュリティの落とし穴にも注意が必要です。Denoが開発された主な理由の1つは、より安全なランタイムを実現することでした。ネットワークリクエストやファイルシステム操作など、機密性の高いAPIや基本機能に対して、きめ細かなアクセス制御を行います。この点ではNode.jsも遅れを取っていません。Node.js 20では権限モデルが導入され、Denoと同様のセキュリティ制御が可能になりました。

よくあるNode.jsのミスやベストプラクティスを開発者が理解することで、安全なNode.jsアプリケーションの構築に役立ちます。

Denoでは、実行中のアプリケーションで特定の操作を行う際に明示的な権限が必要です。これにより、Node.jsに内在するセキュリティ上の懸念を軽減できます。たとえば、アプリケーションがファイルシステムからデータを読み取るには、起動時に--allow-readフラグを指定する必要があります。権限の一覧は権限に関するドキュメントで確認できます。また、実行時にこの権限システムを操作し、プログラムから権限を要求したり、取り消したりすることもできます。--allow-フラグを使う際は、サブプロセスに注意してください。起動したサブプロセスにはDenoプロセスと同じセキュリティ制限が適用されないため、Denoのセキュリティサンドボックスが無効になり、権限昇格につながるおそれがあります。

その他の機能

Node.jsには、DenoやBunの機能に近づけるための機能がいくつか追加されています。現在はテストランナーが組み込まれており、実験的なTypeScriptサポートも含まれています。

Denoには、依存関係の確認ツールとコードフォーマッターが組み込まれています。単一の実行ファイルとしてデプロイできる点も利点です。Denoでサーバーを設定する基本的な方法として、ドキュメントでは外部からコードを取得する方法が紹介されています。Node.jsの場合と比べてコードが特に複雑になるわけではありませんが、依存関係をURL経由で読み込むため、少し違った使い心地に感じるかもしれません。

コードの簡略版を以下に示します。

import { serve } from "https://deno.land/std@0.198.0/http/server.ts";

const handler = async (_request: Request): Promise<Response> => {
  const resp = await fetch("https://api.github.com/users/denoland", {
    // The init object here has an headers object containing a
    // header that indicates what type of response we accept.
    // We're not specifying the method field since by default
    // fetch makes a GET request.
    headers: {
      accept: "application/json",
    },
  });

  return new Response(resp.body, {
    status: resp.status,
    headers: {
      "content-type": "application/json",
    },
  });
};

serve(handler);

Bunには、トランスパイラーやパッケージマネージャーなどの機能もあります。名前からもわかるように、バンドル機能も備えているため、Snowpackやrollup.jsなどの別ツールが必要とする機能を利用できます。また、JavaScriptミニファイアによるデッドコード除去機能もあります。

タスクランナーとしてBunを使う場合、速度が大きな強みになります。Bunの起動時間は約5ミリ秒で、Node.jsの約25ミリ秒より短いとされています。大した差ではないように思えるかもしれませんが、複数のタスクを継続的に実行する場合、開発ワークフローの高速化に大きく貢献する可能性があります。

Bun、Deno、Node.jsのどれを使うべきか?

速度ではBunが明らかに優れていますが、Node.jsとの互換性は現在も改善中のため、本番環境で使うにはリスクがあります。他の2つと同等の安定性を実現できるでしょうか。可能性はあります。いずれにしても、速度で競合を上回り、業界に変化を起こしたいなら、(多くのシナリオで)Bunがその機会を提供してくれます。

Node.jsの大きな強みは、その成熟度とエコシステムの規模です。Node.jsに詳しい開発者が数多くいます。一方で、DenoやBunは新しい技術であり、開発者の関心を集めています。

DenoにもNode.jsに勝る多くの利点があります。豊富な機能によって開発がスムーズになり、高品質な複雑なプロジェクトを簡単に構築できます。安全性も高く、Node.jsより高速ですが、Bunと比べるとやや遅くなります。

総合的に見ると、実績のあるNode.jsが依然として最も安心できる選択肢です。Denoは最新の機能を備えており、新しいものを作りたい開発者に適しています。そして、速度を最重視する場合や、最先端のテクノロジーをいち早く使いたい場合には、Bunが有力な選択肢となります。

Snykが開発者体験を最優先

開発者体験がなぜ重要なのか、Snykの最新機能が開発者体験をいかにスムーズにするのかをご紹介します。

カテゴリー:

続きを読む

Blog

Stadium Summer:Snyk Connect Fan Zone Tour

SnykのFan Zone Tourでは、8都市と3回のオンラインセッションで、AIセキュリティのワークショップやネットワーキング、楽しい競技を開催しました。参加者はスキルを磨き、アイデアを共有し、共に成長しました。

Blog

Snyk VulnBench JS 1.0:LLMは同じバグを2回見つけられるか?

Snyk VulnBench JS 1.0:300回の反復スキャンで、LLMのセキュリティ検出結果は実行ごとに異なる一方、SASTとモデルはそれぞれ異なる脆弱性の見落としを検出することが明らかに。

feature insights context
Blog

お客様と築くAIセキュリティ:Evoのデザインパートナープログラムから得た5つの教訓

SnykのEvoデザインパートナープログラムから得た5つの重要な教訓をご紹介します。AIの検出、リスクインテリジェンス、ポリシーの自動化によって、チームが生成AIを保護し、拡大するAI利用を大規模に統制する方法をご覧ください。