Transcript

00:00:00(アップビートな音楽)皆さんこんにちは。
00:00:06リディアです。
00:00:07BUNのプロパガンダ責任者という肩書きです。
00:00:11私のことを少しご存知なら、JavaScriptランタイムとパフォーマンスについて話すのが大好きなことがお分かりでしょう。
00:00:17実は、BUNに入社する前はVercelで何年か、Next開発者がアプリをより速く構築できるよう指導していました。
00:00:24ですから、
00:00:25Next.jsのフレームワークパフォーマンスとBUNのランタイムパフォーマンスを組み合わせるとどれほど良くなるか、
00:00:32皆さんにお見せできて本当に興奮しています。
00:00:35その前に、
00:00:36BUN自体についての話に先立ち、
00:00:38Next.jsのようなフレームワークが最初の段階でなぜそんなに特別なのかをお見せしたいのです。
00:00:45なぜなら、ウェブのパフォーマンスについての見方を本当に再定義したからです。
00:00:49ウェブサイトが速くなったというだけではありません。
00:00:52プロセス全体が合理化されました。
00:00:55Webpackでのスマートなバンドルや、今はTurboPackでの実現です。
00:00:59組み込みの画像とフォント最適化を実現しました。
00:01:02効率的なサーバーサイドレンダリング、
00:01:05静的レンダリング、
00:01:06ISR、
00:01:07さらにはRSCでデータフェッチングをコンポーネント自体に持ち込みました。
00:01:12こうした改善はすべて、フレームワークが最適化できることを押し進めていますが、実際のところ一定の地点までなのです。
00:01:21それまでずっと、Next.jsがまだ最適化できなかった基本的なレイヤーが1つありました。
00:01:26これはエンジニアリングの努力や能力の不足ではなく、単にNext.jsのスコープの外なのです。
00:01:34それはランタイム自体です。
00:01:37通常、Next devを実行するか、Vercelにデプロイすると、Next.jsアプリはNode上で実行されます。
00:01:42つまり、NodeのランタイムがJavaScriptコードを実行します。
00:01:45イベントループ、ファイルIO、すべてを管理します。
00:01:49JavaScriptコードをオペレーティングシステムに接続します。
00:01:53これは理にかなっています。Nodeはここ15年以上デフォルトランタイムだからです。
00:01:59十分にテスト済みで信頼性が高いですが、2025年には若干のボトルネックになっています。
00:02:06誤解しないでください。Nodeは素晴らしいものです。
00:02:09サーバー上でJavaScriptを実行することを可能にしました。
00:02:13その前、2009年のNode導入前は、JavaScriptは本当にブラウザ用だけでした。
00:02:20NodeはJavaScriptエンジン、
00:02:22イベントループ、
00:02:23非同期IO、
00:02:23ブラウザではできないあらゆることをするAPIを備えたランタイムを提供することで、
00:02:28それを変えました。
00:02:29ディスク、メモリからファイルを読むなど、そうした事柄すべてです。
00:02:33内部では、NodeはV8 JavaScriptエンジンを使用しています。
00:02:37これはGoogleの高速Chromeエンジンで、Chromeブラウザのタブなど長時間実行されるタスクに最適です。
00:02:44しかし、もちろんV8は単なるエンジンです。
00:02:46JavaScriptを実行する方法だけを知っています。
00:02:49ファイルを開いたり、TCP接続を作ったりはできません。
00:02:54そこでNodeの組み込みAPIが登場します。
00:02:57FS、HTTP、NETなどです。
00:03:01これらのAPIはJavaScriptコードとオペレーティングシステム間のブリッジとも言えます。
00:03:07そしてこれらのAPI自体は、libuvというCライブラリに依存しています。
00:03:13これはJavaScript自体のために構築されたものではありません。
00:03:16むしろ、ファイルIO、ネットワーキング、異なるOS全体で様々なことができるようにNodeが使う汎用的な抽象化です。
00:03:27JavaScriptコードでfs.readFileのようなものを呼ぶと、
00:03:32コンピューターに「ディスクからこのファイルを読みたい」と言っています。
00:03:36しかし、そこに到達する前に、まずJavaScriptコードからV8を通す必要があります。
00:03:42それがNode C++バインディングに渡されます。
00:03:46これがlibuvを呼び出し、スレッドワークなど全てのオーバーヘッドは言及していません。
00:03:52その後、libuvがカーネルへのシステムコールを行い、ディスクからこのファイルを実際に取得します。
00:03:58そしてこれが起きている間、libuvが使うイベントループが、JavaScriptコードの残りが実行できるようにします。
00:04:06このモデルは機能しています。
00:04:08まだNodeを使っていますが、最適ではありません。
00:04:13では2009年に戻ります。Node導入時、私たちのハードウェアはまったく異なっていました。
00:04:19サーバーはおそらく4コア、メモリは限定的、ストレージはかなり遅かったです。
00:04:25スレッドも高価だったため、全接続ごとに新スレッドを作成するだけではスケールしませんでした。
00:04:32その時代、Nodeのモデルは優れていました。1つのスレッドで数千の接続を非常に効率的に処理できたからです。
00:04:40ですが2025年へ早送りすると、ハードウェアは全く異なります。
00:04:44今は数百のCPUコア、テラバイトのメモリ、ストレージは50倍高速です。
00:04:51なのに私たちはまだ2009年ベースのNodeのモデルを使っています。
00:04:55相変わらず全てを同じイベントループを通してます。
00:04:59繰り返しますが、これは問題ありません。
00:05:00Nodeのアーキテクチャはサーバーが数日間走っていた時代は問題ありませんでした。
00:05:04ですが現代では、サーバーレス関数や開発サーバーをよく使います。
00:05:09これらはより短いバースト処理で、高速起動して短時間で実行される必要があります。
00:05:16ですからこうした環境では、起動の1ミリ秒単位が重要で、全てのデータレイヤーがレイテンシに追加されるからです。
00:05:24繰り返しますが、Next.jsアプリを実行するとNode上で実行されます。
00:05:34つまりアプリがやることすべて、
00:05:36ページレンダリング、
00:05:37アセット配信、
00:05:38レスポンスストリーミングが、
00:05:40先ほど見たレイヤーを全て通ります。
00:05:43JavaScriptからV8からNode、全てです。
00:05:46Next.jsは、
00:05:48Nodeランタイムが特定のことをまだブロックしていても、
00:05:52パフォーマンスの全てを絞り出す素晴らしい仕事をしました。
00:05:57結局のところ、こうした改善は全てNode上で実行されているからです。
00:06:01ですから開発サーバーを起動したり、
00:06:03ファイルを再ビルドしたり、
00:06:05ホットリロードしたりするときも、
00:06:07ランタイムの制限に直面します。
00:06:09本当に高速化したいなら、フレームワークの向こうを見る必要があります。
00:06:13さらに深いレベルに行く必要があります。
00:06:15ランタイム自体を再考する必要があります。
00:06:18そこにBUNが登場します。
00:06:20BUNはNode上に構築された単なるもう1つのレイヤーではありません。
00:06:242025年に実際に持っているハードウェアのために一から構築された真新しいランタイムです。
00:06:33つまりNodeのようにLibUVの上のC++で書かれるのではなく、BUNはZigで構築されています。
00:06:40これは金属に非常に近く実行される最新のシステムズ言語です。
00:06:45JavaScriptエンジンについて、
00:06:47BUNはAppleの非常に高速なJavaScriptCoreエンジンを使用しています。
00:06:51これは主に高速に起動します。V8のようなエンジンが行う初期化最適化の一部を遅延できるからです。
00:06:59また非常に速く実行されます。これは開発サーバー、
00:07:04サーバーレス環境、
00:07:05こうした短いビルドスクリプトなど最新のタスクに最適です。
00:07:10コアランタイム自体はZigで書かれています。
00:07:13BUN APIと非同期I/Oを処理する全ての部分です。
00:07:17Nodeがこうした全ての非同期操作にLibUVを使うのと同じように、
00:07:23ファイル読み込み、
00:07:24ネットワークリクエストなど、
00:07:26BUNはZigで書かれているため、
00:07:29OSへのダイレクトシステムコールとしてこれらを実装できます。
00:07:33ネットワークリクエストの場合、useSocketsを使います。少し異なります。
00:07:37ですがLibUVではなくZigを使うことで、多くの抽象化レイヤーを削除しています。
00:07:44さてBUNランタイムでファイルを読むなら、もちろんJavaScriptコードから始まります。
00:07:49JSCエンジンからZigに行き、その後ダイレクトシステムコールができます。
00:07:55ですからもう一度、JavaScriptコードと実際のOSの間のレイヤーが少なくなります。
00:08:01結果として起動からファイルアクセス、HTTPサーバーまで全てがはるかに速く感じられます。
00:08:09ですがBUNはパフォーマンスだけではありません。
00:08:12また100%Node互換を目指しています。
00:08:15Nodeの全API が機能することを確認したいのです。
00:08:19ですがS3、SQL、Squeel、何て呼ぼうと多くの追加の組み込みAPIも搭載しています。
00:08:27Redis、ハッシング、シェル、本当に多くのものです。
00:08:30GoやPythonなど他のプログラミング言語を使ったことがあるなら、
00:08:35こうしたバッテリー内蔵アプローチに非常に精通しています。
00:08:39ですがJavaScript開発者は、ほぼ全てのことのために依存関係をインストールするのに慣れすぎています。
00:08:45ほぼ全てのアプリでパスワードハッシングを使います。
00:08:48でも毎回それを使うたびに依存関係をインストールする必要があります。
00:08:52ですからBUNはそれを変えます。
00:08:54ほぼ常に使うもの、それはランタイム自体に組み込まれています。
00:08:59グローバルに組み込まれているだけです。
00:09:01またこれらはNPM依存関係の上の表面レベルのラッパーではありません。
00:09:06本当にZigで構築されています。
00:09:08ですからパフォーマンスのために最適化され、最新のハードウェア向けです。
00:09:12例えばBUNには組み込みSQLクライアントがあります。
00:09:16ですから1つのAPIでPostgres、MySQL、SQLiteに直接接続できます。
00:09:23追加の依存関係をインストールする必要はありません。
00:09:26繰り返しますが、これはNPMパッケージを呼んでいるだけではありません。
00:09:30本当に全てBUNがシステムと直接対話しています。
00:09:35そしてこれらが組み込まれているのは単なる利便性ではありません。
00:09:38BUNのオプションは通常、NodeやNPMの代替品よりはるかに速いです。
00:09:44例えばここで、BUN.SQLはNode上のMySQL2より最大11倍速いです。本当に良い成績です。
00:09:51またはBUNのS3クライアントが使えます。
00:09:54そしてこれはS3互換ストレージで既に動作します。
00:09:58Amazon S3、Supabase Storage、Cloudflare R2など。
00:10:03そしてこのAPIもまた信じられないほど速いです。
00:10:06ここで、Node上のAWS S3 SDKより最大6倍速いです。
00:10:12もちろんBUNランタイムで通常の依存関係を引き続き使えます。
00:10:17こうした組み込みAPIを使う必要はありません。
00:10:20ですがそれらはバンドルサイズを大幅に減らします。もうこれらの依存関係を追加していないからです。
00:10:25そしてNPM脆弱性を助けます。先月見たような、インストールしないので。
00:10:32さらに多くのAPIがあります。
00:10:33ドキュメントもチェックアウトをお勧めします。
00:10:37ですがBUNはランタイムだけ以上に搭載しています。
00:10:40YARNより最大17倍速く、NPMより7倍速く、PNPMより4倍速い本当に高速なパッケージマネージャーも搭載しています。
00:10:51そして良いことは、BUNランタイムを使う必要がないということです。
00:10:55そしてこれだけのことです。Nodeでbun installが使えます。
00:10:58動作します。
00:10:59ですからプロジェクトについて何も変更する必要がありません。
00:11:03また本当に高速な組み込みバンドラーとトランスパイラーもあります。
00:11:06ですからファイルを瞬時に配信とビルドできます。
00:11:09Webpack、ESBuild、追加セットアップは不要です。
00:11:12そして素晴らしいことに、TypeScriptとJSXもボックスから正しくサポートします。
00:11:18また、
00:11:191000のReactテストをSSRでかけた時、
00:11:21vTestより最大14倍速く、
00:11:23jestより23倍速い本当に高速なテストランナーもあります。
00:11:26ですからもう一度、本当に速いテストが得られます。
00:11:29何もインストールする必要がありません。
00:11:31ですからこれは全て素晴らしく聞こえますが、BUNランタイムはどう使うのですか?
00:11:35正直なところ、次は非常に簡単です。
00:11:38BUN インストール後、スタートコマンドまたはdevコマンドを更新してbun run --bunを追加するだけです。
00:11:45これだけです。
00:11:46BUNランタイムを実行しています。
00:11:48さて、なぜ--bunフラグが必要かと思うかもしれません。
00:11:51既にbun runと言っているのに。
00:11:54繰り返しますが、BUNは本当にnode互換性を気にしています。
00:11:57ですから通常、
00:11:58bun run next devを使う場合、
00:12:02BUNはnext CLIがnodeshebangを使うことを検出します。
00:12:07その場合BUNは、わかりました、nodeを使う必要があります。
00:12:11ですからbun runと言ってもデフォルトでnodeに戻ります。
00:12:15ですが--bunフラグでshebangをスキップするように強制し、わかりました。bun実行時を使っています。
00:12:21ですから追加の説明として。
00:12:25ですからこのコマンドでbunが次の開発サーバーを起動します。
00:12:29バンドラー自体はまだnextです。
00:12:31ですから、Webpack、TurboPack、今はそれがデフォルトです。
00:12:33ですが今その下のランタイム、JavaScriptを実行する、ファイルを読む、レスポンスを提供する、それは全部bunです。
00:12:35ですからbunはNode互換設計なので、コードベースについて何も変更する必要がありません。
00:12:44またはパッケージやミドルウェア。
00:12:50全てが引き続き動作するはずです。
00:12:51そうでなければ、それもbunのバグと見なされます。
00:12:53100%node互換である必要があります。
00:12:57ですからこれを試してて問題に遭遇したら。
00:12:59お知らせください。
00:13:02ですが何も書き直す必要はありません。
00:13:05そしてアプリがbun上で実行されるようになったので、bunの全ての組み込みAPIにアクセスできます。
00:13:10例えばサーバー機能、Reactサーバーコンポーネントなどで、S3クライアントを使えます。
00:13:16ですから依存関係をインストールする必要がありません。
00:13:18ですから単にNode でそれがどう見えたかを比較するために、bunの場合、コードが多くありません。
00:13:25依存関係が少ないです。
00:13:27そして他のS3プロバイダー全体とも即座に互換性があります。
00:13:32Amazon S3をCloudflare R2のようなSupabase StorageやOTHER プロバイダーに変更したいなら、
00:13:39超シンプルです。
00:13:40またはより完全な例として、Reactサーバーコンポーネントで直接S3、bunシェル、SQLを使えます。
00:13:47ですから最初に、
00:13:48SQLでデータベースをクエリしてブログポストをフェッチします。S3用のプリサインURLをイメージに生成します。bunシェルを使って単語を数えます。
00:13:57繰り返しますが、bunが呼び出してる追加のAPIレイヤーや第三者ツールはありません。
00:14:02Bunはランタイム、データベース接続、シェルを全てSIGでネイティブに処理します。金属に近い処理です。
00:14:10そして繰り返しますが、もちろんS3とSQLだけではありません。
00:14:12bun run --bunをnext devの前に追加することで、bunの全APIにアクセスできます。
00:14:20ですがもちろん、今、わかります、Postgresを使ってません。
00:14:24S3を使ってません。
00:14:25クレイジーな依存関係を何も使ってないので、なぜ気にする必要があります?
00:14:28正直なところ、bunに惹かれた、入社する前の事柄は、信じられないほどのDXでした。
00:14:34設定なしで任意のJS、TS、TSX、JSXファイルを実行できます。
00:14:41動作します。
00:14:41TSNode、Babel、SWCなどについて考える必要がありません。
00:14:46ですから次を使ってなくても、
00:14:49開発してるだけでも、
00:14:50クイックビルドスクリプトだけでもbun runを試してください。設定がないのでライフを大幅に改善します。
00:14:59Bunはまたbun xを搭載しています。
00:15:01これはNPXへのbunの相当です。
00:15:04繰り返しますが、何も変更する必要がありません。
00:15:06このためbun実行時を使う必要がありません。
00:15:08npxをbun xに変更できます。
00:15:11そして瞬時に起動改善が見えます。
00:15:13例えばbun x create next stepを使えば、NPXで次を作るより5倍速いです。
00:15:20そしてこれのためbun実行時を使う必要がありません。
00:15:23単に非常に速いです。
00:15:25もちろんbun installもあります。繰り返しますが、実行時を変更する必要がありません。
00:15:31基本的な次のプロジェクトでもインストールが大幅に速くなります。
00:15:36さてbunをローカルで実行するのは1つのことです。
00:15:39ですがbunで実行するアプリをデプロイするには?
00:15:42もちろん完全に新しいランタイムです。
00:15:46RenderやRailway上で、
00:15:48またはDockerでアプリをコンテナ化して、
00:15:50既に複数のプラットフォームでbunでNext.jsを使えます。
00:15:54ですが全て次の開発者です。
00:15:56理想的にはVercelにもデプロイできます。
00:16:00ですから自然にギエルモをツイートしました。親切にVercelでのネイティブbunサポートをお願いしました。
00:16:07そして素晴らしい応答をすぐ得ました。
00:16:10数週間後、bun支援は少なくとも内部で達成されました。
00:16:15ですからネイティブbunサポートが非常に近い将来Vercelに来ることを非常に楽しみにしています。
00:16:20そしてこれはあなたができることを意味します。[拍手]はい。
00:16:25これを可能にしたVercelの素晴らしいエンジニアに拍手を。
00:16:29ですがこれは非常に興奮しています。任意の他の次のプロジェクトと同じくらい簡単にVercel上でbunアプリを実行できるからです。
00:16:37ですから単なる実世界の例です。
00:16:39画面で見えるかどうかわかりません。
00:16:41ですがbunをVercelで実行するだけで、HONO APIで既に30%のドロップまたはCPUドロップが見えました。
00:16:49もちろんこれは異なるフレームワークです。
00:16:50これはHONO APIです。
00:16:52ですがサーバー機能、RSCなどと同じランタイムの利点です。
00:16:57bunはCPUとメモリ使用量で多く節約するから。
00:17:02さてもちろん、ネイティブbunサポートを待つ必要はありません。
00:17:06最も簡単な方法は、使ってみる、またはそれを段階的に採用することです。
00:17:11ですから最初にbun installに切り替えるをお勧めします。
00:17:14コードベースで何も変更しません。
00:17:16これはbunの本当に高速なパッケージマネージャーを使います。
00:17:19またbun installがなぜそんなに速いか知ることに興味があれば、不向きにこれについて記事を書きました。
00:17:24それをチェックアウトするをお勧めします。
00:17:26ステップをスキップしてるだけではないことを説明しています。
00:17:29何でも構いません。
00:17:29それがそんなに速いのはシステムエンジニアリングの背後にある説明をしています。
00:17:35bun installを使った後、bun実行時を使ってみてください。
00:17:39bun run --bunでローカルで使えます。
00:17:42アプリをテストしてください。
00:17:42全て動作しているか確認してください。
00:17:44そうあるべきです。
00:17:45そうでなければお知らせください。
00:17:47そして最後に、意味のあるところでbunのネイティブAPIへある程度段階的に移動できます。
00:17:53もちろんこれらのNPM依存関係を引き続きミックスマッチできます。
00:17:57ですが最高の部分はここの各ステップが逆向きであることです。
00:18:00ですからbunのネイティブAPIの1つを使ってそれが動作しなかったら、常にnodeに戻せます。
00:18:06ですがそれはチェックアウトする価値があります。
00:18:08この話を終える前に、bunのエンジニアの素晴らしいチームに大きなお礼を言いたいです。
00:18:17ほとんどの人はジャレッドを知ってるかもしれませんが、
00:18:20bunの背後に全体チームがあり、
00:18:22bunをさらに速く、
00:18:23より安定して、
00:18:24使うのがはるかに楽しくするため毎日一生懸命働いています。
00:18:27彼らは本当にJavaScriptで可能なことの限界を押しています。
00:18:32ですから次はウェブ向けの構築方法を再想像しましたが、bunはそれが電力を供給するのを再想像しました。
00:18:38私の話に来ていただきありがとうございました。bunと次で何を構築するか見るのを本当に楽しみにしています。

