Node.jsから乗り換え？JavaScriptランタイム「Bun」触ってみた

この記事は [ハンズラボ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/handslab) 9日目の記事です。

# Bunとは

JavascriptランタイムにはNode.jsやDenoがある中、最近[Bun](https://bun.sh/)が注目を浴びている…？！ということで気になったので触ってみます。

元々Jarred Sumnerさんがほぼ個人で開発されていたようですが（すごい）、2022年8月に[Oven社](https://oven.sh/)として起業しました。

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に対応する予定](https://www.publickey1.jp/blog/22/deno3npmjavascripthttp.html)みたい。

## とにかく速い

[公式サイト](https://bun.sh/)や[Twitter](https://twitter.com/jarredsumner)でも速さをめちゃアピールしています。

[公式](https://github.com/oven-sh/bun#using-bun-as-a-package-manager)より引用した、色々なツールでのパッケージインストール時間を比較した画像です。
![147004342-571b6123-17a9-49a2-8bfd-dcfc5204047e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989266/c330e12f-be34-63e9-32c2-8a4b5daddd11.png)
Linux環境の場合なんとnpmより20倍〜100倍速いらしいです。

[公式のHTTPサーバーの処理比較](https://github.com/oven-sh/bun#bunserve---fast-http-server)ですが

| Requests per second	 | Runtime |
|-----------------------------|-------------|
| ~64,000                         | 	Node 16 |
| ~160,000                        | 	Bun     |


BunはNode.jsよりも1秒あたり約2.5倍のリクエストを処理しています。

WebSocketも速い！
Linux x64上でチャットルーム（たぶんLINEみたいなやつ）をつくった場合の[公式比較](https://github.com/oven-sh/bun#websockets-with-bunserve)です。

| Messages sent per second	| Runtime |	Clients |
|------------------------------|-----------------------|---------------|
| ~700,000                     | ( Bun.serve) Bun v0.2.1 (x64)	|16 |
| ~100,000                     | ( ws) ノード v18.10.0 (x64)	| 16      |


ただ、[こちら](https://zenn.dev/k41531/articles/dbedb88f06898a#speed)で検証されているように、必ずしもBunが最速ではなさそうです。

なぜBunは速いのか？というと

JavaScriptエンジンはWebKitやSafariと同じ`JavaScriptCore`を採用していて、ChromeやNode.jsなどで使用されているV8より少し速く起動する傾向があること、
[Zig](https://ziglang.org/)というコンパイラ言語で実装されていて、メモリに対する低レベルの制御などの実現により、高いパフォーマンスになるみたい。

# 実際に触ってみよう

## 環境構築

mac OS Monterey 12.6（Intel）にインストールします。

```bash
brew tap oven-sh/bun
brew install bun
```

## 動かしてみる

```javascript:http.ts
export default {
  port: 3000,
  fetch(request: Request) {
    return new Response("Hello World");
  },
};
```

アプリケーションを起動します。

```bash
bun ./http.ts
```

`http://localhost:3000/`をブラウザで開くと

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989266/ff6a1bf6-55c5-19f2-64bd-0b4003860c75.png)

TypeScript動いた！

## Next.jsプロジェクトを作ってみる

```bash
bun create next ./app
cd app
bun dev
```

![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989266/2ef811d8-7961-e856-367c-aa18b990d88d.png)

なんと6秒でプロジェクトが作成できて、起動も一瞬でした。Linux環境だともっと速いのかな。

## ~~簡単なAPIを作ってみる~~

Express.jsのようなAPIを作りたいところでしたが、[こちら](https://betterprogramming.pub/write-a-express-like-api-using-bunjs-79e77a6a7a31)を拝見して決して簡単ではなさそうだったので今回は諦めました。

# おわりに

社内でNode.jsはサイクルが速すぎて置き換えたい！という話がちらほらと出ているので
それを上回るNode.jsに替わるものはないかなと思い、今回Bunを触ってみました。

Node.js or Deno or Bunのどれかを会社として導入するなら
まだBunには不安要素も多いので（ベータ版ですし）Node.jsかDenoになりそうですが、パフォーマンスの高さは飛び抜けていそうだな〜と思ったので今後の活動が楽しみです。

# 参考

- [Bun公式](https://bun.sh/)    
- [Github](https://github.com/oven-sh/bun)
- [Node.jsを過去の物にする最速の肉まん](https://qiita.com/shadowTanaka/items/5fb99819629dcaab3e05)
- [速くてAll in OneなJavaScriptランタイム 「Bun」](https://dev.classmethod.jp/articles/bun/)
- [【Bun】新しいJavaScriptランタイムについてふわっとまとめた](https://zenn.dev/k41531/articles/dbedb88f06898a)
- [JavaScriptランタイム「Bun」が約9億円を調達、「Oven」社を設立。ホスティングやCIサービスなど計画](https://www.publickey1.jp/blog/22/javascriptbun9ovenci.html)