Bun 1.0が公開
2023年9月9日(日本時間)、JavaScriptおよびTypeScriptランタイムである「Bun 1.0」が正式に公開されました。
BunはJavaScriptとTypeScriptを実行、構築、テスト、デバッグするための高速なオールインワンツールキットで、今回の安定版リリースにより、開発のさらなる効率化が期待できます。
BunはJavaScriptとTypeScriptの実行、ビルド、テスト、デバッグを容易にします。開発者たちはこれによって、ワークフローの効率化やリソース制約下でのスムーズな本番コードの実行を期待できます。
【参考】:Bun 1.0
Windows用では実験的なネイティブビルドを提供
従来のBunではmacOSとLinux用のネイティブビルドが提供されており、Windowsの場合はWindows Subsystem for Linuxが必要でした。今回のBun 1.0ではWindows版の実験的なネイティブビルドがリリースされています。
ただし、Windows版はまだ実験的な段階で、JavaScriptランタイムのみがサポートされており、パッケージマネージャ・テストランナー・バンドラーは安定するまで無効化され、パフォーマンスもまだ最適化されていません。
開発チームは開発ブログで今後数週間でWindowsへのサポートを急いで改善する予定であると述べています。
Bunとは
ここでは、JavaScript開発環境においてBunが登場した背景や、その開発目標について説明します。
Bunが登場した背景とは
JavaScriptの開発環境には、Node.jsやDenoなどのランタイムなどを始めとして多くの優れたツールがあります。
しかし、Bunの開発者はその一方で、数多くのノードモジュールや複数の設定ファイル・バンドラーのプラグインなどの利用が、開発プロセスを複雑にしている面もあることを指摘しています。
Bunはこの状況を改善するため、JavaScriptのメリットを残しながら、複雑さを排除してより直感的にコードを実行できることを目的に開発されています。
【参考】:Youtube | Bun 1.0 is here
Bunの開発目標とは
Bunはその開発目標として、動作のスピード・簡潔なAPI・オールインワンのツールキットであることの3点を掲げています。
■スピード
Bunがまず目指したのはスピードです。Bunはパフォーマンス重視のJavaScriptエンジンであるJavaScriptCoreを拡張することで、素早く起動し、高速な実行を可能にしています。
■簡潔なAPI
BunはHTTPサーバーの起動やファイルの書き込みなど、一般的なタスクを実行するために最適化され、必要最低限の要素で構成されたAPIを用意しています。
■オールインワンのツールキット
Bunは、パッケージマネージャー・テストランナー・バンドラーなど、JavaScriptアプリを構築するために十分なツールキットを提供します。開発者はこれらのツールを利用することで、効率的な開発が可能です。
【参考】:Bun — A fast all-in-one JavaScript runtime
Bunの特徴
プログラミング言語のZigで実装されているBunは、Node.jsやDenoなどと同様のJavaScriptランタイムの役割を持ちますが、他にもJavaScript/TypeScriptを使用してアプリを構築するための統合的なツールキットとしての数々の特徴を持っています。
Node.jsとの互換性を目指している
Bunは広く使用されているJavaScriptランタイムであるNode.jsとの完全な互換性を目指して設定されています。
既存のNode.jsアプリケーションとnpmパッケージは、Bunでそのまま動作が可能で、Node.jsのグローバル変数であるprocess・Bufferや、path・fs・httpなどのモジュール類もサポートしています。
【参考】:Github oven-sh/bun
【参考】:Node.jsの互換性
オールインワンツールである
Bunは、Node.jsにおけるパッケージ管理システムであるnpmやモジュールバンドラーなどの機能が初めから含まれています。
これらのツールは、ほとんど変更をすることなく既存のNode.jsプロジェクトで使用することができます。フロントエンドフレームワークのNext.jsを動作させることも可能です。
ESMとCommonJSをサポート
Node.jsでは従来からモジュールシステムとしてCommonJSを使うことで、別のファイルや外部ライブラリのコードを使うことができます。
近年はES Modules(ESM)の利用が増加していますが、npm上の多くのパッケージはいまだにCommonJSを必要としています。
BunはESMとCommonJSをどちらもサポートしており、ESMのようにimportやexoportが使用できる一方で、CommonJS同様requireや__dirnameも使用することができます。
Web標準APIを実装
BunはfetchやWebsocket、ReadableStreamなどのWeb標準APIを実装しています。Safari用に開発されたJavaScriptCore engineを使用しており、HeadersやURLなど一部のAPIはSafariに実装されているものを直接使用します。
ホットリロードが可能
・-hotオプションを使うと、ファイルが変更されたときにアプリケーションをリロードするホットリロードを有効にすることができます。Bunのホットリロードは古いプロセスを終了せずにコードを再読み込みするため、HTTPやWebSocket接続が切断されません。
【参考】:Bun公式ブログ
【参考】:What is Bun? | Bun Docs
オールインワンツールであるBunが持つ機能とは
Bunは、JavaScriptランタイムとしてだけでなく、多くの機能を備えたオールインワンツールです。従来の様々なツールの役割をBunが担うことでJavaScript開発環境がより簡潔になり、開発効率が向上することが期待できます。
ランタイム
Bunは、ほとんどのNode.jsアプリケーションを実行することができます。 Expressや、軽量フレームワークのKoa、Cloudflare Wokersで使えるフレームワークであるHonoなどのサーバーフレームワークは問題なく動作します。
開発に必要な様々な機能が1通り揃っているフルスタックフレームワークも、広く使われているものはその多くが動作します。
また、Bunの特徴はそのスピードです。公式サイトでは、Node.jsの最大4倍早く起動することが示されています。他のランタイムがGoogeのJavaScriptエンジンであるV8を利用しているのに対し、BunはAppleのWebKitを使っていることをその理由として挙げています。
【参考】:Bun is a JavaScript runtime
パッケージマネージャー
Bunはnpm互換のパッケージマネージャー機能も備えています。例えば「npm install」を「bun install」とするなど、npmを使うようにBunを使用することができます。
また、インストールのスピードの速さもnpm・yarn・pnpmなどのパッケージマネージャーと比較して圧倒的に速いことが示されています。
【参考】:Install speeds
テストランナー
JavaScript開発環境では、テスティングフレームワークとして、シンプルで軽快な動作が特徴のJestが広く使用されています。
Bunは、Jestと互換性のあるテストモジュールが組み込まれており、JestやVite環境で利用できるユニットテストフレームワークのViestからの移行も簡単です。
テストランナーとしての動作もやはり高速です。Bun のマッチャーは高速なネイティブ コードで実装されていて、「Expect().toEqual()」の実行速度がJestやVitestよりも速いことが示されています。
【参考】:Bun is a test runner
バンドラー
Bunは、複数のJavaScriptファイルなどを1つにまとめるバンドラーの機能を有しています。Webpackを始めとして多くのバンドラーが存在しますが、Bunは高速な動作を特徴とするバンドラーのesbuildと互換性のあるプラグインAPIを提供しています。
【参考】:Bun is a bundler
Bunを導入してJavaScript開発のスピードアップを目指そう
ここまでBunが登場した背景やその特徴、オールインワンツールとして持つ多様な機能について解説してきました。
JavaScript開発環境には多くの有用なツールがありますが、その結果として生じた複雑さや不透明さを取り除き、開発者に快適な開発環境を提供することを目的としていることが分かったと思います。
また、あらゆる面でスピードを重視した設計となっており、JavaScript開発者の開発速度をさらに向上させてくれることが期待できます。
macOSとLinuxを使っていて、JavaScriptの開発効率を改善したい方は、1度Bunを試してみることをおすすめします。
また、今回、Bun 1.0の登場で、まだJavaScriptランタイムのみではありますがWindows環境にも対応を開始しました。今後、Windowsユーザの方もBunの動向に注目しておくと良いでしょう。