JavaScriptは世界で最も人気を集め、広く採用されているプログラミング言語のひとつ。ウェブアプリケーション、モバイルアプリ、デスクトップアプリ、組み込み機器に至るまで、あらゆる分野でその性能を発揮しています。とはいえ、そんなJavaScriptも決して完璧というわけではなく、他の技術と同様、パフォーマンス、互換性、セキュリティ、複雑さといった課題に取り組んでいます。

このような課題に対処するため、JavaScriptのランタイムが長年にわたって開発されています。Node.jsDenoはその中でも際立った存在で、どちらもJavaScriptの機能を補完するソリューションとして広く使用されています。このように様々な問題が解消されていますが、その一方で不要なパッケージの必要性やランタイムのパフォーマンス低下など、新たな問題も生じています。

今回ご紹介するBunは、Node.jsに代わる直接的かつ効率的なランタイムとして開発され、2023年9月に安定版がリリースされました。

以下、主な機能とJavaScriptプロジェクトに組み込む方法について掘り下げていきます。

Bunとは

Bun.shのトップページ
Bun.shのトップページ

Bunは、主にZigプログラミング言語で書かれたJavaScriptランタイムです。Node.jsの制限に対処しながら、より合理的かつ効率的な開発体験を提供することを目的に開発されています。

JavaScriptとTypeScriptを使用した開発に革命を起こすために誕生したオールインワンツールとして登場し、長年にわたってリリースされてきた他のJavaScriptランタイムとは一線を画します。AppleのSafariを駆動するエンジンであるJavaScriptCoreを拡張することで、少ないメモリで高速な起動が可能になります。

Node.jsとは異なり、Bunはnpmに依存せず、動作に外部依存を必要としません。代わりに標準ライブラリが組み込まれており、環境変数、HTTP、WebSocket、ファイルシステムなど、多様なプロトコルやモジュールに対応する機能を揃えています。

また、TypeScriptにもデフォルトで対応。BunはすべてのJavaScriptやTypeScriptのソースファイルを内部的にトランスパイルするため、追加の設定やトランスパイルなしに、TypeScriptファイルを直接コンパイルして実行します。

強力なコマンドラインインターフェース(CLI)ツールも付属しており、以下の簡単なコマンドを使用して、runformatlinttest͏bundleすることができます。

  • bun run─JavaScriptまたはTypeScriptファイルを実行
  • bun test─組み込みテストフレームワークでユニットテストを実行
  • bun fmt─組み込みフォーマッターでコードを整形
  • bun lint─組み込みリンターでコードをリント(静的解析処理)
  • bun bundle─組み込みバンドラーでコードをバンドル

注目に値するもう一つの機能は、ホットリロードで、アプリケーションの状態を保持しながら、コードの変更をその場でリフレッシュすることができます。これはNode.jsの制限を劇的に改善するもので、Node.jsではnodemon--watchのような外部パッケージが必要になるのに対し、Bunは--hotのみで実行できます。

技術的な優位性だけでなく、Bunの開発と改良に積極的に貢献するユーザーコミュニティの成長も強みです。活動的なコミュニティにより、定期的にBunの更新と対応が行われており、学習とトラブルシューティングに役立つ豊富なリソースも利用できます。

Bunの主な機能

Bunには、ホットリロード、TypeScript対応、高速な起動に加え、その人気の理由であり、パフォーマンス改善に役立つバンドラー、テストランナー、パッケージマネージャーのような機能もあります。以下、それぞれご紹介します。

バンドラー

バンドラーは、JavaScriptのコードとその依存関係を1つのファイルに統合し、ブラウザやNode.jsアプリケーション内での読み込み効率を最適化します。Node.jsにはバンドラーが内蔵されていないため、JavaScriptコードを扱う際にはRollup、Webpack、͏Parcelのようなサードパーティのバンドラーに依存しなければなりません。

Bunには、必要最小限の設定で様々なモジュール形式をサポートするバンドラーが組み込まれており、さらに、より高速なバンドルに対応するための最適化も。そのパフォーマンスは群を抜いており、esbuildの1.75倍、Parcelの150倍、Rollup + Terserの180倍、Webpackの220倍高速に動作します。

bun bundle ͏<source> --out-dir <directory>コマンドでプロジェクトをバンドルすることができ、指定した出力ディレクトリに出力ファイルが生成されます。

Bunでプロジェクトをバンドル
Bunでプロジェクトをバンドル

