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と次で何を構築するか見るのを本当に楽しみにしています。