Key Takeaway

BUNは現代のハードウェアに合わせて一から設計された新しいJavaScriptランタイムで、Zigで実装され、Next.jsフレームワークと組み合わせることで、パフォーマンス、開発体験、デプロイメント効率を劇的に向上させる。

Highlights

BUNはNode.jsの2009年ベースの古いモデルを置き換え、2025年のハードウェアに最適化された新しいランタイムである

BUNはZigで構築され、Apple JavaScriptCoreエンジンを使用しており、抽象化レイヤーが少なくなるため起動からファイルアクセスまで大幅に高速化される

BUN実行時を使うにはbun run --bunコマンドを追加するだけで、コードベースの変更なしでNext.jsアプリケーションを実行できる

BUNにはSQL、S3、Redis、ハッシング、シェルなどの組み込みAPIが搭載されており、NPM依存関係の代わりになり、バンドルサイズと脆弱性を削減できる

BUNのパッケージマネージャーはYARNより17倍、NPMより7倍、PNPMより4倍高速であり、bun installコマンドのみで大幅な速度向上が実現される

VercelがBUNのネイティブサポートを内部で達成し、近い将来Vercelプラットフォームでシームレスにデプロイできるようになる

BUNに移行する場合、段階的な採用が可能で、bun install→bun実行時→ネイティブAPIという順序で進め、各ステップは後戻り可能である

