この記事は ハンズラボ Advent Calendar 2022 9日目の記事です。
Bunとは
JavascriptランタイムにはNode.jsやDenoがある中、最近Bunが注目を浴びている…?!ということで気になったので触ってみます。
元々Jarred Sumnerさんがほぼ個人で開発されていたようですが(すごい)、2022年8月にOven社として起業しました。
Bunとはざっくりいうと、高速でJavascript開発に必要なものが全て揃っているオールインワンなJavascriptランタイムです。
Node.jsにないもの、あります
Node.jsでは必要だったものがBunにははじめから備わっています。
- TypeScript & JSXからJavaScriptへトランスパイル
- tscやBabelがいらない
- JavaScript & CSSのバンドル化
- webpackもいらない
- npmと互換性を持つパッケージマネージャー
- npmと同じような感じでpackage.jsonが使える
- npmと比べてインストールがとても速い
- タスクランナー
- npmと同じような感じで使える
- npmと比べてクライアント起動がとても速い
このあたりはDenoと被る部分もありますね。
余談ですが、Denoも今後npmに対応する予定みたい。
とにかく速い
公式サイトやTwitterでも速さをめちゃアピールしています。
公式より引用した、色々なツールでのパッケージインストール時間を比較した画像です。
Linux環境の場合なんとnpmより20倍〜100倍速いらしいです。
Requests per second | Runtime |
---|---|
~64,000 | Node 16 |
~160,000 | Bun |
BunはNode.jsよりも1秒あたり約2.5倍のリクエストを処理しています。
WebSocketも速い!
Linux x64上でチャットルーム(たぶんLINEみたいなやつ)をつくった場合の公式比較です。
Messages sent per second | Runtime | Clients |
---|---|---|
~700,000 | ( Bun.serve) Bun v0.2.1 (x64) | 16 |
~100,000 | ( ws) ノード v18.10.0 (x64) | 16 |
ただ、こちらで検証されているように、必ずしもBunが最速ではなさそうです。
なぜBunは速いのか?というと
JavaScriptエンジンはWebKitやSafariと同じJavaScriptCore
を採用していて、ChromeやNode.jsなどで使用されているV8より少し速く起動する傾向があること、
Zigというコンパイラ言語で実装されていて、メモリに対する低レベルの制御などの実現により、高いパフォーマンスになるみたい。
実際に触ってみよう
環境構築
mac OS Monterey 12.6(Intel)にインストールします。
brew tap oven-sh/bun
brew install bun
動かしてみる
export default {
port: 3000,
fetch(request: Request) {
return new Response("Hello World");
},
};
アプリケーションを起動します。
bun ./http.ts
http://localhost:3000/
をブラウザで開くと
TypeScript動いた!
Next.jsプロジェクトを作ってみる
bun create next ./app
cd app
bun dev
なんと6秒でプロジェクトが作成できて、起動も一瞬でした。Linux環境だともっと速いのかな。
簡単なAPIを作ってみる
Express.jsのようなAPIを作りたいところでしたが、こちらを拝見して決して簡単ではなさそうだったので今回は諦めました。
おわりに
社内でNode.jsはサイクルが速すぎて置き換えたい!という話がちらほらと出ているので
それを上回るNode.jsに替わるものはないかなと思い、今回Bunを触ってみました。
Node.js or Deno or Bunのどれかを会社として導入するなら
まだBunには不安要素も多いので(ベータ版ですし)Node.jsかDenoになりそうですが、パフォーマンスの高さは飛び抜けていそうだな〜と思ったので今後の活動が楽しみです。