これまでサーバーサイドで使えるJavaScriptの実行環境と言えばNode.js一択でした。しかし、最近Bunという高速な実行環境が登場し話題になっています。しかも個人プロジェクトがベンチャーキャピタルより約10億円を調達し会社を設立しました。これまで、Node.jsに代わる環境はDenoだと言われていましたが、Bunの登場で勢力図が変わりそうです。そこで、Bunを実際に使ってみましょう。
Bunとは何か?
一言で言うと、Bunは高速なJavaScriptの実行環境です。さまざまな面でNode.jsよりも高速であることを強調しています。次の画像はBunの公式サイトに掲載されているベンチマークです。これは1秒間にサーバーサイドのReactレンダリングを何回実行できるのかを調べたものです。Node.js(表ではnode)がこの分野のデファクトであり、Denoが将来的にNode.jsを置き換える可能性があると言われていましたが、BunはNode.jsやDenoに圧倒的な性能差をつけて勝利しています。その性能差はなんとNode.jsの3倍です。この比較は非常にインパクトがあります。
Bunは本当にNode.jsよりも速いのか?
とは言え、Bunは本当に速いのでしょうか。上記のベンチマークはBunが公開しているもので、たまたま得意な分野を掲載している可能性もあります。そこで、汎用的なJavaScriptのコードがどのくらい速くなるのか確かめてみましょう。
Bunのトップページにあるベンチマークは、サーバーサイドReactのレンダリングですが、この処理はさまざまな技術が絡み合う可能性があるため、ここでは、より単純なコードでJavaScriptの実行効率自体のベンチマークを取ってみます。
参考までに、以下のような簡単なフィボナッチ数列の計算をBunとNode.jsで実行比較してみました。主に関数の再帰処理を行うコードです。
const fib = (n) => {
if (n < 2) { return n; }
return fib(n - 1) + fib(n - 2);
}
console.log(fib(43))
これをBunとNode.jsとDenoで実行して時間を計算してみます。この結果を見ると、BunがNode.jsの1.8倍速いことが分かります。もちろん、実務ではストレージやネットワークのIO処理に時間がかかるため、単純な計算だけで一概にBunが有利は言えませんが、単純に実行速度が速いというのは大きなインパクトです。
ランタイム | 経過秒数 |
---|---|
Bun (v0.1.11) | 2.22s |
Deno (v1.25.2) | 3.92s |
Node.js (v18.9) | 3.99s |
なお、BunはゼロからJavaScriptの言語を実装しているわけではありません。Node.jsがChromeに搭載されているV8エンジンを利用しているのと同様に、BunはSafariに搭載されているJavaScriptCoreを利用しています。そのため、搭載JavaScriptエンジンの違いがBunとNode.jsの大きな違いとも言えます。
ちなみに、Bun開発者のJarred Summer氏は開発言語としてZigを採用しておりメモリ管理に至るまで徹底に高速化していると述べています。なお、Zigとは2015年に登場した新しい言語で、C言語の置き換えを目標に開発されているコンパイラ言語です。(こちらが参考になります。)
npmにある膨大なコード資産を活用できる
ところで、Node.jsは2009年に開発された環境であり、Node.jsには13年の間に積み重ねた豊富なコード資産があります。その最たるものがnpmと呼ばれるNode.jsのパッケージレジストリです。npmには膨大なオープンソースのパッケージが登録されており、多くの開発者がnpmで公開されているライブラリを利用してアプリを開発しています。
そのため、例えBunの実行速度がNode.jsのほぼ倍になったとしても、開発者はコード資産が豊富なNode.jsを選ぶケースが多いはずで「ぽっと出のBunに勝てるはずがない」と思うかもしれません。(Bunは本稿執筆時点でバージョンもまだv0.1.11です。)
しかし、Bunがすごいのは、そうしたNode.jsの資産をそのまま使えるように配慮している点です。Bunにはnpm互換のパッケージマネージャーの機能が備わっており、npmにあるライブラリをそのままBunでも使うことができます。現状、全てのライブラリが利用できるわけではありませんが、多くのライブラリをそのまま利用できると明言されています。
ちなみに、Bun人気に刺激されたのか、これまで一貫してnpmをサポートしないと名言していた、もう一つのJavaScript実行環境のDenoが方針を一転させ、npmをサポートすると発表しました。
その他の機能について
そして、BunはJavaScriptだけでなく、Web開発でよく使われるTypeScriptやJSXがそのまま実行できる仕組みがあります。また、タスクランナーの機能もあります。そして、複数のJavaScriptファイルの依存関係を保ったまま1つにまとめるバンドル機能も備えています。
Bunのインストール
Bunをインストールするには、ターミナル上で以下のコマンドを実行します。macOS、Linux、WSL(Windows Subsytem for Linux)上で動作します。なお、原稿執筆時点では、Windowsネイティブのサポートはありませんが、ロードマップにはWindowsのサポートも載せられています。
curl https://bun.sh/install | bash
コマンドを実行すると、以下のように表示されることでしょう。
Manually add the directory to ~/.bashrc (or similar):
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
WSLやUbuntuなどでシェルにBashを使っている場合は「~/.bashrc」に「export ...」の2行を追加して、コマンド「source ~/.bashrc」を実行しましょう。 macOSなどでZshを使っている場合は「~/.zshrc」に追加して、コマンド「source ~/.zshrc」を実行しましょう。
基本的にBunはコマンドラインから利用します。以下のようにタイプすると、Bunの使い方が表示されます。
bun help
次のような画面が表示されます。
Bunで簡単なプログラムを実行
簡単なJavaScriptのプログラムを実行してみましょう。先ほど紹介したフィボナッチの計算のプログラムを「fib.js」という名前で保存します。そして、このプログラムを実行するには、ターミナルで次のように実行します。
bun run fib.js
なお、「bun run ファイル名」を「bun ファイル名」のように書くこともできます。上記のコマンドを実行すると、次のようにプログラムの実行結果が表示されます。Bunのトップページによると「bun run」のコマンドは、Node.jsのnpmでプログラムを実行する「npm run」に比べて30倍も速いそうです。