テストランナー

ソフトウェア開発においてテストは必須。テストによってコードの機能性を保証し、稼働前に潜在的な問題を特定することができます。Bunには、テストランナーが組み込まれています。

Node.jsを使用する場合は、Jestのような外部のテストフレームワークを採用するのが通例ですが、これは強力で柔軟である反面、プロジェクトにさらなる依存関係と設定の負荷をかけることになります。

Bunは独自のテストランナーを統合して、スピードと互換性を重視。これには以下のようなメリットがあります。

  • スピード:テストランナーがランタイムに組み込まれているため、外部テストフレームワークを読み込む負荷なしにテストを実行できる。その結果、テストの実行が高速化され、大規模なコードベースや継続的インテグレーション環境では特に有益。
  • 互換性:組み込みのテストランナーは、Bunの他の機能とシームレスに動作する。これにより、高速な起動と効率的なメモリ使用量を活かして、本番環境を模倣した環境でテストを確実に実行できる。
  • シンプルさ:組み込みのテストランナーでは、ランタイムとテストフレームワークの設定や互換性の維持について心配する必要がなく、同じ言語機能とAPIを使用して、アプリケーションコードと同様にテストを記述できる。

Bunのテストランナーは、さまざまなテストフレームワークと互換性があり、bun testコマンドを実行するだけでテストを行うことができます。

さらに、TypeScriptとJSXをデフォルトでサポートしているため、余計な設定や͏プラグインは不要です。テスト環境のセットアップに費やす時間を、テストの記述に充てることができます。

パッケージマネージャー

BunのNode.js向けパッケージマネージャーは、npm、yarn、pnpmよりも圧倒的に高速です。さらにディスク使用量を削減し、メモリフットプリントを最小限に抑えます。

BunチームによるBun、pnpm、npm、Yarnのベンチマーク
Bun開発チームによるBun、pnpm、npm、Yarnのベンチマーク

シンボリックリンク(ソフトリンク)を採用することで、各プロジェクトのパッケージを一元化された場所にリンクし、後続のプロジェクトでモジュールを再ダウンロードする必要が無くなります。パッケージマネージャーでのシンボリックリンクの使用は一般的ですが、Bunの実装は他を圧倒しています。

Bunの使用方法

Bunを使い始めるには、まずはインストールから。インストール方法は、cURLコマンド、npm、Homebrewなど様々ですが、BunはmacOSまたはLinuxシステムで使用するのが最善です。

cURLコマンドを使ってインストールする場合は、ターミナルで以下を実行します。

curl -fsSL https://bun.sh/install | bash

インストールが完了したら、ターミナルでbun --versionを実行し、Bunが使用できる状態になったことを確認します。

これで、Bunを使い始める準備が整いました。bun runコマンドでNode.jsプロジェクトを実行できます。index.tsという名前のTypeScriptファイルを実行するには、bun run index.tsを実行しますが、BunはTypeScriptファイルをトランスパイルするため、追加のパッケージは不要です。

Bunのユーティリティはこれだけにとどまらず、ReactNext.jsなどのJavaScriptフレームワークともシームレスに統合できます。Bunの機能に関するさらなる詳細は、公式ドキュメントをご覧ください。

BunでNode.jsプロジェクトを実行する

Bunでは、CLIコマンドを使用してNode.jsプロジェクトの移行や実行を簡単に行うことができます。以下の手順に従ってください。

  1. まずは、Bunをインストールします。インストール後、Node.jsプロジェクトのファイル(package.jsonファイルを含む)があるディレクトリに移動し、プロジェクトの作業ディレクトリ内で以下のコマンドを実行します。
    bun install

    このコマンドにより、Node.jsプロジェクトのディレクトリにあるpackage.jsonファイルが読み込まれ、lock.jsonファイル(存在する場合)を確認し、ビルトインパッケージマネージャを使ってリストされた依存関係がインストールされます。

    Bunで依存関係をインストール
    Bunで依存関係をインストール

  2. 依存関係がインストールされたら、プロジェクトを実行します。bun runコマンドの後に、プロジェクトのエントリポイントファイルを続けます。
    bun run 

    例えば、プロジェクトのエントリポイントが ͏index.jsであれば、bun run index.͏jsとなります。

    指定されたファイル内のJavaScriptまたはTypeScriptコードが実行されます。プロジェクトのpackage.jsonファイルに開始スクリプトが定義されている場合は、bun startを使ってプロジェクトを実行することも可能です。

    Visual Studio CodeでBunプロジェクトを実行
    Visual Studio CodeでBunプロジェクトを実行

