プログラミング
Bun 1.4
要約
JavaScript/TypeScript開発ツールであるBunのバージョン1.4がリリースされました。このバージョンでは、Node.jsテストスイートから1,517件のテストを追加し、Node.js互換性を大幅に向上させました。また、2,900件以上のバグ修正、CPU使用率の5倍削減、メモリ使用量の最大35%削減、Linuxでの起動速度50%向上を実現しています。さらに、Bun.Image、Bun.WebView、Bun.markdown、Bun.cron()などの新APIの追加や、Bunの内部実装言語をZigからRustへ移行したことも特徴です。
全文翻訳
Bunは、フルスタックのJavaScriptおよびTypeScriptアプリケーションの構築とテストのための完全なツールキットです。Bunを初めて使用する場合は、Bun 1.0のブログ投稿で詳細を確認できます。
curlpowershellnpmbrewdockercurlcurl -fsSL https://bun.sh/install | bashpowershellpowershell -c "irm bun.sh/install.ps1 | iex"npmnpm install -g bunbrewbrew install oven-sh/bun/bundockerdocker pull oven/bun
Bun 1.4では、Node.jsテストスイートから1,517件のテストが追加され、Bun 1.0以降でNode.js互換性が最も大きく向上しました。Bun v1.4では、2,900件以上の問題も修正されています。アイドル時のCPU使用率を5分の1に削減し、メモリ使用量を最大35%削減し、Linuxでの起動速度を50%向上させました。Bun.Image、Bun.WebView、Bun.markdown、Bun.cron()、Bun.Terminal、bun run --parallel、bun test --parallel、bun audit fix、bun dedupe、bun pruneが追加されました。そして、BunをZigからRustに書き直しました。
この投稿では、Bun 1.3.0以降にリリースされたすべての機能(新しいBun v1.4タグ付き)について説明します。
アップグレードするには:
bun upgrade
Node.js互換性
#BunはNode.jsのドロップイン代替となるように設計されています。すべてのBunコミットで実行されるNode.jsテストスイートから1,517件のテストを追加しました。node:http、node:fs、node:cluster、node:timers、node:zlib、node:vm、node:streamはNode自身のテストの97%をパスしています。node:quicは99%、node:events、node:trace_events、node:sqliteは100%です。
Node.js v26.3.0テストスイート · すべてのコミットでパス
+1,517
新たに追加されたパスしたテスト
▶ play↻ replay▶ playquic235 / 237+235httprewritten403 / 415+193fs349 / 358+133tls191 / 224+106http2rewritten261 / 280+102repl82 / 109+77stream254 / 262+61worker116 / 157+57process160 / 190+45net171 / 191+39https61 / 65+39internal68 / 108+35cluster85 / 88+31trace_events30 / 30+30webcrypto39 / 50+28crypto123 / 135+27vm98 / 101+25webstreams28 / 38+23test_runner28 / 81+21module68 / 93+19diagnostics_channel36 / 69+19sqlite18 / 18+18child_process105 / 116+15inspector22 / 110+14
BunのNodeのテスト/parallelスイートのベンダーコピーでモジュールごとのパス数、Bun 1.3 → 1.4。ティックマークは1.3のベースラインを示します。
Bunはまだ100%Node.js互換ではありません。実際には、既存のJavaScriptエコシステムの多くはそのまま動作します。BunのNode.jsテストスイートの進捗状況は、こちらでより詳しく追跡できます。
Playwright v1.4.0
#PlaywrightはBun上で実行できるようになりました:connectOverCDP()でブラウザを操作し、playwright testとplaywright.config.tsでテストスイートを実行し、--uiで開き、Windows上でChromiumを起動します。
Next.js 16 v1.3.2
#bun --bun next buildは、TurbopackとReact Compilerを備えたNext.js 16.3で動作します。
vitest v1.4.0
#vitestは、スレッドプールとフォークプールを使用して、--coverageを含め、Bun上で実行されます。
OpenTelemetry v1.4.0
#OpenTelemetryのhttpおよびfsインストルメンテーションはスパンをエクスポートし、shimmerおよびrequire-in-the-middleパッチはバンドルされたコードに適用されます。
dd-trace v1.4.0
#dd-traceは継続的にトレースし、@datadog/pprofはプロファイルします。それらがリンクするV8 C++ APIが実装されました。
その他のNode.js互換性改善
#毎日、Bunは100%Node.js互換に近づいています。変更なしでBunで動作するパッケージが増えました:
Nuxt: nuxt devはHMRとNuxt DevToolsを接続します。
testcontainersとdockerode: container.exec()が動作します。
https-proxy-agentとsocks-proxy-agent: http.request()がそれらを介してトンネリングします。
crawlee: proxy-chainを介してクロールします。
@grpc/grpc-jsとConnectRPC: Envoyの背後にあるサーバーとAWS ALBの背後にあるクライアントが動作します。
amqplib: RabbitMQに接続します。
@aws-sdk/client-s3: ストリーミングアップロードが動作します。
TypeORM: tsconfig.jsonの設定でデコレータを使用して起動します。
nock: httpおよびhttpsリクエストをインターセプトします。
Fastify inject()とlight-my-request: 動作します。
happy-dom: console.logが壊れなくなりました。
piscina: 実行されます。
Bunの新しいNode.js API:
worker_threads: resourceLimits、stdout、stderr、evalオプション。
ws: 'upgrade'および'unexpected-response'イベント。
socket.upgradeTLS({ isServer: true }): サーバーサイドSTARTTLS。
node:cluster: ワーカー間でリスニングソケットを共有します。
node:repl、node:trace_events、node:domain: 実装されました。
本番環境
#Bun v1.4は、メモリ使用量、CPU使用量を削減し、起動が高速化しました。
Bun v1.4まで、Bunは2つのメモリ割り当て器を使用していました。JavaScriptCoreのlibpas割り当て器とmimallocです。BunのJavaScriptCoreは現在mimallocを使用しています(メモリ回収を改善)。また、部分的なページクリア、JavaScriptがアイドル状態のときにメモリを解放するスカベンジャースレッド、および改善された遅延ゼロ化などの機能でmimallocを拡張しました。
CPU使用率
#Bun上に構築された大規模な長時間実行アプリケーションであるClaude Codeでは、本番環境のCPU使用率が2倍に低下しました。p99は24%から10%に、p50は5.8%から2.5%に低下しました。
小さな「hello world」アプリでは、アイドル時のCPU使用率が5倍に低下します。
これは、ガベージコレクタタイマーがGCを要求するタイミングの最適化、JavaScriptCoreがStrongルートを訪問する方法を連結リストからセグメント化された配列の連結リストに切り替えたこと、および前述のmimallocの変更と合わせて、futex呼び出しの数を減らしたことによって実現しました。
メモリ使用量
#BunでHTTPサーバーを使用するアプリケーションは、メモリ使用量が13%〜48%削減されるはずです。
負荷時のピークメモリ(64接続で1,000,000リクエスト、Next.jsとViteは100,000):
ServerBun 1.4Bun 1.3Node.js 26Δ vs Bun 1.3fastify120 MB233 MB156 MB−48%Express92 MB169 MB145 MB−46%node:http81 MB135 MB107 MB−40%Elysia55 MB91 MBn/a−40%Next.js285 MB397 MB342 MB−28%Bun.serve36 MB45 MBn/a−20%Vite dev server233 MB268 MB214 MB−13%
サーバーサイドレンダリング(SSR)のNext.jsでは、より大きな削減が見られます。1.3で無制限に増加した一般的なApp Routerパターン(動的ルートでのReact.cache + no-store fetch)では、Bun 1.4は4,000ページで238 MBに落ち着き、Nodeの410 MBを下回ります。
Next.js App Router SSR、4,000ページ:Bun 1.4は410 MBのNodeを下回り、238 MBに落ち着きます。
起動
#Windowsでは、Bunは2.5倍速く起動します。
Windows上のhello.js
Bun 1.4Bun 1.3.14Node.js 26起動時間15.5 ms39.0 ms40.1 msピークメモリ16.8 MB46.5 MB32.5 MB
Linuxでは、Bunは2倍速く起動し、メモリ使用量は半分以下になります。
Linux上のhello.js
Bun 1.4Bun 1.3Node.js 26起動時間5.1 ms10.9 ms27.2 msピークメモリ14.6 MB33.0 MB44.5 MB
バイナリサイズ
#LinuxとWindowsでは、Bunは最大17%小さくなります。
Bun 1.4Bun 1.3.14Linux x6477.0 MB88.5 MBLinux arm6476.8 MB87.6 MBWindows x6484.8 MB93.9 MBWindows arm6475.1 MB90.2 MBmacOS arm6461.2 MB60.2 MBmacOS x6466.6 MB66.0 MB
macOSバイナリは約1 MB大きくなります。
オブザーバビリティ
#すでに使用しているツールがBun 1.4で動作します。
bun --cpu-profは.cpuprofileを書き出します。Chrome DevToolsまたはVS Codeで開きます。
bun --heap-profはV8互換の.heapsnapshotを書き出します。Chrome DevToolsで開きます。
node:inspector: Sessionは、アプリ実行中にProfiler.startおよびProfiler.stopを使用してCPUプロファイルを開始および停止できます。#25939
Datadog: dd-traceはリクエストをトレースし、@datadog/pprofはCPUを継続的にプロファイルします。#36747
OpenTelemetry: npmの@opentelemetry/instrumentation-httpおよび@opentelemetry/instrumentation-fsパッケージは、Bunのnode:httpおよびnode:fsで動作します。それらが依存するshimmerおよびrequire-in-the-middleパッケージは、バンドルされたコードにパッチを適用できます。
非同期スタックトレース: fs.promises、fetch()、S3、DNS、またはcryptoからのエラーは、ネイティブフレームではなく、コード内のawaitを指します。
これらの一部はBunの新機能です。
--cpu-prof-md
--cpu-prof-mdはCPUプロファイルをMarkdown形式で書き出すため、ターミナルからホット関数を見つけることができます。自己時間による上位関数、コールツリー、および呼び出し元がわかります。SSHで読み取ったり、grepしたり、バグレポートに貼り付けたり、LLMに渡したりできます。
bun --cpu-prof-md ./app.ts
# CPU Profile | Duration | Samples | Interval | Functions | | -------- | ------- | -------- | --------- | | 304.9ms | 279 | 1.0ms | 6 | **Top 10:** `tokenize` 39.1%, `escapeHtml` 25.6%, `escapeHtml` 19.3%, `render` 15.8% ## Hot Functions (Self Time) | Self% | Self | Total% | Total | Function | Location | | ----: | ------: | -----: | ------: | ------------ | ----------- | | 39.1% | 119.4ms | 39.1% | 119.4ms | `tokenize` | `app.ts:14` | | 25.6% | 78.1ms | 25.6% | 78.1ms | `escapeHtml` | `app.ts:5` | | 19.3% | 58.9ms | 19.3% | 58.9ms | `escapeHtml` | `app.ts:4` | | 15.8% | 48.3ms | 60.8% | 185.3ms | `render` | `app.ts:21` | ## Call Tree (Total Time) | Total% | Total | Self% | Self | Function | Location | | ------: | ------: | ----: | ------: | ------------ | ----------- | | 60.8% | 185.3ms | 15.8% | 48.3ms | `render` | `app.ts:21` | | 60.8% | 185.3ms | 0.0% | 0us | `(module)`