Timeline

イントロダクションとスピーカー紹介

リディアというスピーカーが自己紹介し、JavaScriptランタイムとパフォーマンスについて専門知識を持つことを述べます。Vercelでの経験を通じてNext開発者がアプリをより速く構築できるよう指導してきたことが背景にあります。BUNランタイムとNext.jsフレームワークのパフォーマンスの組み合わせについて聴衆に紹介する興奮を表現しており、これが講演の中心テーマとなることが示唆されます。

Next.jsのフレームワークパフォーマンス最適化の歴史

Next.jsが過去数年間でウェブパフォーマンスとプロセス全体を根本的に改善してきた成果が詳細に説明されます。Webpackからの最適化、TurboPackの導入、画像とフォント最適化、サーバーサイドレンダリング、ISR、React Server Components(RSC)によるデータフェッチングの改善が具体的に列挙されます。これらの改善はすべてフレームワークレベルでの最適化ですが、一定の限界があり、その限界がランタイム層にあることが指摘される重要な転換点となります。

Node.jsランタイムの制限と現在の課題

Next.jsアプリケーションは通常Node.jsランタイム上で実行されることが説明され、Node.jsがJavaScriptエンジン、イベントループ、ファイルIO、OS接続などを管理することが詳細に述べられます。2009年のNode導入時はハードウェアが4コア、限定的メモリという制限があり、シングルスレッドのイベントループモデルが最適でした。しかし2025年では、サーバーは数百のCPUコア、テラバイトのメモリ、50倍高速なストレージを備えているにもかかわらず、依然として2009年ベースのアーキテクチャを使用しているという矛盾が浮き彫りになります。

