Blog

Deno、Bun、Node.js: JavaScript/TypeScriptランタイムの比較

この記事は、ニフティグループ Advent Calendar 2024 11日目の記事です。

こんにちは!

今回は、JavaScriptとTypeScriptの三大ランタイム環境であるDeno、Bun、Node.jsについて比較していこうと思います。

概要

  • Node.js: 2009年に登場した最も成熟したJavaScriptランタイム
  • Deno: 2018年にNode.jsの創始者によって開発された、より安全でモダンなランタイム
  • Bun: 2022年に登場した高速で全機能を備えたJavaScript/TypeScriptランタイム

主な特徴

Node.js

  • 広大なエコシステムと豊富なnpmパッケージ
  • 長年の実績と安定性
  • 非同期I/Oに最適化

Deno

  • セキュリティ重視(デフォルトで安全)
  • TypeScriptのネイティブサポート
  • URLベースのモジュールインポート

Bun

  • 高速な起動とランタイム実行
  • Node.jsとの高い互換性
  • 内蔵のパッケージマネージャとバンドラー

比較

  • パフォーマンス比較簡単なベンチマークとして、各ランタイムで1から1000万までの数を数える処理の実行時間を比較してみましょう。

Node.js

  • Homebrewや公式サイト(https://nodejs.org/en)などでインストールする
  • benchmark.jsというテストファイルを作成する。
  • 実行する
  • 実行結果

Deno

  • Homebrewなどでインストールする
  • benchmark.jsというテストファイルを作成する。
  • 実行する
  • 実行結果

Bun

  • Homebrewなどでインストールする
  • benchmark.jsというテストファイルを作成する。
  • 実行する
  • 実行結果

結果

すべてほぼ同等のパフォーマンスを示しています。

HTTPサーバー作成

今度は各ランタイムで簡単なHTTPサーバーを作成してみます。

Node.js

  • server.jsというファイルを作成します。
  • 実行
  • TypeScriptファイルを試してみる
    • server.tsを作成する
    • 実行
      • 実行するとエラー
    • TypeScriptをネイティブサポートしていないことが分かります。

Deno

  • server.tsというファイルを作成します。
    • DenoはTypeScriptをネイティブサポートしています。
  • 実行

    Denoはセキュリティを重視しているため、ファイルアクセスやネットワークアクセスにはパーミッションが必要です。

    例えば、ファイル読み書きの場合は以下のようにします。

Bun

  • server.tsというファイルを作成します。
    • BunはTypeScriptをネイティブサポートしています。
  • 実行

DenoとBunの比較

1. モジュールのインポート:   

  • Deno: 外部モジュールをURLから直接インポートします。
  • Bun: 組み込みのグローバル Bun オブジェクトを使用し、追加のインポートは不要です。

2. サーバーの設定:   

  • Deno: serve 関数を使用し、ハンドラー関数と設定オブジェクトを渡します。
  • Bun: Bun.serve メソッドを使用し、設定オブジェクトを渡します。

3. リクエストハンドラー:  

  • Deno: 独立した関数として定義します。
  • Bun: 設定オブジェクト内の fetch メソッドとして定義します。

比較ポイント

上記の比較結果では、各ランタイムの HTTP サーバー実装の違いがありました。

以下に、主要な比較ポイントをまとめました。

1. TypeScript サポート:

  • Node.js: 追加のツール (ts-node) とタイプ定義 (@types/node) が必要。
  • Deno: ネイティブサポート。
  • Bun: ネイティブサポート。

2. セキュリティモデル:

  • Node.js: デフォルトですべてのシステムリソースにアクセス可能。
  • Deno: 明示的な権限付与が必要(--allow-netフラグ)。
  • Bun: Node.js 互換のモデルを採用(デフォルトでアクセス可能)。

3. API設計:

  • Node.js: 標準的な http モジュールを使用。
  • Deno: モダンな Web 標準に基づいた API。
  • Bun: シンプルなオブジェクトベースの API。

4. モジュールシステム:

  • Node.js: ES Modules (import 構文) を使用。
  • Deno: ES Modules と URL ベースのインポートを使用。
  • Bun: 組み込みの Bun オブジェクトを使用。

5. 実行の簡単さ:

  • Node.js: TypeScript を直接実行するには追加のセットアップが必要。
  • Deno: 追加のセットアップなしで TypeScript を直接実行可能。
  • Bun: 追加のセットアップなしで TypeScript を直接実行可能。

結論

結論として、Node.js、Deno、Bunの3つのランタイムは、それぞれ独自の強みを持ち、JavaScriptエコシステムの多様化と進化に大きく貢献しています。

また、これらのランタイムは急速に進化を続けているため、定期的に最新の動向をチェックし、必要に応じて選択を見直すことをお勧めします。

本ブログが、読者の皆様のプロジェクト選択や技術的な意思決定の一助となれば幸いです。

より詳細な情報や具体的な使用例については、各ランタイムの公式ドキュメントを参照することをお勧めします。

明日は、Tsan0409さんの記事です。お楽しみに。

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!