Chapter 04

Node.jsとDenoとBunの比較

k4nd4
k4nd4
2024.12.17に更新

Node.js、Deno、Bunの3つを、いろいろな項目で比較してみます。

比較項目 Node.js Deno Bun
TypeScript コンパイラのインストールが必要 ネイティブ対応 ネイティブ対応
速度 低速 普通 高速
モジュールシステム npm 独自 npmを踏襲
npmパッケージ 対応 対応 対応
Node API 対応 一部対応 一部対応
.envファイル dotenvが必要 ネイティブ対応 ネイティブ対応
テスト テストフレームワークが必要 標準搭載 標準搭載
linterやformatter 追加で必要 標準搭載 追加で必要
バンドラ 非搭載 標準搭載 標準搭載

※独自機能などの詳細はそれぞれの記事を参照してください。

DenoとBunのどちらも、単なるランタイムとしての機能だけでなく、テストやバンドラといった周辺ツールも搭載していることが特徴です。
また、既存のnpmパッケージもサポートしており、Node.jsからのマイグレーションの敷居もある程度低いと言えるでしょう。

Denoが向いているユースケース

Denoは、セキュリティをデフォルトで有効にした設計や、TypeScriptの標準サポート、独自のモジュールシステムを持つことが特徴です。
従来のNode.jsエコシステムから離れ、軽量で安全性の高い環境を求める場合や、依存関係を最小限に抑えた新規プロジェクトに向いています。
また、モジュール管理がURLベースである点や標準でテスト機能、linter、formatterが搭載されている点から、シンプルで最新の開発体験を重視するプロジェクトにも向いています。

Bunが向いているユースケース

BunのインターフェースはNode.jsの使用感に近しくなっています。
テストツールもJest記法をそのまま使える、パッケージのバージョン管理をpackage.jsonで行うなどの従来のNode.jsプロジェクトとの共通点も多いため、マイグレーションの難易度を低くしたい場合に向いています。
大きな変更を加えなくても、パッケージインストールの速度向上などの恩恵を受けることができます。

ビルド時間の比較

いくつかのソースコードを用意し、Node.js・Deno・Bunを使ったビルド時間を比較します。

検証条件

  • ソースコードは、以下の3種類とする
    • ZA: Nuxt 3を使用。ソースコード行数は194916行。
    • ZS: Nuxt 3を使用。ソースコード行数は46030行。
    • RA: Nextを使用。ソースコード行数は31187行。
  • ZAとZSはマシンAで、RAはマシンBで計測する
  • \time {ビルドコマンド}の出力を利用するものとする

コマンド

  • ZA, ZSのビルドコマンドはnuxt build --dotenv .env.productionである
  • RAのビルドコマンドはnext buildである
  • ビルドコマンドはnpm scriptsで"build"に設定している
    • Node.jsで実行する場合は、npm run buildとする
    • Bunで実行する場合は、--bunオプションをつけ、bun run --bun buildとする
    • Denoで実行する場合、以下の二通りで行う
      • npm:なし:そのままdeno task buildとする
      • npm:あり:deno run -A npm:nuxt build ...のようにnpm:をつけたscriptに修正した上でdeno task buildとする

結果

timeコマンドのうち、realの値を記載しています。

ランタイム ZA ZS RA
Bun 18.90 35.20 1m42.50
Deno 17.22 33.79 1m29.89
Node 20.30 41.85 1m55.280

DenoおよびBunのどちらを使っても、おおむねNode.jsよりもビルド速度が速くなることが確認できます。