モダン開発環境でのボトルネック分析

Nodeが素晴らしい技術であることが認められつつも、現代のサーバーレス関数や開発サーバーの短いバースト処理では、起動の1ミリ秒単位が重要であり、データレイヤーのすべてがレイテンシに加算されることが指摘されます。Next.jsアプリケーションのページレンダリング、アセット配信、レスポンスストリーミングはすべてJavaScriptからV8からNode経由のレイヤーを通り、この複数レイヤーの存在が開発サーバー起動、ファイル再ビルド、ホットリロード時にパフォーマンスを制限しています。本当に高速化したいなら、フレームワークではなくランタイム自体を再考する必要があることが結論づけられ、BUNの登場の必要性が論理的に導かれます。

BUNランタイムの技術的な基盤と設計思想

BUNはNode上に構築された単なるレイヤーではなく、2025年のハードウェアのために一から構築された新しいランタイムであることが強調されます。BUNはZigという最新のシステムズ言語で構築され、金属に非常に近い実行速度を実現し、JavaScriptエンジンとしてApple JavaScriptCoreを採用しています。JavaScriptCoreは起動が高速であり、V8のような初期化最適化の一部を遅延できるため、開発サーバーやサーバーレス環境、短いビルドスクリプトなど現代のタスクに最適です。コアランタイムがZigで書かれることで、LibUVの多くの抽象化レイヤーを削除し、OSへのダイレクトシステムコールが可能になり、レイテンシが大幅に削減されます。

