- Bun 1.2は、フルスタックJavaScript/TypeScript開発ツールを目指し、Node.js互換性とランタイム・バンドラ・テスト・パッケージマネージャをあわせて拡張した大規模リリース
- 変更のたびにNode.jsテストスイートを実行する方式で互換性検証を強化し、
node:http2、node:dgram、node:cluster、node:zlib、node:v8のサポートを追加 - 新しい組み込みAPI
Bun.s3とBun.sqlは、S3互換オブジェクトストレージとPostgresアクセスをランタイム内に取り込み、外部クライアントへの依存を減らす - パッケージマネージャは、デフォルトのlockfileをバイナリの
bun.lockbからJSONCベースの**bun.lock**へ変更し、.npmrc、bun publish、bun patch、bun outdated、bun run --filterを追加 bun runの作業ディレクトリ、Bun.build()の失敗処理、server.stop()の戻り値、bun -p、sourcemapのデフォルト値が変更されており、既存プロジェクトでは移行への影響を確認する必要がある
Node.js互換性の強化
- Bun 1.2は、Bunの変更ごとにNode.jsテストスイートを実行する方式へと互換性改善の手順を変更
- 従来はGitHub issueやnpmパッケージの実行失敗報告を中心にバグを修正していたが、この方法は大規模なリファクタリングを難しくする「モグラ叩き」に近かった
- Node.jsリポジトリ内の数千のテストファイルをBun向けに移植し、各コミットごとにこれらのテストを実行して互換性を確認している
- Node.jsのテストには、内部実装の詳細や正確なエラーメッセージを検証するものもあるため、Bunでは一部テストで内部バインディングを独自スタブに置き換えたり、
nameとcodeを中心とした検証へ調整している- Bunは可能な限りNode.jsのエラーメッセージに合わせているが、
nameとcodeが同じであれば、より役立つメッセージを提供する場合もある
- Bunは可能な限りNode.jsのエラーメッセージに合わせているが、
- 新たにサポートされるNode.jsモジュールと機能
node:http2: HTTP/2サーバーの作成をサポート。gRPCサーバーにも必要node:dgram: UDPソケットのbind/connectをサポートnode:cluster: 複数のBunインスタンスを実行して複数CPUコアへ処理を分散可能node:zlib: JavaScript実装をネイティブコードで書き直し、Bun 1.1より2倍高速化node:v8:getHeapSnapshot、writeHeapSnapshotにより、BunヒープをChrome DevToolsで調査可能
node:http2サーバーは、Bun 1.2でNode.jsより2倍高速expressは、node:http互換性の改善とBun HTTPサーバーの最適化により、Node.jsよりHTTPリクエストを最大3倍高速に処理- V8 C++ APIを使うC++アドオンのサポートも追加
- Node.jsはV8、BunはJavaScriptCoreを使うため、実装難度が高い
- BunはJavaScriptCore上にV8の公開C++ APIを実装し、
cpu-featuresのようなパッケージが動作するようにしている - V8 C++ APIサポートは複雑なため、多くのパッケージではまだ未実装の機能がある可能性があり、
node-canvas@v2やnode-sqlite3のようなパッケージのサポートを継続的に改善中
組み込みS3 API Bun.s3
- Bun 1.2は、S3互換オブジェクトストレージを扱う組み込みAPI
Bun.s3を追加- Amazon S3、Google Cloud Storage、Cloudflare R2など、S3 APIを実装したサービスとともに利用できる
- ファイルの読み取り、書き込み、削除を、Web標準の
Blobと互換性のあるAPIで処理する
s3.file()はS3ファイルへの遅延参照を返し、text()、json()、arrayBuffer()、stream()などBunのFileAPIと同じ方法で使える- BunのS3クライアントは、JavaScriptではなくネイティブコードで書かれている
- Node.jsで
@aws-sdk/client-s3を使う方法と比べ、S3バケットのファイルダウンロードが5倍高速
- Node.jsで
- 書き込み機能として
write()とwriter()を提供write()では文字列、Uint8Array、Blob、Responseなどをアップロードできるwriter()は大きなファイルに対してマルチパートアップロードを実行する
presign()は、特定ファイルのアップロードを許可するpresigned URLを生成- ユーザーに認証情報を公開したり、バケットへ不要なアクセス権を与えたりせずに、直接S3へアップロードさせられる
Bun.serve()と併用する場合、new Response(s3.file(...))は、サーバーがS3ファイルをダウンロードして再送する代わりに、presigned URLへリダイレクトする- メモリ、時間、サーバーがファイルをダウンロードする帯域コストを削減する
s3://URLはBun.file()とfetch()でも利用できるfetch("s3://...")でアップロード、ダウンロード、削除が可能- デフォルトの
S3Clientは、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYのような環境変数で設定される
組み込みPostgresクライアント Bun.sql
- Bun 1.2は、Postgresをサポートする組み込みSQLクライアント
Bun.sqlを追加- Bunは従来から組み込みSQLiteクライアントを提供しており、今回のリリースでSQLデータベース対応の範囲を広げた
- MySQLサポートを追加するpull requestもある
Bun.sqlはtagged-template literalでSQLを実行する- JavaScriptの値をSQLパラメータとして渡せる
- 文字列エスケープとprepared statementを自動で利用し、SQL injectionを防ぐ
- 結果は、カラム名をキーとするオブジェクト配列で返される
- ネイティブコード実装と複数の最適化を採用
- 自動prepared statement
- クエリパイプライニング
- バイナリwire protocol
- コネクションプーリング
- 構造キャッシュ
- Node.jsで人気のPostgresクライアントを使う方法より、行の読み取りが最大50%高速
- APIは
postgres.jsに着想を得ており、既存コードからBun組み込みSQLクライアントへ移行しやすいよう設計されている
パッケージマネージャーの変更
- Bun 1.2 は、デフォルトの lockfile をバイナリの
bun.lockbからテキストベースのbun.lockに変更bun.lockbはbun installをnpmよりほぼ 30 倍高速にするのに役立っていたが、GitHub 上で内容を確認しづらく、pull request のレビューや merge conflict の解消が難しかった- Dependabot のようなツールでも lockfile の読み取りが難しかった
bun.lockは JSONC ファイル- コメントと trailing comma をサポート
- pull request の diff を確認しやすくなり、trailing comma によって merge conflict の可能性も減る
- 新しいプロジェクトでは
bun.lockを生成- 既存の
bun.lockbプロジェクトは、自動マイグレーションなしで引き続きバイナリ lockfile をサポート bun.lockbは長期的にサポートされ、bun addやbun updateでも引き続き更新されるbun install --save-text-lockfileで新しいテキスト lockfile へ移行可能
- 既存の
bun installは、テキスト lockfile への移行後も Bun 1.1 より 30% 高速化package.jsonでコメントと trailing comma を使用可能require()とimport()もこのようなpackage.jsonを読み取れる- JavaScript エコシステム全体で広くサポートされている機能ではないため、「at your own risk」で使うよう案内している
.npmrcサポートを追加- プロジェクトルートとホームディレクトリの
.npmrcを読み取る - registry、scoped package、private registry の認証設定に利用できる
- プロジェクトルートとホームディレクトリの
- 新しいパッケージマネージャーのコマンドとオプション
bun run --filter: 複数の workspace で同じスクリプトを同時実行bun outdated: 古い依存関係を確認bun publish:npm publishの代替で、.npmrc認証・tarball packing・OTP・package.json の edge case 処理をサポートbun patch: 依存関係の修正内容をpatches/内の.patchファイルとして保存し、bun install時に自動適用--omit=dev|optional|peer: インストール時に dev、optional、peer 依存関係を除外- CA 証明書は
bunfig.toml、CLI フラグ、.npmrcで設定可能 bundleDependenciesと、bun addにおけるpackage.jsonのインデント保持もサポート
テストランナーの改善
bun testは JUnit XML レポーターをサポートbun test --reporter=junit --reporter-outfile=junit.xmlにより、Jenkins、CircleCI、GitLab CI のような CI/CD ツールへテスト結果を渡せるbunfig.tomlでも JUnit レポートを設定可能
- コードカバレッジには LCOV レポーターを追加
bun test --coverage --coverage-reporter=lcovでcoverage/lcov.infoを生成--coverage-dirで出力ディレクトリを変更可能
expect().toMatchInlineSnapshot()で inline snapshot をサポートbun test -uまたは--update-snapshotsでテストファイル内の snapshot を更新toThrowErrorMatchingSnapshot()とtoThrowErrorMatchingInlineSnapshot()も使用可能
test.only()は、もはや--onlyフラグなしでも動作expect()API には Jest、Vitest、jest-extendedのような matcher を追加toContainValue()、toContainKey()、toHaveReturned()系列- 2 番目の引数としてカスタムエラーメッセージを渡せる
jest.setTimeout()とsetDefaultTimeout()により、現在の scope または module のデフォルトのテスト timeout を変更できる
バンドラーとビルド機能
- Bun 1.2 は HTML import をサポート
- HTML ファイルを
Bun.serveのstaticオプションに渡すと、HTML 内の<script>と<link>を自動でバンドルし、静的ルートとして公開する
- HTML ファイルを
bun build --compileはクロスコンパイルをサポート- Linux で Windows または macOS 向けバイナリを作成でき、その逆方向も可能
- Windows ビルドではアイコン設定とコンソールウィンドウ非表示オプションを利用できる
bun build --bytecodeは bytecode cache を生成eslintのようなアプリケーションの起動時間を 2 倍高速にできる.jscファイルは対応する.jsファイルの bytecode cache を保持し、実行には両方のファイルが必要- bytecode cache はソースコードより 8 倍大きくなる可能性があり、起動時間改善の代わりにより多くのディスク容量を使う
bun build --format=cjsで CommonJS の出力形式を指定可能- 以前は ESM のみをサポートしていた
- 古い Node.js バージョンを対象としたライブラリやアプリケーションを作りやすくなる
- CommonJS 検出を改善
- ファイルが曖昧な場合、先頭の
"use strict"ディレクティブを CommonJS 判定の最後のヒューリスティックとして使用 require.main === moduleはimport.meta.mainに書き換えられ、import 文と一緒に使える
- ファイルが曖昧な場合、先頭の
- プラグイン API には
onBeforeParse()フックを追加- JavaScript ではなく N-API addon として実装する必要がある
- Rust、C/C++、Zig のようなコンパイル言語で、パース直前のソースコードをほぼオーバーヘッドなしで扱える
- プラグイン・フレームワーク作者向けの高度な API
- ビルドオプションも拡張
--env="PUBLIC_*"で環境変数をバンドルに注入--drop=consoleのような形で関数呼び出しを削除- banner/footer の追加
Bun.embeddedFiles()で standalone executable に含まれるファイル一覧を確認--ignore-dce-annotationsで誤った dead-code elimination annotation を無視--packages=externalでパッケージ依存関係をバンドルに含めないよう設定
CSS バンドリング
- Bun 1.2 は新しい CSS parser と bundler を実装
- LightningCSS の作業から派生し、Rust から Zig に書き直されて、Bun の JavaScript/TypeScript parser、bundler、runtime と統合された
bun build ./index.cssで、複数の CSS ファイルと@import、url、@font-faceの参照を 1 つの CSS ファイルに結合できる- JavaScript および TypeScript のコードから
.cssファイルを import できる- JavaScript module graph で import された CSS と
@importルールを、entrypoint ごとに 1 つの CSS ファイルへフラット化する
- JavaScript module graph で import された CSS と
Bun.build()API でも、同じ API で CSS と JavaScript をバンドルできる
Bun ランタイムAPIの追加
Bun.serve()はstaticプロパティで静的ルートをサポート- パスをキー、
Responseオブジェクトを値として渡す - 静的ルートは
fetch()ハンドラーで直接処理するより最大40%高速 - response body、header、status code がメモリにキャッシュされるため、JavaScript allocation と garbage collection が発生しない
server.reload()で静的ルートを再読み込みできる
- パスをキー、
Bun.udpSocket()は Bun API スタイルの UDP ソケットを提供node:dgramもサポートするが、Bun.udpSocket()は既存のBun.listen()に近いモダンな API- 単一の syscall で複数の UDP datagram を送信でき、OS の backpressure に対応
Bun.file()はdelete(),unlink(),stat()をサポートstat()は Node.jsfs.stat()のStatsオブジェクトと同じ形式のメタデータを返す- S3 ファイルにも同じ API を使える
Bun.color()は色の解析、正規化、変換を提供- CSS、ANSI color code、RGB、HSL などをサポート
dns.prefetch()は DNS レコードを事前取得し、起動時に DNS cache をウォームアップできるdns.getCacheStats()で DNS cache の状態を確認可能
- その他のユーティリティ
Bun.inspect.table():console.tableのような表形式の文字列を返すBun.randomUUIDv7(): ソートやデータベースに適した monotonic UUID v7 を生成
SQLite クライアントの改善
- Bun 内蔵 SQLite クライアントは
query.as(Class)でクエリ結果をクラスインスタンスにマッピングできる- getter、setter、method を付けられる
- パフォーマンス上の理由から class constructor、default initializer、private field はサポートしない
- リレーション管理や SQL 生成は行わないため ORM ではない
query.iterate()は行を一度にすべてメモリへ載せず、iterator として処理する- クエリオブジェクト自体も
forループで反復可能
- クエリオブジェクト自体も
strictオプションを有効にすると、クエリパラメータで$,@,:prefix を省略できる- パラメータが足りない場合はエラーを投げる
db.run()の結果で変更された行数と最後に挿入された row ID を確認できるchangeslastInsertRowid
safeIntegersオプションは 64 ビット整数を切り詰められたnumberではなくBigIntとして返す- データベース単位またはクエリ単位で設定可能
- JavaScript の
using構文で statement と database をスコープ終了時に自動で close できる
JavaScript からの C コンパイル・実行
- Bun 1.2 は JavaScript から C をコンパイルして実行する実験的サポートを追加
bun:ffiのcc()API を使用- 別途 build step なしで JavaScript から C system library を使える仕組み
- Bun には
tinyccが内蔵されているgccやclangと異なり、単純な C コードをミリ秒単位でコンパイルできる- 必要なときに C コードをコンパイルして実行できる
- N-API を使う C コードも提供される
node-gypのビルド段階なしで Bun だけあれば動作する
musl と Alpine Linux のサポート
- Bun 1.2 は glibc の代わりに musl libc を使う Linux ディストリビューション向けの Bun ビルドを追加
- Alpine Linux のような環境で使える
- Linux x64 と aarch64 をサポート
- Docker では
oven/bun:alpineイメージを使用できる - musl はより小さなコンテナイメージを可能にする一方、Bun の glibc 版よりやや遅い傾向がある
- 特別な理由がなければ glibc の使用を推奨
JavaScript 言語機能
- import attributes のサポートを追加
import json from "./package.json" with { type: "json" }のように JSON、text、TOML などを明示して import できる- 動的
import()でも使える
usingとawait usingをサポート- スコープを抜けると
[Symbol.dispose]または[Symbol.asyncDispose]が呼ばれ、リソースを自動的に解放する Bun.spawn(),Bun.serve(),Bun.connect(),Bun.listen(),bun:sqliteなど複数の Bun API でサポート
- スコープを抜けると
- Promise 関連の新 API
Promise.withResolvers():promise,resolve,rejectをまとめて生成Promise.try(): 同期または非同期関数を promise で包む
- エラーとバイト配列 API
Error.isError(): prototype chain の操作やnode:vmの cross-realm 状況でも、より正確に Error かどうかを判定Uint8Array.toBase64()/Uint8Array.fromBase64()Uint8Array.toHex()/Uint8Array.fromHex()
- iterator helper を追加
map,flatMap,filter,take,drop,reduce,toArray,forEach,find
Float16Arrayをサポート- 16 ビット浮動小数点配列は 32 ビットより精度は低いが、メモリ効率が高い
Web API の追加
TextDecoderStreamとTextEncoderStreamをサポートTextDecoderとTextEncoderのストリーミング版- Bun では
TextEncoderStreamは Node.js より最大30倍高速
TextDecoderのstreamオプションをサポート- chunk が完全な UTF-8 code point でなくても、より大きなストリームの一部として処理できる
bytes()メソッドを追加Response、Blob、Bun.file()などで stream データをUint8Arrayとして返す- 従来の
arrayBuffer()のあとにUint8Arrayを生成する手間を減らす
- ストリーミング
fetch()upload をサポート- 大きなファイルや content length を事前に把握できないデータストリームのアップロードに有用
console.group()とconsole.groupEnd()を実装URL.createObjectURL()をサポートBlobから URL を作成し、fetch()、Worker、import()に使える- Worker script も Bun transpiler を通るため TypeScript 構文を使える
AbortSignal.any()は複数のAbortSignalを結合し、1 つが abort されると親 signal も abort されるようにする
動作変更と移行時の注意点
bun runの作業ディレクトリが変更- 以前は shell の現在の作業ディレクトリを使用
- Bun 1.2 では
package.jsonの親ディレクトリをスクリプトの作業ディレクトリとして使用 npm、yarnの動作に合わせるための変更
bun testはテスト間の uncaught error または rejection を失敗として報告- 以前はこのようなエラーがテスト失敗として処理されないことがあった
server.stop()は теперьPromise<void>を返す- in-flight な HTTP connection が閉じるまで待機可能
Bun.build()は失敗時、resolve された結果のlogsにエラーを入れる代わりに reject する- 従来の動作が必要なら
throw: falseを設定可能
- 従来の動作が必要なら
bun -pは Node.js に合わせてbun --printの alias になる- 以前は
bun --portの alias だった
- 以前は
bun build --sourcemapのデフォルト値が inline source map から linked source map に変更- 以前の動作が必要なら
--sourcemap=inlineを使用
- 以前の動作が必要なら
パフォーマンス改善
- Bun 1.2 には複数の実行経路でパフォーマンス改善が含まれる
node:http2: 2倍高速node:http経由の S3 アップロード: 5倍高速path.resolve(): 30倍高速fetch()DNS resolution: 2倍高速bun --hot: メモリ使用量が2分の1- macOS
fs.readdirSync(): 小さなディレクトリの読み取りが5%高速化 String.at(): 44%高速化- 大きな文字列入力の
atob(): 最大8倍高速 fetch()gzip データの展開: 30%高速- 大きな入力の
Buffer.from(string, "base64"): 6倍〜30倍高速 - 大きな文字列入力の
JSON.parse(): 2倍〜4倍高速、object 入力は 6%高速 - 一部の
Bun.serve()アプリケーションのスループット: 最大2倍向上 Error.captureStackTrace(): 9倍高速- 小さなファイルの
fs.readFile(): 最大10%高速 - 文字列引数の
console.log(): 50%高速
- Windows では JavaScriptCore の JIT が有効化
- 以前は JIT は macOS と Linux でのみ利用可能だった
- Windows で JavaScript が全体的により高速に実行される
- 例として
Object.entries()は20%、Array.map()は50%高速化
インストールとアップグレード
- 新規インストールコマンド
curl -fsSL https://bun.sh/install | bashpowershell -c "irm bun.sh/install.ps1 | iex"npm install -g bunbrew tap oven-sh/bunの後にbrew install bundocker pull oven/bun
- すでにインストール済みの Bun は
bun upgradeでアップグレード
1件のコメント
Hacker News の意見
なぜサードパーティのデータベースと外部 S3 ライブラリをコア/標準ライブラリに入れるのか分からない
こういうものは任意のライブラリのほうがよいのではないかと思うし、この種のランタイムは標準ライブラリに入れる項目を非常に慎重に選ぶべき
早くもキッチンシンクのように何でも詰め込むプロジェクトという印象がある
バッテリー同梱方式は多くの場面で人気があり、選ばれている道でもある
TypeScript の設定も難しいし、Webpack、S3、Postgres、Jest なども同様なので、単純化されたファイル/ストリームアクセスもかなり興味深い
分散デプロイ提供者がどう出てくるか見守ればよさそう
もちろん間違っているかもしれないが、こうした依存関係をコア/標準ライブラリに入れるのは実際あまり筋が通らない
コアに入れればサードパーティライブラリよりさらに最適化できると見ているようだ
個人的には誤ったアプローチで、Jared は野心が大きくなりすぎた感じがするが、結局は彼の情熱プロジェクトではある
Bun 側の表現では「Bun はクラウドファーストの JavaScript ランタイムを目指している。つまり、クラウドでプロダクションアプリケーションを実行するために必要なすべてのツールとサービスをサポートする」ということだが、この言葉はあまり信頼感を与えない
この特定の設計選択はNode よりさらに悪く見える
VC 支援ソフトウェアの問題は、こうした統合機能が常に独自の何かを提供しようとし、言い換えればロックインを作ろうとするところにあった
これまでの Bun の使用体験は非常によかった
新しいプロジェクトで TypeScript/Jest/React/Webpack を設定するとき、あちこちの破壊的変更のせいでいつも気が進まなかったが、Bun では自前で解決されていて、苦痛なく自分の用途ではそのまま動く
S3 や SQL のようなサードパーティライブラリ統合については何とも言いにくいが、少なくとも最も一般的に使われ、要望の多いものに集中しているように見える
Node.js ツールエコシステムに必要だった健全さをもたらしてくれてよい
他のツールもこの間かなり進歩した点を過小評価しているように思う
自分にとっては生産性のチートコードのような存在
ChatGPT が Bun をよく知らないので生産性の損失が少しあるが、それでも Bun が好き
よい内容は多いが、デフォルト動作の一部があまりにも魔法のように隠れた動作に向かっているのではないかと心配
new Response(s3.file(...))を使うと、S3 ファイルをサーバーにダウンロードしてユーザーに送る代わりに、Bun がユーザーを S3 ファイルの事前署名付き URL にリダイレクトするデフォルトとしてはかなり驚く選択で、S3 バケットを直接露出したくない場合にこれをどう無効化するのかもまったく明確ではない
当初はこのプロジェクトに期待していたが、ソーシャル上で公開される散発的で、個人的にはしばしば好ましくない設計判断を見ると、長期的な方向性を信頼できない
v0.x のままならよかったかもしれないが、1.0 を出したなら API 表面を増やす基準はずっと高くあるべきだった
Response(file.stream())個人的には副作用の強い動作のように感じるし、読む限りでは URL ではなくファイル内容を返すように見える
それでもバケットの露出の何が気に障るのかも気になる
事前署名付き URL なので、広範なアクセス権を与えるわけでもない
むしろ
Response((file(...).getPresignedURL()))のような明示的 API のほうがよく、あるいは環境変数や Bun の設定でこの動作を有効化できる選択肢のほうがよかったと思うバッテリー込みは大きな違いを生む
Fetch API、Service Workers、Web Components、ES6+、WebRTC のような Web API が、いまでは V8 と WebKit ランタイムの両方でネイティブになっている点を好ましく思う理由もそこにある
ただし限度はあるべき
S3 は行き過ぎかもしれないが、SQL ドライバーは理にかなっている
とはいえ、どこまで入れるかが問題
データベースは非常に多く、そのうち半分のドライバーを入れるべきなのか?
そのレベルだけでも追加コードが多くなり、実行ファイルが遅くなる可能性がある
また、このようなセンシティブな API を Bun に入れると、セキュリティも見落としかねない
何らかのスクリプトやパスの問題で
evalが実行され、Bun がソースファイル全体を個人の S3 にアップロードするところを想像してみると、その瞬間に終わりコードがランタイムにロードされる方式によっては、ほとんど無視できるレベルかもしれないと思った
import文が見えたときだけコードのロードがトリガーされるなら、実質的に速度オーバーヘッドはないのでは?静的リンクされていたとしても、コードが存在するという理由だけで、考慮に値するほど実行ファイルが遅くなる理由はよく分からない
メモリにロードする実行ファイルが文字どおり大きくなる程度はあるだろうが、体感できる遅さではなさそう
核心は、ライブラリの保守責任が誰にあり、SQLite が変わったときにそのライブラリをどう変えるかということ
SQLite にバグがあったら、Bun ではどう直すのか?
どのバージョンに修正を入れるべきなのか?
ランタイムのパッチがその上で動くコードの挙動を変え得るが、ユーザーが既存の挙動に合わせて回避策を入れていた場合はどう扱うのか?
ある程度は解決可能な問題だが、デメリットも伴う
ある時点から、ランタイムではなく プラットフォーム になり、それに伴う別の責任と問題が付いてくる
本物の Web 標準ではないが、多くの人が事実上の標準のように合わせて使っている対象でもある
最近、顧客企業が本番環境で Bun を使っている
速度とシンプルさのおかげで、Bun の開発体験はとんでもなく良いと聞いた
開発者体験 は長期的に大きな役割を果たす
コードベースやプロセスがめちゃくちゃだと、FAANG 級の報酬を出さない限り、優秀な人材を失うことになる
まだ Bun は使っていないが、機能一覧が長すぎて、すべてが堅牢でバグがないのかは懐疑的
自分が間違っていてほしいし、今後のプロジェクトで一度動かしてみるつもり
プロジェクト管理の観点では、まだ Node.js 100% 互換 でもないのに、なぜ S3 サポートに時間を使うのか少し混乱する
Next.js は非常に大きなエコシステムなので、Next.js の顧客を取り込めるなら、S3 サポートよりはるかに大きく成長できる
日常的に Node.js API サーフェス 全体のうち、実際にどれだけ使っているのか?
その中の奇妙なエッジケースに、実際どれだけ依存しているのか?
作業している人たちもロボットではない
ある作業は把握するのに時間がかかり、その間に別の作業をすることもできる
1人がすべてをやっているわけでもない
「Next.js の顧客を取り込めばもっと成長する」というが、何に向けた成長なのか?
それはお金にならない
これは VC 支援のプロジェクトであり、目標は Bun を無料で提供して世界中のユーザーを全員獲得することではない
Zig はメモリ安全性が非常に低い
もう生存していない変数を参照すると、セグメンテーションフォルトではなく、任意の無関係なメモリにアクセスする
デバッグモードやセーフモードでもそうだという[0]
変数名を死んだ状態としてマークし、死んでいればアクセスを防ぐメモリ生存性システムを上に載せるのは、そんなに難しいのか?
結局「未定義動作を使うな」[1] になる
だから、インターネットに公開される Web サーバーのようなところには、Zig 製のものは何も置きたくない
[0] : https://news.ycombinator.com/item?id=41720995
[1] : https://github.com/ziglang/zig/issues/16467#issuecomment-164...
去年使ってみたが、ずっとクラッシュしていた
bun addがpackage.jsonの空白とインデントを保持しないバグを修正し、今ではどれほど変なインデントでも保持するという項目がかなり笑える誰がこんなものを求めたのか、そしてなぜここにコードを書く価値があると考えたのか分からない
HTML のインポート がすごくて格好いい
Bun 1.2 で HTML のインポートをサポートし、フロントエンドのツールチェーン全体を単一の
import文で置き換えられるというBun.serveのstaticオプションに HTML インポートを渡せば始められるホットモジュール置換、CSS プリプロセス、Vue SFC コンパイラのようなフレームワーク別プラグインのロードは可能なのか?
静的ファイル配信は特に新しいものではないので、自分が何か見落としている気がする
Node.js の競合代替ほど失敗が約束されたプロジェクトもないと思っていたが、一度使ってみてよかった
テキストファイルと SQLite DB の更新を処理するスタンドアロンの実行スクリプトをたくさん作る必要があり、TypeScript、
bun:sqlite[1]、bun $ Shell[2] を設定ファイルやローカルの npm 依存関係管理なしでそのまま使えたその後、新しい JS/TypeScript プロジェクトでも使ってみたところ、内蔵バンドラー [3] やテストサポート [4] も活用でき、依存関係のインストールも一瞬で終わった
すべてが高速にすぐ動くのは実際に生活の質を上げてくれるもので、いまや Bun は新しい JS プロジェクトの第一候補になっている
[1] https://bun.sh/docs/runtime/shell
[2] https://bun.sh/docs/api/sqlite
[3] https://bun.sh/docs/bundler
[4] https://bun.sh/docs/cli/test
「こういうものは来年には npm にも全部入るだろうし、何の意味があるのか」という側だった
結局 Bun を使ってみて、本当に驚いた
開発者体験の小さな要素が積み重なると大きな差になる
自分のプロジェクトでは、Bun は本当に次世代のもののように感じる
少し前に初めて Bun を使ってみたが、体験は素晴らしかった
自分のすべてのプロジェクトでは TypeScript を使うために Webpack や Vite を設定していて、一度設定すればほぼ完璧に動くが、設定そのものが面倒で、小さなスクリプトにはそこまでする価値がない
一方で Bun はすぐに動いた
CLI で TS を「直接」実行しようとして、
node-tsか何かのツールを 10〜30 分いじりながら、「モジュールではない」「import/require が使えない」「ESM/CJS」といったひどいメッセージに対応し、よくある修正であるpackage.jsonのモジュールタイプ変更、tsconfigの変更、import/require方式の変更をすべて試した約 200 行のスクリプトを実行しようとして、最後の手段として Bun に切り替えたところ、見事に動いた
node --experimental-strip-types index.ts最新の Node でなければ、
tsxパッケージが自分にはうまく動いたts-nodeよりよかったただし、どちらの選択肢も型情報を単に捨てるだけで、Bun も同じ
方向性が気に入っている
特に S3 と Postgres のネイティブサポートを含めたのは、「自分でフレームワークを組み立てる」現状の代替として存在する価値があり、とても妥当だ
Rails や Laravel のようなあらゆる Web フレームワークではこれが標準であり、JS エコシステムもここから大きな恩恵を受けられる
次のステップは、マイグレーションとスキーマ管理、そしてファクトリー設定をうまく扱える、より優れた標準のテスト体験だと思う