Bun: モダンなJavaScriptランタイムの登場

近年、JavaScriptエコシステムは急速に進化し、新しいツールやランタイムが登場しています。その中でも、Bunという新しいJavaScriptランタイムが注目を集めています。Bunは、モダンなJavaScriptエコシステムに対応するためにゼロから構築された新しいランタイムで、その設計には3つの主要な目標があります。

  1. 速さ: Bunは高速で起動し、高速に実行されます。これは、計算がエッジコンピューティングへ移行する中で非常に重要です。Bunは、Safari向けに構築されたパフォーマンス志向のJavaScriptエンジンであるJavaScriptCoreを拡張しています。つまり、高速な実行がBunの特徴の1つです。
  2. 優れたAPI: Bunは、共通のタスクを実行するための最小限の最適化されたAPIを提供します。たとえば、HTTPサーバーを起動したり、ファイルを書き込んだりする際に役立つAPIが含まれています。このようなAPIの使用は、開発者の生産性を向上させ、コードをシンプルかつ効率的に保つのに役立ちます。
  3. 統合された開発体験: BunはJavaScriptアプリを構築するための完全なツールキットであり、パッケージマネージャー、テストランナー、バンドラーなどを提供しています。これにより、開発者はアプリケーションの開発からテスト、バンドルまで、一貫したツールセットを利用できます。

また、BunはNode.jsの代替として設計されており、Node.jsやWeb APIなど、数百ものNode.jsとWeb APIをネイティブに実装しています。これにより、既存のNode.jsプロジェクトをBunに移行することが容易に行えます。

Bunの目標は、世界中のほとんどのサーバーサイドJavaScriptを実行し、パフォーマンス向上、複雑さの削減、開発者の生産性の向上をサポートするツールを提供することです。JavaScriptエコシステムの未来を明るくするために、Bunは新しい選択肢として期待されています。

新しい時代のJavaScriptランタイムとして、Bunはどのようなプロジェクトに適しているのか、その素晴らしい機能やパフォーマンスを活用して、開発者コミュニティに貢献することで、私たちのJavaScriptエコシステムをさらに進化させています。将来のプロジェクトにBunを取り入れることで、高速で効率的なJavaScriptアプリケーションの開発が可能になるでしょう。

JavaScriptおよびTypeScriptアプリケーションのためのオールインワンツールキット

続いて、Bunの魅力的な特徴について詳しく見ていきましょう。BunはJavaScriptおよびTypeScriptアプリケーション向けのオールインワンツールキットで、単一の実行可能ファイルで提供される「bun」というコマンドラインツールを含みます。

Bunランタイム: Bunの中核には、Node.jsの代替として設計された高速なJavaScriptランタイムであるBunランタイムがあります。これはZigで書かれ、内部ではJavaScriptCoreを活用しており、起動時間とメモリ使用量を劇的に削減します。この特徴により、Bunは高速な実行を実現し、リソース制約のある環境で効果的にプロダクションコードを実行できます。

コマンドラインツール: “bun”コマンドラインツールは、テストランナー、スクリプトランナー、およびNode.js互換のパッケージマネージャーも実装しており、既存のNode.jsプロジェクトで使用する際にも、ほとんどまたは全く変更を加える必要がありません。これにより、以下のような多くのタスクを迅速に実行できます。

bun run index.tsx   # TypeScriptおよびJSXをサポート(ボックスから提供)
bun run start       # `start`スクリプトを実行
bun install <pkg>   # パッケージをインストール
bun build ./index.tsx  # プロジェクトをブラウザ向けにバンドル
bun test            # テストを実行
bunx cowsay "Hello, world!"   # パッケージを実行

Bunはまだ開発中ですが、開発ワークフローを加速したり、サーバーレス関数などのリソース制約のある環境でシンプルなプロダクションコードを実行するのに利用できます。また、Node.jsとの互換性や既存のフレームワークとの統合を向上させる作業も進行中です。Bunの今後のリリース情報を追跡するために、Discordに参加し、GitHubリポジトリをウォッチしてください。