新たなランタイム環境に移行すると、問題が生じることがありますが、BunのNode.jsモジュールに対する堅牢なサポート、グローバル変数の認識、およびNode.jsモジュール解決アルゴリズムへの準拠によって、Node.jsからBunへの移行プロセスが簡素化されます。

例えば、環境変数の管理にdotenvパッケージを利用しているNode.jsプロジェクトを抱えている場合、Bunには.envファイルを自動的に読み込む機能が組み込まれているため、dotenvパッケージが不要です。そのため、dotenvパッケージとその初期化コードをプロジェクトから安全に削除できます。

なお、Bunはまだ開発中のランタイムであるため、移管作業は慎重に行ってください。

KinstaのアプリケーションホスティングとBunを統合する

Kinstaのアプリケーションホスティング͏では、プロジェクトのビルドにNixpacksを使用して、Bunアプリをシームレスにホストできます。

Nixpacksは、Buildpacks同様、リポジトリに基づいてアプリケーションのコンテナイメージを作成するために設計されたオープンソースプロジェクトです。Nixバイナリを活用し、アプリケーションのビルド、依存関係のインストール、デプロイ時の環境設定を行います。

Rustベースのアーキテクチャによってビルド時間が短縮でき、さらにBuildpacksよりも優れたキャッシュシステムを内蔵していることから、初回ビルド後の後続ビルドが大幅に高速になります。

コンテナイメージの管理および開発プロセスを効率化するための柔軟なソリューションをお客様に提供するため、最先端技術へのコミットメントとして、KinstaではNixpacksに対応しています。

BunプロジェクトをKinstaのアプリケーションホスティングにデプロイするには、まず任意のGitサービス(BitbucketGitHub、またはGitLab)にコードをプッシュします。リポジトリが用意できたら、以下の手順に従ってください。

  1. MyKinstaにログイン、またはアカウントを作成する。
  2. GitサービスでKinstaを認証する。
  3. MyKinstaの左サイドバーから「アプリケーション」を選択し「アプリケーションを追加」をクリック。
  4. デプロイするリポジトリとブランチを選択。
  5. アプリケーションに一意の名前を割り当て、データセンターの所在地を選択。
  6. ビルド環境を設定する。推奨のNixpacks、ビルドリソースに「標準ビルドマシン」を選択。
  7. すべてデフォルトの設定を使用して、「アプリケーションを作成する」をクリック。

デプロイには通常数分かかります。完了すると、デプロイ情報およびアプリケーションへのリンクが表示されます。

Kinstaは、アプリケーションに堅牢で信頼性の高いインフラストラクチャを提供しています。ユーザーフレンドリーなインターフェースで、Bunアプリのデプロイも手間要らず。コードをアップロードし、設定を行うだけで、アプリを公開する準備が整います。

まとめ

Bunは、JavaScriptのランタイムとしてその人気を伸ばしています。パフォーマンスとシンプルさを重視し、開発プロセスの合理化と全体的な効率化を目的として設計。また、モジュラーアーキテクチャによって、特定のプロジェクトに必要なコンポーネントだけを選択することができ、不要なオーバーヘッドを削減できます。

Node.jsとは異なり、より軽量なフットプリントと高速な起動が特徴で、迅速な応答時間と効率的なリソース使用が求められるアプリケーションにうってつけです。Bunのシンプルさとモジュラーアプローチは、開発体験のカスタマイズと簡素化に貢献してくれます。

KinstaのアプリケーションホスティングでBunアプリケーションをホストすることで、シームレスで強力なソリューションを手にすることができます。Kinstaの堅牢なインフラストラクチャでは、オートスケーリングやコンテンツの超高速配信などにより、高いパフォーマンスが保証されます。

信頼性に優れ、効率的なホスティングソリューションでBunアプリケーションを運用すれば、プロジェクトの構築と最適化に集中することができます。

Bunを使用されたことはありますか?Node.jsからBunへの移行をお勧めしますか?以下のコメント欄で、Bunにまつわるご意見をぜひお聞かせください。

Joel Olawanle Kinsta

Kinstaでテクニカルエディターとして働くフロントエンド開発者。オープンソースをこよなく愛する講師でもあり、JavaScriptとそのフレームワークを中心に200件以上の技術記事を執筆している。