最近、Bunについてよく目にするので、ちょっと調べてみたときの備忘録(*´ω`*)
Bun.shとは?
Develop, test, run, and bundle JavaScript & TypeScript projects—all with Bun.
Bun is an all-in-one JavaScript runtime & toolkit designed for speed, complete with a bundler, test runner, and Node.js-compatible package manager.
公式サイトだとこんな感じに書いてる。
- Node.js互換の新しいJavaScriptのランタイム
- Node.js / Denoの仲間
- いろいろできるAll in One
- Node.js+npm+jest+esbuildみたいな感じ
- めちゃめちゃ爆速
- Node.jsの数倍のパフォーマンス
ドキュメントのトップページを見てみると、こんな感じに書かれている。
At its core is the_Bun runtime_, a fast JavaScript runtime designed as a drop-in replacement for Node.js. It's written in Zig and powered by JavaScriptCore under the hood, dramatically reducing startup times and memory usage.
Node.jsを置き換えを目指しているっぽい。
コマンドもnpm -> bun
にすればそのまま使える様になってるよう。
$ bun run start # run the `start` script $ bun install <pkg> # install a package $ bun build ./index.tsx # bundle a project for browsers $ bun test # run tests $ bunx cowsay "Hello, world!" # execute a package
また、TypeScriptとかももそのまま実行でき、
.env
などもサポート。Workspace機能もあるのでもモノレポもOK。
Roadmap
Roadmapのページをみてみると、linterやformatterについては書かれていないが、
issueの方を見てみると、提案されているのでいずれはいるかもしれない。
ただ、fnmのようなNode.jsのversion managerは提案もなさそう。。?
なぜはやいのか?
なんでこんな速度の差があるのかを調べてみた。
- Bunファーストインプレッション - JavaScriptランタイム界に”赤壁の戦い”を! ~TechFeed Experts Night#8講演より | gihyo.jp
- なんでbun installは速いのか?
主には、この4つっぽい。
- Zigで実装+マルチスレッドで処理
- エンジンがV8ではなくJavaScriptCore
- lockfileがバイナリ
- キャッシュをうまく活用
このあたりはかなりいろいろ盛り込まれているよう。
「Rustを試したけど借用チェッカーが難しい」など試行錯誤があり、Zigを採用いる感じっぽい。
BunがZigを使ってる理由。11:00~
— azu (@azu_re) September 17, 2023
Rustの借用チェッカーがむずかった、Zigにはcomptimeがあるので最適化しやすかった。
JSCは組み込みの型を遅延初期化するのでV8より起動が早い。 "SFNode Meetup: Bun with Jarred Sumner - YouTube" https://t.co/4AyVkRD9Rr #Bun #zig
Node.jsの互換性について
Node.jsのAPIを再実装している形のため、
APIごとに対応状況が異なっている感じ。
対応されているのも多いが、利用するパッケージによっては、
未対応のAPIを使っている場合もあるので、注意が必要。
ベンチマークについて
公式サイトのトップページにもベンチマークがあるが、
Native APIを使ったシンプルな例なので、実際のところが気になる。
いろんな人が試しているようで、多くの場合は高速なよう。
- シンプルなWebサーバで速度/CPU/メモリを比較
- Express版: Node.js vs Deno vs Bun: Express hello world server benchmarking | Tech Tonic
- NativeAPI版: Node.js vs Deno vs Bun: Native HTTP hello world server benchmarking | Tech Tonic
- Fastify版: Node.js vs Deno vs Bun: Fastify hello world server benchmarking | Tech Tonic
- Node.js v20.6.0 / Deno 1.36.4 / Bun v1.0.1でのFastifyを使った比較。bombardierを利用
- NativeAPI/ExpressではBun、FastifyではNode.jsが一番性能がよいという結果
- Bun + Vite を試してみる
- Bun vs Yarn。install/buildはやいが、devは遅くなったとのこと
互換性と関連するかもしれないけど、
FW(フレームワーク)やパッケージによっては、
まだBunのフルパワーを活かせないかもしれない。
ほかにもいろんなフレームワーク+Runtimeで比較したリポジトリもあるので、
使っているフレームワークだとどうなのか見てみるといいかも。
- SaltyAom/bun-http-framework-benchmark: Compare throughput benchmark from various Bun HTTP framework
- Benchmarks - Hono
- "bun benchmark"で検索 | Repository search results
なかでも、HonoはBunサポートを謳っているらしいので、
相性は一番いいかもしれない。
HonoはBunサポートを「謳った」初めてのWebフレームワークです。
引用: BunとHono
以上!! 手は動かさず、ざっとさらっただけだけど、
完全に理解したレベルにはなれた気がする(*´ω`*)
爆速は魅力なので、すこしずつ試していきたい。。(*´ω`*)
参考記事
- Bun — A fast all-in-one JavaScript runtime
- Bunファーストインプレッション - JavaScriptランタイム界に”赤壁の戦い”を! ~TechFeed Experts Night#8講演より | gihyo.jp
- なんでbun installは速いのか?
- Bun + Vite を試してみる
- Node.js vs Deno vs Bun: Fastify hello world server benchmarking | Tech Tonic
- Node.js vs Deno vs Bun: Express hello world server benchmarking | Tech Tonic
- Node.js vs Deno vs Bun: Native HTTP hello world server benchmarking | Tech Tonic
- SaltyAom/bun-http-framework-benchmark: Compare throughput benchmark from various Bun HTTP framework
- Benchmarks - Hono
- BunとHono
- Hono - Ultrafast web framework for the Edges
- codesenberg/bombardier: Fast cross-platform HTTP benchmarking tool written in Go
- Load testing for engineering teams | Grafana k6