BunとBiomeで開発環境を構築する

JavaScriptではなくTypeScriptで開発することが多く、そのためのセットアップの手間がそれなりに必要となります。BunというNode.jsランタイムがデフォルトでTypeScriptに対応しているので、環境構築してみました。

ついでにBiomeを使ってLinter、Formatterをセットしていきます。

Bunのインストール

macOSにBunをインストールをインストール方法はいくつかありますが、本記事ではHomebrewでインストールしていきます。

$ brew install oven-sh/bun/bun

それ以外のインストール方法については公式の記事を参照してください。

Biomeのインストール

macOSにBiomeをインストールするにはHomebrewを使います。

$ brew install biome

biomeコマンドが使用可能になるため、プロジェクト個別にBiomeパッケージをインストールしません。

プロジェクトの作成

Bunでプロジェクトを作成する方法にはbun initbun createの2つがあります。テンプレートを元にプロジェクトを作成する場合はbun createを使用し、空のプロジェクトを作成する場合はbun initを使用します。

今回は空のプロジェクトを作成するので、bun initを使用します。

$ mkdir bun-demo
$ cd bun-demo
$ bun init
bun init helps you get started with a minimal project and tries to guess sensible defaults. Press ^C anytime to quit

package name (bun-demo): 
entry point (index.ts): src/index.ts

Done! A package.json file was saved in the current directory.
 + index.ts
 + .gitignore
 + tsconfig.json (for editor auto-complete)
 + README.md

To get started, run:
  bun run index.ts

質問は2つで、パッケージ名(package name)とエントリーポイント(entry point)です。特に変更する必要がなければそのままエンターキーで進めます。

今回はテストケースも作成するので、エントリーポイントはsrc/index.tsにします。

Biomeをセットアップする

Biomeを使用可能にするためのセットアップを行います。Visual Studio Codeで開発する場合、Biomeプラグインを使うのが簡単です。

Preferences>Settingsで設定を開き、Workspaceを選択後に右上のOpen Settings (JSON)をクリックすると、プロジェクトルートに.vscode/settings.jsonが作成されます。

このファイルに以下のように記述します。

{
    "[typescript]": {
        "editor.defaultFormatter": "biomejs.biome",
        "editor.formatOnSave": true,
    },
    "editor.codeActionsOnSave": {
        "source.organizeImports.biome": "explicit"
    }
}

環境によっては一部の設定が不要となる場合がありますが、

        "editor.defaultFormatter": "biomejs.biome",

で、デフォルトのフォーマッターをBiome拡張機能に変更し、

        "editor.formatOnSave": true,

で、変更を保存するときにフォーマットするようにします。

これらの設定はTypeScriptのファイルだけに適用したいため、

    "[typescript]": {
        "editor.defaultFormatter": "biomejs.biome",
        "editor.formatOnSave": true,
    },

のように[typescript]内に書くようにしています。

また、変更を保存するときにインポートを再編成するため、

    "editor.codeActionsOnSave": {
        "source.organizeImports.biome": "explicit"
    }

の設定を行っています。

プログラムを作成して実行する

実際にプログラムを作成して実行してみます。

この後テストしやすいようにmain関数からロジックを分けておきます。

export function greet(name: string): string {
	return `Hello, ${name}!`;
}

greet関数をテストしておきます。Bunが提供するテスティングフレームワークを使ってテストします。

import { expect, test } from "bun:test";
import { greet } from "../src/greet";

test("should return hello world", () => {
	expect(greet("world")).toBe("Hello, world!");
});

テストはbun testコマンドで実行可能です。

$ bun test
bun test v1.1.7 (b0b7db5c)

test/greet.spec.ts:
✓ should return hello world [0.41ms]

 1 pass
 0 fail
 1 expect() calls
Ran 1 tests across 1 files. [57.00ms]

MochaやJestと遜色ない感じで使えます。モック機能もあるのでサードパーティ製パッケージを使う必要はなさそうです。

作成したgreet関数を使ってmain関数を書きます。

import { greet } from "./greet";

function main(args: string[] = process.argv.slice(2)): void {
	console.log(greet("world"));
}

main();

プログラムの実行はbun runコマンドを使用します。

$ bun run src/index.ts
Hello, world!

実行するエントリーポイントを指定して実行します。

Lintの実行

フォーマットは変更の保存時に自動で行われるため、Lintを使う必要はほぼないと思いますが、一応Lintコマンドも確認しておきます。

LintはBiomeを使用します。

$ biome lint src/**/*.ts
Checked 2 files in 4ms. No fixes needed.

Formatterでフォーマットしているので修正が必要な箇所はありませんでした。

まとめ

