
2026/02/09 2:39
Bun バージョン 1.3.9
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
Bunの最新リリースでは、ランタイム、ツールチェーン、およびAPI表面に新機能・パフォーマンス向上・バグ修正が追加されました。主な変更点は以下の通りです。
- スクリプト実行:
とbun run --parallel
は、複数のbun run --sequential
スクリプトを並列または順次に実行できるようになりました。ワークスペースとフィルタオプションもサポートしています。package.json
フラグは、一つのスクリプトが失敗してもすべてのスクリプトを継続します。--no-exit-on-error
は、要求されたスクリプトが存在しないパッケージをスキップします。--if-present - 出力フォーマット: 各スクリプトの出力行は、色付きでパディングされたラベル(スクリプト名と、フィルタやワークスペース使用時にはパッケージ名)で接頭辞されます。
- HTTP/2アップグレード処理: Net.Server → Http2SecureServer の接続アップグレードパターンが正しく動作し、http2-wrapper や crawlee などのライブラリが生の TCP 接続を HTTP/2 サーバへ転送できるようになりました。
- モック破棄:
とmock()
はspyOn()
を実装し、[Symbol.dispose]
キーワードでオブジェクトがスコープ外になると自動的にモックを復元します。using - プロキシ処理:
環境変数は、NO_PROXY
やfetch()
に明示的なプロキシオプションが渡されても尊重されます。WebSocket() - CPU プロファイリング:
フラグで CPU プロファイルのサンプリング間隔(マイクロ秒)を設定できます(デフォルトは 1000 µs)。--cpu-prof-interval - ESM バイトコードコンパイル:
の ESM バイトコードサポートが有効になりました。明示的にフォーマットを指定しない場合は CommonJS がデフォルトです。--compileUsing --bytecode --format=esm - ARMv8.0 修正: Linux aarch64 CPU での誤ったアトミック命令によるクラッシュが解消され、Bun は ARMv8.0 を正しくターゲットします。
- Markdown & 正規表現高速化: Markdown のレンダリング(
とBun.Markdown
)は SIMD でスキャンし、キャッシュされた HTML タグ文字列を使用することで 3–15 % の速度向上を実現します。JavaScriptCore の RegExp エンジンは SIMD アクセラレーテッドプレフィックス検索と固定数括弧 JIT を採用し、正規表現パターンで最大約4倍のスピードアップが可能です。Bun.markdown.react() - その他のバグ修正 & API 改良: Node.js 互換性の更新(例:Windows 上での
)、WebSocket の binaryType 処理、HTTP プロキシリクエストハング修正、チャンク付きエンコーディングパーサーのセキュリティパッチ、および Bun.build ターゲット用 TypeScript 型の更新などが含まれます。existsSync('.')
これらの改善は、以前のリリースで残っていた並列処理不足、HTTP/2 サポート制限、モック破棄欠如といったギャップを埋め、セキュリティと Node.js 互換性を強化します。開発者や企業にとって、このアップデートはビルド速度の向上、ランタイムコストの低減、テストコードのクリーンさ、そして多様な環境でのネットワーク信頼性向上を意味します。
本文
Bunのインストール
curl -fsSL https://bun.sh/install | bash
またはPowerShell:
irm bun.sh/install.ps1 | iex
Docker:
docker run --rm --init --ulimit memlock=-1:-1 oven/bun
Bunのアップグレード
bun run --parallel bun run --sequential
package.json 内の複数スクリプトを並列または順次で実行し、Foreman 風にプレフィックス付きで出力します。--filter と --workspaces を併用するとワークスペース全体に渡ってスクリプトを走らせることも可能です。
例
| コマンド | 説明 |
|---|---|
| 現在の から build と test を同時に実行。 |
| build と test を順次、プレフィックス付きで実行。 |
| グロブマッチしたスクリプト名を並列実行。 |
| ワークスペース内のすべてのパッケージで build を同時に実行。 |
| すべてのワークスペースパッケージで build を順次実行。 |
| 複数スクリプトを全パッケージで並列実行。 |
| 1 パッケージが失敗しても残りは継続。 |
| スクリプトが無いパッケージはスキップ。 |
出力の各行は色付きでラベル付きです:
build | compiling... test | running suite... lint | checking files...
--filter や --workspaces を使うと、ラベルにパッケージ名も付加されます:
pkg-a:build | compiling... pkg-b:build | compiling...
はすべてのスクリプトを即時開始し、インターリーブされたプレフィックス付き出力を行います。--parallel
は順番に1つずつ実行します。--sequential- デフォルトでは失敗したら残りは停止しますが、
で継続可能です。--no-exit-on-error
prebuild, postbuild 等の前後スクリプトは自動的にグループ化され、各グループ内で正しい依存順序で実行されます。
--filter
と bun --filter="pkg" <script>
の違い
--filterbun --filter="pkg" <script>bun --filter="pkg" <script>
- 依存関係を尊重し、スクリプトはその依存先が完了してから開始します。
- 長時間実行されるウォッチスクリプトに有効です。
と--parallel
は依存順序を考慮しません。--sequential
net.Server
を使った HTTP/2 接続アップグレード
net.Servernet.Server → Http2SecureServer の接続アップグレードパターンが正しく動作するようになりました。これにより、http2-wrapper, crawlee などのライブラリや独自 HTTP/2 プロキシサーバーで原始 TCP 接続を転送できるようになります。
import { createServer } from "node:net"; import { createSecureServer } from "node:http2"; import { readFileSync } from "node:fs"; const h2Server = createSecureServer({ key: readFileSync("key.pem"), cert: readFileSync("cert.pem"), }); h2Server.on("stream", (stream, headers) => { stream.respond({ ":status": 200 }); stream.end("Hello over HTTP/2!"); }); const netServer = createServer((rawSocket) => { h2Server.emit("connection", rawSocket); }); netServer.listen(8443);
Symbol.dispose
によるモックサポート
Symbol.disposemock() と spyOn() が Symbol.dispose を実装したため、using キーワードでスコープを抜けた際に自動的にモックが復元されます。
import { spyOn, expect, test } from "bun:test"; test("auto-restores spy", () => { const obj = { method: () => "original" }; { using spy = spyOn(obj, "method").mockReturnValue("mocked"); expect(obj.method()).toBe("mocked"); } // `spy` がスコープを抜けたときに自動復元 expect(obj.method()).toBe("original"); });
import { mock } from "bun:test"; const fn = mock(() => "original"); fn(); expect(fn).toHaveBeenCalledTimes(1); fn[Symbol.dispose](); // fn.mockRestore() と同等 expect(fn).toHaveBeenCalledTimes(0);
NO_PROXY
を明示的なプロキシオプションで尊重
NO_PROXY以前は
http_proxy/HTTP_PROXY から自動検出されたときのみ NO_PROXY が機能していました。現在は、明示的に
proxy オプションを指定した場合でも常に NO_PROXY をチェックします。
// NO_PROXY=localhost await fetch("http://localhost:3000/api", { proxy: "http://my-proxy:8080" }); // プロキシが正しくバイパスされます。
WebSocket も同様です。
CPUプロファイラ
Bun は Node.js と同等の
--cpu-prof-interval フラグをサポートします。デフォルトは 1000 µs (1 ms) です。
bun --cpu-prof --cpu-prof-interval 500 index.js # 500 µs 毎にサンプリング
--cpu-prof や --cpu-prof-md を指定しないと警告が出ます。
ESM バイトコードコンパイル
が利用可能になりました。--compileUsing --bytecode --format=esm- 形式を明示しなければデフォルトは CommonJS(将来のバージョンでは ESM に変更されるかもしれません)。
ARM64 対応修正
- Cortex‑A53、Raspberry Pi 4、AWS a1 等の古い ARM64 CPU で発生していたクラッシュを解消。
- Linux aarch64 では ARMv8.0 をターゲットにし、ランタイムディスパッチ用にアウトラインアトミックを使用。
Markdown レンダリング性能向上
は HTML エスケープ(Bun.Markdown
,&
,<
,>
)のため SIMD で高速化。"
→ 3–15 % のレンダリング速度アップ。
内で頻繁に使われる HTML タグ文字列をキャッシュ。Bun.markdown.react()
→ 文字オブジェクト数が 40 % 削減、ヒープ使用量が 6 % 減少。
AbortSignal 最適化
AbortSignal.abort() はリスナーが無い場合にイベントオブジェクトの生成とディスパッチを省略。約 16 ms / 1M 呼び出し の高速化(≈6 %)を実現。
JavaScriptCore 強化
- SIMD 加速された正規表現前方検索 (ARM64/TBL2, x86_64/PTEST)。
- 新しい定数マテリアライズプリミティブ (
など)。move128ToVector - 固定カウントの括弧は JIT コンパイル対象となり、約 3.9× のスピードアップ。
文字列 & コレクション最適化
| 機能 | 改善 |
|---|---|
| 1.42×高速(定数フォールディングで 5.76×) |
, | イントリニシックで 2–3×高速化 |
| 10–17 % 改善 |
| DFG/FTL でイントリニシックとして認識 |
| ロープを使用し、急激コピーを回避 |
Node.js 互換性修正
,.
のホワイトスペース処理、Function.prototype.toString()
のクラッシュ解消。node:http2
がタイ語/ラオ語の間隔付き母音を正しく報告。Bun.stringWidth- WebSocket クライアントで
を使用した際のクラッシュ修正。binaryType="blob" - HTTP プロキシがハングする問題解消。
- チャンクエンコーディングパーサーにおけるリクエストスモグリングのセキュリティ修正。
TypeScript 定義更新
に SIMD バリアントを追加。Bun.Build.CompileTarget
とbun-linux-x64-baseline
ターゲットを追加。bun-linux-x64-modern
の型をSocket.reload()
に修正。{ socket: handler }