このチャプターの目次
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
とする
-
- Node.jsで実行する場合は、
結果
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よりもビルド速度が速くなることが確認できます。