Node.jsを過去の物にする最速の肉まん

# その名はBun

ﾃﾞﾃﾞﾝ
![Screen Shot 2022-07-08 at 10.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656202/f2d3c457-a1f8-bb54-45a3-635407693939.png)

[Bun](https://bun.sh/)はNode.jsやDenoのようなJavascriptランタイムです。(2022/7/8現在ベータ版)


ちなみにロゴが本当に肉まんなのかはわかりません。（赤ちゃんの頭にも見えるけど名前がBun/パンだしなぁ...)

この記事ではNode.jsやDenoと比較をしつつ、bunの解説させていただきます。

# 割となんでもできる
Bunはただのランタイムではありません。下のように、開発に必須の多くな機能を最初から有しています。

- TypescriptからJavascriptへのトランスパイル
- jsxからJavascriptへのトランスパイル
- npmのようなパッケージのインストール&管理
- webpackのようなプロジェクトのバンドル化

もちろんランタイムなのでNode.jsのようにサーバーでJavascriptを実行することも可能です。

これらに加えてBunには様々な機能があります。ただ多すぎて解説しきれないので、ここで挙げた機能のみを少し掘り下げていきます。


## TypescriptからJavascriptへのトランスパイル

Bunは`.ts`ファイルを渡せば勝手にトランスパイルして実行してくれます。Denoと同じですね。
これによってTypescriptをインストールする必要もありませんし、`tsconfig.json`も必要ありません。
もちろん意図的にconfigを書き換えたい場合は`tsconfig.json`を用意すれば、Bunはちゃんと読み込んでくれます。
これに加えて、Bunはnode_modules内の`.ts`ファイルも勝手にトランスパイルしてくれます。

## jsxからJavascriptへのトランスパイル

なんとbunはjsxもトランスパイルしてくれます。Babelが必要なくなりますね。

## npmのようなパッケージのインストール&管理
Bunはnpmのようなパッケージインストーラーとしても使用できます。
いつも通り`node_modules`と`package.json`で管理ができます。
そしてなんといってもインストールがめちゃくちゃ早いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656202/aaf2c6ca-9f49-c39f-7ce6-1dfe3302070d.png)
[公式ドキュメントより引用したこの画像](https://github.com/Jarred-Sumner/bun#using-bun-as-a-package-manager)は、様々なインストーラーとのパッケージのインストール時間を比較した結果です。

わかりやすく書きますと、

| npm | yarn | pnpm | bun |
|:-:|:-:|:-:|:-:|
| 約5.653s  |  約4.356s | 約2.335s  |  約225.6ms |

とのことです。

一人だけ単位が違うやつがいますね...。単純計算でnpmよりもなんと25倍も早いです。npmでパッケージをインストールする時は「ローディングアニメーションかっけー！」などと思っていましたが、bunではそんな感想を抱く暇もなくインストールが完了してしまいます。

ちなみに、`bun run <スクリプト名>`のように`package.json`で設定されたスクリプトを実行することも可能です。

## webpackのようなプロジェクトのバンドル化
```terminal
bun bun index.js
```
と実行すると、`index.js`が依存している全てのモジュールを`node_modules.bun`というファイルにまとめてくれます。(`index.js`そのものは含まれません)

`node_modules.bun`には

-　パッケージのソースコード
-　ソースコードのメタデータ
-　プロジェクトののメタデータ＆設定

が含まれているそうです。

```terminal 
bun node_modules.bun
```

と実行すると、中身のソースコードを見ることができます。

以下のコマンドでそのソースコードを実際の`.js`ファイルに書き出せます。

```terminal
./node_modules.bun > node_modules.js
```

## その他便利な機能

- トップレベルでの`async/wait`
- Built inのWeb API(`fetch`や`WebSocket`など)
- `Bun.write`のような高速ファイルシステムAPI
- `node:fs`や`node:path`のようなNode.jsのコアモジュールのサポート
- ほぼ全てのNode-APIのサポート
- `.env`ファイルの自動読み込み(`dotenv`不必要)

# bunのメリット

ぶっちゃけbunは特別新しいことができるものではありません。どちらかと言うと既存のものをより高速に、効率よく使えるようになるものです。

[公式サイト](https://bun.sh/)に掲載されているベンチマークを見てみましょう。

ReactでのSSR
![Screen Shot 2022-07-08 at 14.50.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656202/71c9c1e0-19c2-7194-5e95-ed59891ccb86.png)

sqliteからの読み込み
![Screen Shot 2022-07-08 at 14.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656202/74585326-f6e9-8c7d-1986-c6bbfd82014a.png)

ffiの実行
![Screen Shot 2022-07-08 at 14.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656202/360487b9-8c70-1c16-c797-f8b675cd6957.png)

見ての通り、引くほどパフォーマンスがいいです。

## 高いパフォーマンスの理由

bunはWebkitのJavaScriptCoreというエンジンと、Zigという言語で書かれているのでパフォーマンスがいいらしいです。

# おわりに
Bunはざっくり言うと
「npmやbabel、Webpackなど開発に必要なツールがランタイムと一緒にまとまっていて、なおかつパフォーマンスが高いJSランタイム」です。

まだ2022/7/6にベータ版が公開されたばかりですが、~~遠くない将来にNode.jsを置き換えるものになると思っています。~~ ちゃんと成熟すればNode.jsを置き換えるものになるポテンシャルを秘めていると思います。

2022/7/11追記
ここまでbunを持ち上げっぱなしでしたが、デメリットを指摘したコメントを頂いたので紹介させていただきます。
https://qiita.com/shadowTanaka/items/5fb99819629dcaab3e05#comment-e639c7d6131b167358bc