久々に気晴らしで簡単な個人用ツールを作ってみました(公開はしません)。

このツールの作成時にbunを利用してみることにしました。

bunはNodeを使うよりクロスプラットフォームへのシングルバイナリの出力が便利です。 具体的に言うと--compileオプションの使用すると単一バイナリが吐けます。ランタイムは最適化してない状態でそこそこあるので(私のツールは100MB以上あるみたい)ファイルサイズを気にする場合は注意。ただ、zipなどへの圧縮効率は良いです。

また、スクリプトを書くのも結構便利です。$という関数でそのまんまシェルスクリプトを実行できるようになっていて、かなり直感的にサクサクと書けます。

なによりそのまんまTypescriptで書けてトップレベルawait使えるのも体感的には良いですね。外部パッケージのインストールもかなり早いです。

以下に例を示します。 ちなみにwindowsだけ--minify --bytecodeを吐かないようにしているのですが、これは現状v1.1.36時点でバグるっぽい感じになっている為。そこだけ注意。

import { $ } from "bun";

const appName = "myapp";
const platforms = [
  {
    os: "linux",
    arch: "x64",
  },
  {
    os: "windows",
    arch: "x64",
  },
  {
    os: "darwin",
    arch: "arm64",
  },
];

for (const platform of platforms) {
  const isWindows = platform.os.includes("windows");
  const ext = isWindows ? ".exe" : "";
  const target = `bun-${platform.os}-${platform.arch}`;

  const extraOpts = isWindows ? "" : `--minify --bytecode`;
  await $`bun build --compile ${extraOpts} --target=${target} src/index.ts --outfile build/${platform.os}_${platform.arch}/${appName}${ext}`;
  await $`cd build && zip -r ${appName}_${platform.os}_${platform.arch}.zip ${platform.os}_${platform.arch}`;
  await $`rm -rf build/${platform.os}_${platform.arch}`;
}

恐らくなんですが、Webアプリなどの開発や作成は依然としてNodeが優位性を占めていると思います。例えばSPAやクラサバやりたい場合はNodeランタイムで流した方が移植性・安定性ともに圧倒的有利です。Nodeの場合ESM・CJS問題が色濃く(Bunの場合その辺り柔軟性があるような解釈の仕方をしているらしい)、私はこれがJavascriptの嫌なところだと思うんですが、それをもってしても安定して動きますからね。
Bunが活きてくるのはnpm資産を用いながら低レベルのライブラリとFFI連携をしたりだとか、上記のようにコマンドラインツールを作るようなケース、または変数マシマシの複雑なシェルスクリプトを手っ取り早く出来るようにしたい場合だと使ってて思いました。なんせnpmは他言語と比べてもニッチな目的とかでも誰かしら変わり種のパッケージ作ってたりとか、結構ありますからね。ファイルサイズ犠牲で工数優先で作るとか、そういう用途にはなかなかおすすめだし、DOM取得用途などにはjavascriptの言語優位性が結構あります。
ローカルハードのモバイルコンピューティングをしたい場合なんかには結構応用の視野が出てくるようなランタイムかもしれないと思いますね。