ランタイムとは?: JavaScript(または正式にはECMAScript)は、プログラミング言語の仕様です。誰でも、有効なJavaScriptプログラムを取り込み、実行するJavaScriptエンジンを作成できます。現在最も人気のあるエンジンは、Googleが開発したV8と、Appleが開発したJavaScriptCoreです。どちらもオープンソースです。

ランタイムの役割: しかし、ほとんどのJavaScriptプログラムは単独で実行されるわけではありません。これらは、有用なタスクを実行するために外部の世界にアクセスする方法が必要です。ここでランタイムが登場します。ランタイムは、実行するJavaScriptプログラムに提供される追加のAPIを実装します。ブラウザには、Web固有のAPIを実装したJavaScriptランタイムが組み込まれており、これらのAPIはグローバルなwindowオブジェクトを介して利用できます。

Node.js: 同様に、Node.jsはサーバーなどの非ブラウザ環境で使用できるJavaScriptランタイムです。Node.jsで実行されるJavaScriptプログラムは、OSレベルのタスクを実行するための組み込みモジュール(node:fsなど)およびNode.js固有のグローバル(Buffer、process、__dirnameなど)にアクセスできます。Node.jsはCommonJSベースのモジュールシステムと解決アルゴリズムも実装しており、JavaScriptのネイティブモジュールシステムよりも前から存在しています。

Bun:Node.jsの代替としての設計: Bunは、Node.jsの代替として設計され、以下のデザイン目標を持っています。

  • 速さ: Bunは、現在のNode.jsに比べて4倍高速にプロセスを起動します。
  • TypeScriptおよびJSXサポート: .jsx、.ts、および.tsxファイルを直接実行でき、実行前にこれらを純粋なJavaScriptに変換します。
  • ESMおよびCommonJS互換性: BunはESモジュール(ESM)への移行を推奨しますが、npmのミリオン単位のパッケージがまだCommonJSを必要としているため、CommonJSもサポートしています。
  • Web標準API: Bunはfetch、WebSocket、ReadableStreamなどの標準Web APIを実装しています。BunはAppleがSafari向けに開発したJavaScriptCoreエンジンを使用しており、HeadersやURLなどの一部のAPIはSafariの実装を直接使用しています。
  • Node.js互換性: Node.jsスタイルのモジュール解決をサポートするだけでなく、Node.jsのビルトインモジュール(process、Bufferなど)およびモジュール(path、fs、httpなど)との完全な互換性を目指しています。これは現在も進行中の取り組みで、現在のステータスについては互換性ページを参照してください。

最終的な目標は、BunをJavaScript/TypeScriptでアプリケーションを構築するための統一されたインフラストラクチャツールキットとして提供し、パッケージマネージャー、トランスパイラ、バンドラ、スクリプトランナー、テストランナーなどを含めることです。Bunは、新しいランタイムとしてだけでなく、開発者の生産性を向上させるための包括的なツールセットとして、JavaScriptエコシステムを進化させることを目指しています。

Bunのインストール

Bunは、いくつかの異なる方法でインストールできる単一の実行可能ファイルとして提供されています。

macOSおよびLinux Linuxユーザー:Bunをインストールするにはunzipパッケージが必要です。Kernelバージョン5.6以上が強く推奨されますが、最小要件は5.1です。

  • macOS / Linux(curlを使用)
  • NPM(Node Package Manager)
  • Homebrew
  • Docker
  • Proto

以下は、macOS、Linux、およびWSL(Windows Subsystem for Linux)で使用できるインストールコマンドの例です(curlを使用):

curl -fsSL https://bun.sh/install | bash # macOS、Linux、およびWSL用

Windows Bunは、Windows向けに限定的で実験的なネイティブビルドを提供しています。現時点では、Bunランタイムのみがサポートされています。

bun <file>
bun run <file>

テストランナーやパッケージマネージャー、バンドラはまだ開発中であり、以下のコマンドは無効化されています。

bun test
bun install/add/remove
bun link/unlink
bun build

アップグレード 一度インストールされたら、バイナリ自体をアップグレードできます。

bun upgrade

Homebrewユーザーの場合は、Homebrewとの競合を避けるために次のようにしてbunをアップグレードしてください。

bun upgrade

protoユーザーの場合は、次のようにして最新のcanaryビルドにアップグレードできます。

