Bun をNode.jsの代わりに使い始めたら、スクリプト実行がかなり速くなった話

Node.js の代替として Bun を使い始めたところ、パッケージインストールと TypeScript の実行速度がかなり改善され、個人開発の作業効率が上がりました。

🙌 結論から

個人プロジェクトのスクリプト実行環境を Bun に切り替えたところ、パッケージインストールと TypeScript の実行速度がかなり速くなり、体感できるレベルで待ち時間が減りました!

Node.js + tsx でやっていたことが bun コマンド1本でできるようになったのが、本当に助かっています(^^)

まだ本番環境では様子見ですが、開発時の体験はかなりよくなりました。

💡 Bun とはなにか

Bun は、JavaScript/TypeScript のランタイム・バンドラー・パッケージマネージャー・テストランナーを1つに統合したツールです。

Node.js の代替として設計されており、npm / yarn / pnpm の代わりにも使えます

Node.js との互換性も高く、多くの npm パッケージがそのまま動きます。公式サイトによると npm より最大 25 倍速いパッケージインストールができるとのことで、実際に動かしてみると確かにかなり速かったです(`・ω・´)

TypeScript を標準でサポートしており、tsxts-node を別途インストールしなくても .ts ファイルをそのまま実行できるのも便利なポイントです。

👀 試してみた

インストールは1コマンドです。

curl -fsSL https://bun.sh/install | bash

TypeScript ファイルをそのまま実行できます。

bun run script.ts

パッケージのインストールも npm と同じ感覚で使えます。

bun install
bun add express
bun remove lodash

package.json のスクリプトも bun run で実行できます。

bun run dev
bun run build

既存の Node.js プロジェクトに入れるときは、まず bun install をかけるだけで多くの場合は動きます!

以前 node_modules/.bin/tsx に依存していた部分も bun に置き換えるだけで動くことが多く、移行コストは思ったより低かったです(^_^)

✨ 使ってみた感想

パッケージインストールの速さは本当にびっくりしました。

node_modules を消して npm install すると1〜2分かかっていたプロジェクトが、bun install なら10〜20秒程度で終わります(^o^)/

TypeScript をそのまま実行できるのも便利で、tsx watch でやっていた開発サーバーの起動も bun --watch script.ts に置き換えられました。

ただ、Node.js の特定の API に依存している部分や、ネイティブモジュールを使っているパッケージでは、まれに互換性の問題が出ることもありました(・_・;)

本番環境での採用はプロジェクトの依存関係を確認してからの方が安全だと思いますが、個人開発やスクリプト実行には迷わずおすすめできます。

🗄 標準搭載のSQLiteとS3クライアントも試した

ランタイムの速さに満足していたんですが、しばらく触っているうちに意外と便利な標準ライブラリが増えていることに気づきました。

まず驚いたのが bun:sqlite です。

Node.js だと better-sqlite3 のようなネイティブパッケージを別途インストールする必要がありますが、Bun は SQLite のバインディングを最初から持っています。

import { Database } from 'bun:sqlite'

const db = new Database('mydb.sqlite')
const users = db.query('SELECT * FROM users WHERE id = ?').get(1)

追加の依存パッケージがゼロで、bun add すら不要で動くのが気持ちいいです(・∀・)

もうひとつ試したのが Bun.S3Client です。

S3互換のオブジェクトストレージへのファイル読み書きが、Bunのファイル操作と同じ感覚のAPIで扱えます。

const file = Bun.s3('my-bucket/report.csv')
await file.write(csvData)
const text = await file.text()

個人開発でちょっとした画像アップロード機能を作ったとき、aws-sdk を入れずにこれだけで済んだのはかなり身軽でした!

Node.js との互換性も年々上がっていて、私が確認した範囲では主要な Node コアモジュール(fspathstream など)はほぼそのまま動く印象です。

「ランタイムを速くするツール」だと思って入れたら、いつの間にかちょっとしたバックエンドAPIまで書ける道具になっていて、良い意味で期待を裏切られました(^^)

パパ系Webエンジニア〜愛用ガジェット一覧 🛍️

この記事を書いている作業環境のガジェットを楽天ROOMにまとめています ✨ 在宅エンジニアのデスク作りの参考にどうぞ 🙌

👍 まとめ

Bun は、ランタイム・パッケージマネージャー・TypeScript 実行環境をひとまとめにした高速な開発ツールです。

特に「パッケージインストールを速くしたい」「TypeScript をトランスパイルなしで実行したい」という場面では、かなり効果を実感できます🙌

まず個人プロジェクトのスクリプト実行から試してみるのが、負担なく始められておすすめです!

※ Bun の機能やNode.js互換性は今も急ピッチで更新されています。最新情報は Bun公式ドキュメント をご確認ください👀