BUNの組み込みAPI群と利便性

BUNは100% Node互換を目指しながらも、SQL、S3、Redis、ハッシング、シェルなど多くの追加の組み込みAPIを搭載していることが説明されます。JavaScriptの開発者のように毎回依存関係をインストールするのではなく、これらのバッテリー内蔵APIはランタイムに組み込まれており、本当にZigで構築されているためパフォーマンスも最適化されています。具体的には、BUN.SQLはMySQL2より最大11倍速く、BUN.S3クライアントはAWS S3 SDKより最大6倍速く、Amazon S3、Supabase Storage、Cloudflare R2などのS3互換ストレージとも互換性があります。さらに、BUNのパッケージマネージャーはYARNより17倍速く、NPMより7倍速く、高速な組み込みバンドラー、トランスパイラー、テストランナー(vTestより14倍速く、Jestより23倍速い)も提供されており、設定なしにTypeScriptとJSXをサポートします。

BUNランタイムの導入方法と互換性

BUNランタイムを使用するには、BUNをインストール後、開発コマンドに`bun run --bun`フラグを追加するだけという非常にシンプルな方法が説明されます。`--bun`フラグが必要な理由は、BUNがNode互換性を重視し、通常は`bun run next dev`でNode shebangを検出してNodeにフォールバックするためですが、このフラグによってshebangをスキップしBUNランタイムを強制します。BUNはNode互換設計なので、コードベースやパッケージ、ミドルウェアについて何も変更する必要がなく、すべてが引き続き動作するはずであり、そうでなければそれはBUNのバグと見なされます。Next.jsアプリケーションがBUN上で実行されるようになれば、サーバー機能やReact Server Componentsで直接S3クライアントなどのBUN組み込みAPIにアクセスでき、追加の依存関係をインストールする必要がなくなります。