bun upgrade

TypeScript プロジェクト内でBunの組み込みAPIのTypeScript定義をインストールするには、bun-typesをインストールします。

bun add -d bun-types # 開発用依存関係

次に、tsconfig.json内のcompilerOptions.types"bun-types"を含めます。

{
  "compilerOptions": {
    "types": ["bun-types"]
  }
}

TypeScriptサポートに関する詳細なガイドは、「エコシステム > TypeScript」を参照してください。

コンプリーション Bunのインストール時には、シェル自動補完が自動的に設定されるはずです。

設定されていない場合は、以下のコマンドを実行します。これにより、使用しているシェルを特定し、適切な場所に補完ファイルを書き込みます。bunのアップグレードごとに自動的に再実行されます。

bun completions

カスタムの場所に補完ファイルを書き込むには、次のようにします。

bun completions > path-to-file      # ファイルに書き込む
bun completions /path/to/directory  # ディレクトリに書き込む

これで、Bunのインストールと設定が完了しました。このユニークなツールを活用して、効率的な開発を行いましょう。

クイックスタート

簡単なHTTPサーバーを組み立ててみましょう。Bunに組み込まれているBun.serve APIを使用します。まず、新しいディレクトリを作成します。

mkdir quickstart
cd quickstart

新しいプロジェクトをスキャフォールドするには、bun initを実行します。これは対話型のツールで、このチュートリアルでは各プロンプトのデフォルト回答を受け入れるために単にEnterキーを押します。

bun init

「bun init」は、最小のプロジェクトで始めるのを助け、適切なデフォルトを推測しようとします。いつでも^Cを押して終了できます。

パッケージ名(quickstart): エントリーポイント(index.ts):

完了しました! package.json ファイルが現在のディレクトリに保存されました。

  • index.ts
  • .gitignore
  • tsconfig.json(エディタのオートコンプリート用)
  • README.md

開始するには、次のコマンドを実行します:

bun run index.ts

エントリーポイントが*.tsファイルの場合、Bunはtsconfig.jsonを自動生成します。通常のJavaScriptを使用している場合、jsconfig.jsonが代わりに生成されます。

ファイルの実行

index.tsを開いて、Bun.serveを使用して簡単なHTTPサーバーを実装する以下のコードスニペットを貼り付けます。

const server = Bun.serve({
  port: 3000,
  fetch(req) {
    return new Response(`Bun!`);
  },
});

console.log(`Listening on http://localhost:${server.port} ...`);

シェルからファイルを実行します。

bun index.ts

次に、サーバーをテストするためにhttp://localhost:3000にアクセスします。シンプルな「Bun!」と書かれたページが表示されるはずです。

スクリプトの実行

Bunは、package.jsonから “スクリプト” を実行することもできます。次のスクリプトを追加します。

{
  "name": "quickstart",
  "module": "index.ts",
  "type": "module",
  "scripts": {
    "start": "bun run index.ts"
  },
  "devDependencies": {
    "bun-types": "^0.7.0"
  }
}

それから、bun run start で実行します。

bun run start

Performance – bun runnpm run よりも約28倍高速です(オーバーヘッドの6ms対170ms)。

パッケージのインストール

サーバーをもう少し面白くするために、パッケージのインストールを行いましょう。まず、figletパッケージとその型定義をインストールします。Figletは文字列をASCIIアートに変換するためのユーティリティです。

bun add figlet
bun add -d @types/figlet # TypeScriptユーザーのみ

次に、fetchハンドラでfigletを使用するようにindex.tsを更新します。

import figlet from "figlet";

const server = Bun.serve({
  fetch() {
    const body = figlet.textSync('Bun!');
    return new Response(body);
    return new Response(`Bun!`);
  },
  port: 3000,
});

サーバーを再起動し、ページをリフレッシュします。新しいASCIIアートバナーが表示されるはずです。

  ____              _
 | __ ) _   _ _ __ | |
 |  _ \| | | | '_ \| |
 | |_) | |_| | | | |_|
 |____/ \__,_|_| |_(_)

これで、Bunを使用してシンプルなHTTPサーバーを作成し、パッケージをインストールしてカスタマイズする方法がわかりました。

今日はここまで!