🌍

Svelte に Biome を導入してみる

2024/12/10に公開

はじめに

Svelte Advent Calendar 2024 の10日目の記事です!
なので Svelte については知っている前提で説明を割と端折っています。

Svelte について知りたい方はコチラをどうぞ!

Biome とは?

format、lintなどが一瞬で完了します!

Biomeは JavaScript、TypeScript、JSX、JSON、CSS そして GraphQL のための高速なformatter であり、Prettier と97%の互換性を持ち、CIと開発者の時間を節約します。

https://biomejs.dev/

Biome は高速な formatter 兼 linter ツールです。
よく ESLintPrettier を1つにした感じなどと説明されることが多いです。概ねその通りだなと思う一方で実際は2つのツールを使っていたときよりも爆速かつ管理もシンプルになり、すこぶる開発体験が良いです。

筆者は React の開発の際に初めて Biome を試したのですが、高速な動作もさることながらシンプルに format や lint を管理できる点が魅力に感じ、それ以来は formatter/linter は Biome を積極的に採用しています。

そんな Biome がいつの間にか Svelte にも一部対応していたので導入してみようと思います!

Biome を Svelte で使う上での注意点(2024年12月現在)

Svelte はまだ部分的にサポートされいる状態です。具体的には <script> タグの部分しかサポートされていません。また .svelte ファイルを format する際はコードのインデントが最初から始まります。

 <script>
-  import Sample from "./Sample.svelte";
+import Sample from "./Sample.svelte";
 </script>

https://biomejs.dev/ja/internals/language-support/#html拡張言語のサポート

Biome の導入

Svelte プロジェクトの作成

お好みの方法で Svelte プロジェクトを作成してください。

npm create svelte@latest my-app

Biome のインストール

npm i -D --save-exact @biomejs/biome

公式のページでは npm の他にも yarn/pnpm/bun/deno のコマンドについても書かれています。

設定ファイルの作成

npx @biomejs/biome init

上記のコマンドを実行するとデフォルトの biome.json が新規に作成される。

作成されるファイル
biome.json
{
	"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
	"vcs": {
		"enabled": false,
		"clientKind": "git",
		"useIgnoreFile": false
	},
	"files": {
		"ignoreUnknown": false,
		"ignore": []
	},
	"formatter": {
		"enabled": true,
		"indentStyle": "tab"
	},
	"organizeImports": {
		"enabled": true
	},
	"linter": {
		"enabled": true,
		"rules": {
			"recommended": true
		}
	},
	"javascript": {
		"formatter": {
			"quoteStyle": "double"
		}
	}
}

.svelte を lint する際はコンパイラエラーを防ぐためにいくつかのルールをオフにすることが推奨されているため、overrides オプションを追加する。

biome.json
{
@@ 省略 @@
  "overrides": [
    {
      "include": ["*.svelte"],
      "linter": {
        "rules": {
          "style": {
            "useConst": "off",
            "useImportType": "off"
          }
        }
      }
    }
  ]
}

Biome の設定

bimome.json だが biome.jsonc の形式もサポートしている。linter や formatter の設定は「なぜ無効にしているのか」を明文化しておきたいので biome.jsonc で管理するのが気に入っている。

linter

基本的には "recommend": true で問題ないように思うが、対応しないものは "off" にしていくのが良さそう。ここに推奨ルールを全て書くと長いことになるので参考となるドキュメントを貼っておく。

https://biomejs.dev/ja/linter/#推奨ルール

https://biomejs.dev/ja/reference/configuration/#linter

formatter

インデントはデフォルトがタブなのでスペースに変えたい場合は下記の通り。

biome.jsonc
{
  @@ 省略 @@
  "formatter": {
    "enabled": true,
    "indentStyle": "space",
    "indentWidth": 2
  },
  @@ 省略 @@
}

それ以外の設定は linter 同様参考となるドキュメントを貼っておきます。

https://biomejs.dev/ja/reference/configuration/#formatter

実際に動かしてみる

"scripts" に登録する

"scripts" にコマンドを登録する。これで CI などの際にも呼び出しやすくなる。

package.json
 {
 @@ 省略 @@
   "scripts": {
     @@ 省略 @@
+    "lint": "biome lint ./src"
   },
 @@ 省略 @@
 }

lint を実行

npm run lint

npm run lint を実行してエラーが出る様子

しっかりエラーが出ていて良い感じ。さほど大きなプロジェクトではないですが動作も爆速です!

またコード修正のコマンドもあるため活用すると捗ります。

https://biomejs.dev/ja/linter/#コード修正

format を試す

VSCode 拡張機能が公式から提供されているため、インストールした上で設定すると自動で format してくれます。また拡張機能は quick fix を出してくれたりもするので便利です。

https://marketplace.visualstudio.com/items?itemName=biomejs.biome

設定のサンプル
.vscode/settings.json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "biomejs.biome",
  "[javascript]": {
    "editor.defaultFormatter": "biomejs.biome"
  },
  "[typescript]": {
    "editor.defaultFormatter": "biomejs.biome"
  },
  "editor.codeActionsOnSave": {
    "quickfix.biome": "always",
    "source.organizeImports.biome": "always"
  }
}
コマンドで使いたい場合

先に注意した通り <script> 内はインデントのない状態から始まるため、ここは好みが別れそう。

App.svelte
 <script lang="ts">
-  import Header from "./components/Header.svelte";
-  import ModeController from "./components/ModeController.svelte";
-  import MainBoard from "./components/MainBoard.svelte";
-  import NumController from "./components/NumController.svelte";
-  import Footer from "./components/Footer.svelte";
+import Footer from "./components/Footer.svelte";
+import Header from "./components/Header.svelte";
+import MainBoard from "./components/MainBoard.svelte";
+import ModeController from "./components/ModeController.svelte";
+import NumController from "./components/NumController.svelte";
 </script>

まとめ

Biome は Svelte プロジェクトにも導入でき、特にその高速性とシンプルさが魅力的です。

また日本語のドキュメントも充実しており、初めて触れる方でも比較的スムーズに設定・利用が進められると思います。ただ一方で <script> 内のインデント仕様など、現時点では一部好みが別れる点もありますが、個人的にはそれを踏まえても十分に試す価値があると考えています!

Discussion