Bunを使えば、コマンドのインストールを除けばかなり簡単にプロジェクトをセットアップできます。Biomeもセットアップが簡単なので

速度をウリにしている部分もありますが、もう少し大規模なアプリケーションを使わないとなんとも言えないと思いますし、ネットワークなどの方が大きなボトルネックになるので、Node.jsやDenoなどとそれほど際はないかもしれません。

今回作成したプロジェクトは以下になります。

Biomeを使ってLintとFormatをおこなう

フロンドエンド向け垂直統合ツールチェーンRomeが開発終了となり、Rome開発チームのひとりが作成したのがBiomeです。

Rustで構築されたBiomeは既存のFormatter、Linterと比べ非常に高速に動作するように設計されています。設定も非常に簡単でエディタの拡張機能・プラグインも提供されていることから今後のデファクトスタンダードになりそうな予感があります。

本記事ではBiomeのインストールから基本的な使い方、エディタの統合について解説します。

Biomeをインストール

Biomeはグローバルインストールすることは可能ですが推奨されていないため、プロジェクトにインストールします。また、バージョン範囲演算子を使用しないでインストールすることを強く推奨しています。

$ mkdir biome-example
$ cd biome-example
$ npm init -y
$ npm install --save-dev --save-exact @biomejs/biome
$ npx @biomejs/biome init

Node.jsをインストールせずにBiomeを使用したい場合は、Homebrewなどを使ってインストールするスタンドアロン実行形式での利用も可能ですが、本記事では割愛します。

インストール後に初期化をおこなうとbiome.jsonが生成されます。

{
  "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json",
  "organizeImports": {
    "enabled": true
  },
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true
    }
  }
}

基本的な設定は済んでいるので、すぐに使い始められます。

Biomeの使い方

Biomeの基本的な使い方を見ていきます。

Formatter

Prettierのようにソースコードを整形してくれます。指定したディレクトリ内のファイルに対してソースコードの整形をおこなうには次のようなコマンドを実行します。

$ npx @biomejs/biome format src --write

このコマンドではsrcディレクトリを指定してフォーマットを行っていますが、単一ファイルやワイルドカード指定も可能です。

Linter

こちらはESLintの置き換えになります。次のようなコマンドを実行します。

$ npx @biomejs/biome lint src

こちらも単一ファイルの指定やワイルドカードでの指定が可能です。

Formatter+Lint+α

前述のFormatterとLinterに加えて、インポート文の再構成をまとめて実行するには次のようなコマンドを実行します。

$ npx @biomejs/biome check --apply src

通常はこのコマンドを使うことになると思います。

package.jsonにスクリプトを設定する

コマンドが少し長いのでpackage.jsonにスクリプトとして定義しておきましょう。

{
  "name": "biome-example",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "format": "biome format src --write",
    "lint": "biome lint src",
    "check": "biome check --apply src"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@biomejs/biome": "1.5.3"
  }
}

Visual Studio Codeの拡張機能を使う

開発時に都度コマンド入力するのは手間ですので、エディタ向けの拡張機能を利用するのがよいでしょう。

まずはVisual Studio Codeの拡張機能を使ってみます。

settings.jsonに以下の設定を追加します。

{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "[javascript]": {
    "editor.defaultFormatter": "biomejs.biome"
  },
  "editor.codeActionsOnSave": {
    "quickfix.biome": true,
    "source.organizeImports.biome": true
  }
}

以下の設定で、保存時にFormatterが実行されるように設定しています。

  "editor.formatOnSave": true,

デフォルトのFormatterはPrettierにしています。

  "editor.defaultFormatter": "esbenp.prettier-vscode",

言語モードがJavaScriptの場合、FormatterはBiomeになるよう設定しています。

  "[javascript]": {
    "editor.defaultFormatter": "biomejs.biome"
  },

保存時のアクションに、 Biomeによるフォーマット("quickfix.biome": true)とインポート文の再構成("source.organizeImports.biome": true)をおこなうように設定します。

この設定を行うことで、ファイルの保存時にソースコードの整形とインポート文の再構成をおこなってくれるようになります。

WebStormのプラグインを使う

IntelliJ向けのプラグインも提供されていますので、WebStormで使ってみます。

こちらは⌥⇧ ⌘ L or Ctrl+Alt+Lでファイルの整形ダイアログを表示して必要なオプションにチェックを入れて実行ボタンを押します。

まとめ

Biomeのインストール方法からエディタとの統合までを確認しました。 1つのパッケージで導入できてデフォルトで利用可能となっているだけでなく、エディタとの統合もサポートされているため、小さく始めて大きく育てるには非常に適したツールチェーンだといえます。

これまではPrettierとESLintを使っていましたが今後はBiomeを使ってみようと思います。

モバイルバージョンを終了