このブログを書いている時点ですでにv1.0.2まで上がっていますが、先日Bunの安定版v1.0がリリースされました。
というわけであらためてBunまわりの歴史についておさらい。とは言ってもあまり詳しいことまでは話しません(話せません)。
Bunとは
今までこのブログでも何度か取り上げたような気がしますが、BunはJavaScriptのランタイムです。
Node.jsのようなものと考えてもらえばまあ7-8割方問題ありません。色々違うところはありますが、とりあえずはこんな感じで理解してください。違いはこの後で説明します。
諸々の背景
Node.js登場
Node.jsは、言わずとしれたJavaScriptランタイムの走りです。正確にはNode.jsの前にもJavaScriptランタイムはあったのですが、高速なV8エンジンとシングルスレッド・ノンブロッキングI/Oアーキテクチャを採用したNode.jsは当時ウェブ開発者を悩ませていたC10K問題に対するアプローチということもあり、界隈に受け入れられました。技術的な詳細は以前さくらのナレッジに書いた記事をご覧ください。
中にはNode.jsが嫌いな人(というかJavaScriptでバックエンドを書きたくないという人)もいますが、かつてはバックエンド開発といえばPHPかPythonかRubyだった時代に対して、今ではJavaScriptも十分選択肢に入っていると言えるでしょう。
そんなNode.jsも機能面で成熟していきましたが、JavaScript(というかECMAScript)にもいろいろ新しい構文や仕様が盛り込まれると、後方互換性を重視するNode.jsでは色々時代遅れな部分も出てきました。
詳しいことはNode.jsの作者自身による10の後悔を見ていただきたいのですが、ECMAScriptの仕様追加の中で特に大きな時代遅れとなったものはモジュール(ES Modules)と非同期処理(Promise
,
async
/await
)でしょうか。あとはNode.jsそのものの設計についても色々後悔があったようです。
Denoで再設計
そこで、Node.jsの作者は新たなJavaScriptランタイムを作ることにしました。それがDenoです。Denoについても以前さくらのナレッジに書いたのですが、
- モジュール管理にES Modulesのみを採用
-
標準ライブラリーの非同期処理に
Promise
,async
/await
を採用 - TypeScriptで書いたソースコードをそのまま動かせる
などの特徴があります。他にも、バンドラーやテストフレームワークが内包されているので別途ツールを導入する必要がないという特徴もあります(でも内包のバンドラーは非推奨らしい)。
そんな鳴り物入りで登場したDenoですが、Node.jsを反省して理想の世界を作ろうとするあまり、Node.jsとの互換性をほぼ完全にぶっ壊してしまいました。これについても上記さくらのナレッジに書いていますが、やはりというか開発者からの評判はよくなかったようで、最近のDenoはNode.jsとの互換性にも力を入れています。
Bun登場
・・・と、あちらこちらに迷走しているDenoを横目に颯爽と登場したのがBunです。こちらは最初からNode.jsとの互換性を謳っているのに加えて
- ES Modulesにネイティブで対応
-
Promise
,async
/await
にネイティブで対応 - TypeScriptにもネイティブで対応
- バンドラーやテストフレームワークを内包
.env
から環境変数を自動的に読み込む
などなど、後発の強みを活かしてNode.jsとDenoのいいところを取り入れ、さらに開発現場でよく使われる仕組みをデフォルトで使えるようにしています。
そして、BunはJavaScriptのエンジンにJavaScriptCoreを使っています。Node.jsおよびDenoはV8なので、要するにGoogle Chrome陣営(Node.js/Deno) vs Safari陣営(Bun)という構図です。Firefoxがんばれ超がんばれ。
Bunはまた高速性も謳っていますが、正直このあたりは話半分で聞いています。特にバックエンドではプログラム本体以外の処理(DBへの読み書きなど)が応答速度の8割9割を占めることも珍しくないので、実行速度がどれだけ速くても全体への影響はそこまで大きなものではありません。もちろん速いに越したことはないのですが、それより安定性や使いやすさ、エコシステムの充実度などランタイム選定の際に優先すべき項目は色々あります。
おわりに
Bun v1.0のリリースに合わせて駆け足でNode.jsからBunまでの歴史を追ってみました。え?io.js?Ayo.js?知らん。気にするな。
0 件のコメント:
コメントを投稿