Bun + Vite を試してみる
はじめに
先日、Bun 1.0 がリリースされました🎉
これまで Bun の動向を追えていなかったのですが、ドキュメントを眺めていたところ、Bun + Vite でビルドする方法が記載されていたので試してみました。
また、Yarn + Vite で作成したプロジェクトとの比較もします。
試した環境
- Bun v1.0.1
- Node.js v20.5.1
- Vite v4.4.9
先に結論
install | dev(初回) | dev(2回目) | build | |
---|---|---|---|---|
Bun | 3.99s | 546ms | 126ms | 385ms |
Yarn | 19.14s | 174ms | 117ms | 1.11s |
Yarn + Vite のプロジェクトと比較すると、依存ライブラリのインストールとビルドは速くなるものの、開発サーバーの起動は遅くなるという結果になりました。特にインストールは約5倍速くなりました。
Bun + Vite の環境構築
Bun + Vite のテンプレートを使用する
bun create vite sample-app
を実行して使用するライブラリなどを選択していきます。
今回は React + TypeScript + SWC の構成にしました。
$ bun create vite sample-app
✔ Select a framework: › React
✔ Select a variant: › TypeScript + SWC
Scaffolding project in ...
Done. Now run:
cd sample-app
bun install
bun run dev
package.json の npm scripts の部分は下記のようになっていました。
{
...
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
},
...
}
依存ライブラリのインストール
bun install
を実行することでインストールできます。
インストールにかかった時間は 3.99s でした。
$ bun install
bun install v1.0.1 (31aec4eb)
+ @types/react@18.2.21
+ @types/react-dom@18.2.7
+ @typescript-eslint/eslint-plugin@6.7.0
+ @typescript-eslint/parser@6.7.0
+ @vitejs/plugin-react-swc@3.3.2
+ eslint@8.49.0
+ eslint-plugin-react-hooks@4.6.0
+ eslint-plugin-react-refresh@0.4.3
+ typescript@5.2.2
+ vite@4.4.9
+ react@18.2.0
+ react-dom@18.2.0
153 packages installed [3.99s]
bun install
を実行すると、npm や yarn の時と同様にロックファイルが作られますが、Bun の場合はバイナリ形式になっています。これにより、ロックファイルの読み書きの速度が向上するようです。
In a word: Performance. Bun’s lockfile saves & loads incredibly quickly, and saves a lot more data than what is typically inside lockfiles.
とはいえ、依存関係を確認したい時などにロックファイルを確認したいことがあると思います。
その場合、bun install -y
を実行することで、yarn.lock ファイル (v1 互換) を生成できます。
$ bun install -y
bun install v1.0.1 (31aec4eb)
Checked 153 installs across 184 packages (no changes) [18.00ms]
開発サーバーの起動
bun dev
を実行することで、開発サーバーを起動できます。
初回の開発サーバーの起動にかかった時間は 546ms でした。
$ bun dev
$ vite
VITE v4.4.9 ready in 546 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h to show help
2回目の開発サーバーの起動にかかった時間は 126ms でした。理由は把握できていないのですが、初回より大幅に短くなっていますね。
$ bun dev
$ vite
VITE v4.4.9 ready in 126 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h to show help
ビルドする
bun run build
を実行することでビルドできます。
ビルドにかかった時間は 385ms でした。
$ bun run build
$ tsc && vite build
vite v4.4.9 building for production...
✓ 34 modules transformed.
dist/index.html 0.46 kB │ gzip: 0.30 kB
dist/assets/react-35ef61ed.svg 4.13 kB │ gzip: 2.14 kB
dist/assets/index-d526a0c5.css 1.42 kB │ gzip: 0.74 kB
dist/assets/index-c7e05d32.js 143.41 kB │ gzip: 46.11 kB
✓ built in 385ms
Yarn + Vite と比較してみる
ここからは Bun + Vite のプロジェクトと比較してみます。
Yarn + Viteのプロジェクトで計測
テンプレートを使って環境構築
bun との比較が目的なので、同じ構成にしています。
$ yarn create vite temp-project
yarn create v1.22.19
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
success Installed "create-vite@4.4.1" with binaries:
- create-vite
- cva
✔ Select a framework: › React
✔ Select a variant: › TypeScript + SWC
Scaffolding project in /Users/hinokeita/sandbox/vite/temp-project...
Done. Now run:
cd temp-project
yarn
yarn dev
✨ Done in 3.08s.
依存ライブラリのインストール
yarn install
にかかった時間は 19.14s でした。
$ yarn install
yarn install v1.22.19
info No lockfile found.
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
success Saved lockfile.
✨ Done in 19.14s.
開発サーバーの起動
初回の開発サーバーの起動にかかった時間は 174ms でした。
$ yarn dev
yarn run v1.22.19
$ vite
VITE v4.4.9 ready in 174 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h to show help
2回目の開発サーバーの起動にかかった時間は 117ms でした。初回と比べると少しだけ短くなっています。
$ yarn dev
yarn run v1.22.19
$ vite
VITE v4.4.9 ready in 117 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h to show help
ビルドする
ビルドにかかった時間は 1.11s でした。
$ yarn build
yarn run v1.22.19
$ tsc && vite build
vite v4.4.9 building for production...
✓ 34 modules transformed.
dist/index.html 0.46 kB │ gzip: 0.30 kB
dist/assets/react-35ef61ed.svg 4.13 kB │ gzip: 2.14 kB
dist/assets/index-d526a0c5.css 1.42 kB │ gzip: 0.74 kB
dist/assets/index-c7e05d32.js 143.41 kB │ gzip: 46.11 kB
✓ built in 377ms
✨ Done in 1.11s.
インストールにかかる時間を比較
install | |
---|---|
Bun | 3.99s |
Yarn | 19.14s |
Yarn のプロジェクトと比較すると、約5倍速くなりました。
差が 16s なので、体感でもかなり違いました。
開発サーバーの起動にかかる時間を比較
dev(初回) | dev(2回目) | |
---|---|---|
Bun | 546ms | 126ms |
Yarn | 174ms | 117ms |
Yarn のプロジェクトと比較すると、初回の起動は約3倍遅くなりました。
とはいえ、2回目以降はほとんど同じくらいになったので、個人的にはあまり気にしなくて良さそうに感じました。
ビルドにかかる時間を比較
build | |
---|---|
Bun | 385ms |
Yarn | 1.11s |
Yarn のプロジェクトと比較すると、3倍速くなりました。
全体を比較
install | dev(初回) | dev(2回目) | build | |
---|---|---|---|---|
Bun | 3.99s | 546ms | 126ms | 385ms |
Yarn | 19.14s | 174ms | 117ms | 1.11s |
最終的にはこのような結果になりました。
Yarn + Vite のプロジェクトと比較すると、インストールとビルドにかかる時間は速くなるものの、開発サーバーの起動は遅くなりました。
おわりに
今回は Bun + Vite を試すのと、Yarn + Vite のプロジェクトとの比較をしました。
特にインストールにかかる時間を大幅に短縮できそうなので、CI 辺りから Bun に置き換えるのを試してみたくなりました。
Discussion