BUNを使用したNext.jsの実践的な例とコード削減

Node.jsとBUNの差の具体例として、S3クライアントの使用が比較されます。Node.jsではAWS SDK依存関係が必要ですが、BUNではコードがより少なく、依存関係も少なく、Amazon S3、Cloudflare R2、Supabase StorageなどのS3プロバイダー全体と即座に互換性があります。さらに完全な例として、React Server ComponentでS3、BUNシェル、SQLを直接使用して、SQLでデータベースをクエリしてブログポストをフェッチ、S3用のプリサインURLを画像に生成、BUNシェルを使用して単語を数えるという一連の処理が可能になります。この場合、BUNはランタイム、データベース接続、シェルをすべてネイティブに処理し、追加のAPIレイヤーや第三者ツールは不要で、金属に近い処理が実現されることが強調されます。

BUNの開発者体験(DX)の改善とツール

BUNが提供する優れた開発者体験(DX)として、設定なしで任意のJS、TS、TSX、JSXファイルを実行でき、TSNode、Babel、SWCなどについて考える必要がないことが説明されます。Next.jsを使用していなくても、開発やクイックビルドスクリプトでBUN runを試すことで、設定がないため大幅にライフを改善できます。さらに、BUN xはNPXへのBUNの相当で、何も変更する必要がなく、`bun x create next app`ウェブコマンドはNPXで次を作成するより5倍速く、BUN実行時を使用する必要さえなく、単に非常に高速です。`bun install`コマンドも実行時を変更する必要なく、基本的なNext.jsプロジェクトでもインストールが大幅に高速化されることが述べられます。

