【Bun】Bun 1.0を軽く素振りしてみる(ランタイム & パッケージマネージャー編)
https://3.bp.blogspot.com/-zUlIwJPHEBk/UgSL_fzo2uI/AAAAAAAAW5c/3YPQL40FuFo/s800/food_chukaman.png
【前提】
(【Bun】Bun 1.0を軽く素振りしてみる(バンドラー編) と 【Bun】Bun 1.0を軽く素振りしてみる(テストランナー編)も参考にしてください)
2023/09/08にBun 1.0がリリースされました。Bunは主としてZigで記載されており、JavaScriptCoreを搭載しているので、起動時間とメモリ使用量を大幅に削減することを目的としており、Node.jsの代理となる高速なJavaScriptランタイムを目指しています。また、Bunの立ち位置は単一ファイルからフルスタックアプリケーションまでをサポートするJavaScriptおよびTypeScriptのランタイムであり、パッケージマネージャーであり、バンドラーであり、テストランナーです。役割がてんこ盛りなオールインワンツールキットです。全てを触って理解するには時間がかかりそうなので、今回は軽く素振りしてみることにします。
【インストール】
BunはLinux版(x64 & arm64)MacOS版(x64 & Applie Silicon)をサポートしています。Windowsでは実験的なネイティブビルドがリリースできるようになっており、JavaScriptランタイムのみ提供予定のようです。Bunの制作者であるJarred Sumnerのポストからもその様子が確認できます。
今回はシンプルにcurlからインストールしてみます。ちなみに検証環境はM2 Macです
code:test.sh
$ curl -fsSL https://bun.sh/install | bash
######################################################################## 100.0%
bun was installed successfully to ~/.bun/bin/bun
Added "~/.bun/bin" to $PATH in "~/.zshrc"
To get started, run:
exec /bin/zsh
bun --help
ちなみにBunは$SHELLを読み込みシェルを自動補完してくれますので、設定ファイルの編集ももシェルに合わせて、実施してくれます。$bun -helpにて出力されるヘルプの一部を見てみます。
code:test.sh
Bun: a fast JavaScript runtime, package manager, bundler and test runner. (1.0.0)
run ./my-script.ts Run JavaScript with Bun, a package.json script, or a bin
test Run unit tests with Bun
x eslint Install and execute a package bin (bunx)
repl Start a REPL session with Bun
init Start an empty Bun project from a blank template
create svelte Create a new project from a template (bun c)
install Install dependencies for a package.json (bun i)
add @zarfjs/zarf Add a dependency to package.json (bun a)
remove webpack Remove a dependency from package.json (bun rm)
update zod Update outdated dependencies & save to package.json
link Link an npm package globally
unlink Globally unlink an npm package
pm More commands for managing packages
build ./a.ts ./b.jsx Bundle TypeScript & JavaScript into a single file
upgrade Get the latest version of Bun
bun --help Show all supported flags and commands
Learn more about Bun: https://bun.sh/docs
Join our Discord community: https://bun.sh/discord
ふむふむ、たしかに「ランタイムであり、パッケージマネージャーであり、バンドラーであり、テストランナーである」ことがわかりますね。
【ランタイムおよびパッケージマネージャーとして利用する】
$ bun initを実行するとプロジェクトのテンプレートを作ってくれます。今回はTypeScriptのプロジェクトを作ってみます。
code:test.sh
$ bun init
bun init helps you get started with a minimal project and tries to guess sensible defaults. Press ^C anytime to quit
package name (new-project): new-project
entry point (index.ts):
Done! A package.json file was saved in the current directory.
+ index.ts
+ .gitignore
+ tsconfig.json (for editor auto-complete)
+ README.md
To get started, run:
bun run index.ts
このとき、bun.lockbと呼ばれるいわゆるロックファイルが作成されていることがわかります。中身はバイナリになっており、保存と読み込み速度の向上および他のロックファイルより多くの情報を保存できることを目的としています。ロックファイルの解析をする場合は$bun install -yarnを実施すると、yarn.lockファイルが作成されて、解析可能な状態を提供してくれます。
この状態で$ bun index.tsを実行してTypeScriptのコードを実行してみます。
code: test.sh
$ bun index.ts
Hello via Bun!
お、動きました。ちなみにnode_modulesを削除して依存パッケージのインストール速度をBunとYarn(1系)で比較してみます
code:bun.sh
$ bun install
bun install v1.0.0 (822a00c4)
+ bun-types@1.0.1
1 packages installed 2.00ms
code:yarn.sh
$ yarn
yarn install v1.22.19
warning package.json: No license field
info No lockfile found.
warning tabun: No license field
1/4 🔍 Resolving packages...
2/4 🚚 Fetching packages...
3/4 🔗 Linking dependencies...
4/4 🔨 Building fresh packages...
success Saved lockfile.
✨ Done in 1.04s.
速い…ですね…
【HTTPサーバーを作ってみる】
BunはシンプルなHTTPサーバー のAPIをビルトインしているので、試しにHTTPサーバーを作ってみます。
code:server.ts
const serve = Bun.serve({
port: 3000,
fetch(req) {
return new Response('Here is tabun!')
}
})
console.log(Check it http://localhost:${serve.port} 🥟)
localhost:3000にアクセスするとレスポンスが確認できます。
ここまでの準備はBunのインストールとパッケージのインストールだけで完了することに加え、
1. パッケージマネージャーのインストールが不要
2. ts-nodeのようなTypeScript用の実行エンジンの用意 or JavaScriptへのトランスパイルが不要
3. パッケージのインストールが信じられない速度で完了する
ので非常にストレスフリーです。楽ちんでいいですね。
【余談】
今回は雑にBunをランタイムおよびパッケージマネージャーとして利用してみました。今後はバンドラーとして、テストランナーとしても検証してみます。検証コードはこちらのリポジトリに公開しています。