2月9日、Bun v1.3.9がリリースされた」。この記事では、開発ワークフローの簡素化や最新の言語仕様の取り込み、ならびに実行エンジンの深層にわたる最適化について詳しく紹介されている。
以下に、開発者が特に注目すべき変更点を中心に内容をまとめる。
外部ツール不要:フラグ一つで複数スクリプトの並列・直列実行が可能に
従来、package.json内のスクリプトを複数同時に走らせるにはconcurrentlyなどの外部パッケージが必要であったが、Bun単体でこれが完結するようになった。
- **
--parallelと--sequential**:bun run --parallel dev testのように記述するだけで、並列または順次実行が可能。 - 視認性の高いログ出力: 各プロセスの出力に色分けされたラベル(パッケージ名など)が自動付与されるため、ログの混濁を防ぐことができる。
- 依存関係を無視した即時実行:
--filterによる依存順の実行とは異なり、順序を待たずに即座に全プロセスを起動させる運用にも対応している。
# 全ワークスペースの build を順次実行
bun run --sequential --workspaces build
# プレフィックス付き出力のイメージ
pkg-a:build | compiling...
pkg-b:build | compiling...
最新仕様をいち早く統合:using キーワードによるテストモックの自動クリーンアップ
TypeScript 5.2で導入された「明示的リソース管理(Explicit Resource Management)」をテスト環境にいち早く取り込んだ。mock() および spyOn() が Symbol.dispose を実装したことで、手動のクリーンアップが不要となる。
- 記述の安全性向上:
using変数として宣言されたモックは、スコープを抜けた際に自動でmockRestore()が呼ばれる。これにより、テスト間でのモック汚染(クリーンアップ忘れによる副作用)を言語レベルで防止できる。
test("auto-restores spy", () => {
const obj = { method: () => "original" };
{
// スコープを抜けると自動復元
using spy = spyOn(obj, "method").mockReturnValue("mocked");
expect(obj.method()).toBe("mocked");
}
expect(obj.method()).toBe("original");
});
内部エンジンの深層最適化:SIMD活用とJIT intrinsicsによる基礎速度の向上
JavaScriptエンジン(JavaScriptCore)のアップデートにより、低レイヤーでのパフォーマンス改善が図られている。
- 正規表現のSIMD加速: V8と同様の手法を用い、ARM64/x86_64の両環境でSIMD命令による並列スキャンを導入。特定のパターンマッチングが大幅に高速化された。
- 主要メソッドのJIT Intrinsics化:
Set#sizeやMap#size(約2.2〜2.7倍)、String#startsWith(最大5.7倍)など、頻繁に使用されるプロパティやメソッドがJITコンパイラ内で最適化され、実行オーバーヘッドが削減されている。
ネットワーク・互換性の堅牢化
開発環境と本番環境の差異を埋めるための修正も行われた。
NO_PROXY設定の厳格な適用: 明示的にプロキシを渡した場合でも環境変数のNO_PROXYが優先されるようになり、ローカル開発時などの誤転送を防ぐ。- ARM64環境の安定性向上: ARMv8.0アーキテクチャ(Raspberry Pi 4やAWS a1インスタンス等)における命令セットの互換性問題が修正され、動作の安定性が向上した。
詳細は「Bun v1.3.9 Bun Blog」を参照していただきたい。