BUNアプリケーションのデプロイメントとVercelサポート

ローカルでBUNを実行することとは別に、BUNで実行するアプリケーションをデプロイする方法が説明されます。現在、RenderやRailway上で、またはDockerでアプリケーションをコンテナ化することで、複数のプラットフォームでBUNでNext.jsを使用できます。しかし、理想的にはVercelにもデプロイしたいというニーズから、スピーカーがVercelのネイティブBUNサポートをリクエストしたところ、素晴らしい応答が得られ、数週間後にBUNサポートが少なくとも内部で達成されました。ネイティブBUNサポートが非常に近い将来Vercelに到来することが期待されており、これによって任意の他のNext.jsプロジェクトと同じくらい簡単にVercel上でBUNアプリケーションを実行できるようになることが強調されます。

BUNによる実世界のパフォーマンス向上例

VercelでホストされたアプリケーションがBUNランタイムを使用することで得られる具体的なパフォーマンス向上が示されます。HONO APIの例では、単にBUNをVercelで実行するだけで、すでにCPUドロップまたはメモリドロップで30%の削減が観察されています。これはフレームワークレベルの最適化ではなく、ランタイムレベルでの改善であり、サーバー機能やReact Server Componentsなど他の機能でも同じランタイムの利点が得られることが説明されます。BUNはCPUとメモリ使用量で多く節約するため、コスト削減と応答性の向上という実質的なメリットが実現されることが明確にされます。

BUNへの段階的移行戦略と今後の展望

ネイティブBUNサポートを待つ必要なく、段階的にBUNを採用する方法が推奨されます。推奨される順序は、まず`bun install`に切り替える(コードベースで何も変更しない)、その後`bun run --bun`でローカルでBUN実行時を試す、最後に意味のあるところでBUNのネイティブAPIに段階的に移動することです。各ステップが逆向きであるため、BUNのネイティブAPIの1つが動作しなかった場合、常にNodeに戻すことができるという柔軟性が提供されます。スピーカーはBUNのエンジニアチームに感謝し、彼らが毎日一生懸命働いてBUNをさらに速く、より安定して、使うのがより楽しくしていること、そしてJavaScriptで可能なことの限界を押しているコミットメントを称賛します。Next.jsはウェブ向けの構築方法を再想像しましたが、BUNはそれに電力を供給することを再想像したというビジョンで講演が締め括られます。

Community Posts

View all posts