Biome(バイオーム)は、JavaScript・TypeScript・JSON・CSSなどの整形(フォーマッタ)と静的解析(リンター)を1つのRust製CLIで行う開発ツールチェーンです。2026年10月25日時点の最新版は2.6.3(2026年10月24日公開)で、2.6からMarkdown・YAML・SCSSも扱えるようになりました。この記事では、2.6.3をインストールして biome init・biome check・biome migrate を実行した結果をもとに、導入から設定、移行、CIへの組み込みまでを説明します。検証環境はmacOS(x86_64)、Node.js 26.5.0、Biome 2.6.3と比較用の2.5.14、ESLint 10.13.0、Stylelint 17.16.0です。
なお、いきもの図鑑アプリの「Biome(株式会社バイオーム)」やその投稿・チャット機能とは別のものです。本記事はWeb開発ツールのBiome(biomejs.dev)を扱います。
まとめ
- 最新版:2.6.3(2026年10月24日)。2.6.0は2026年10月21日にnpmへ公開され、Markdown・YAML・SCSSの整形、JavaScriptで書くプラグイン(開発者プレビュー)、設定の解決結果を表示する
biome inspectが加わりました。 - 更新時の注意:2.5から2.6へ上げると、設定を変えなくても
README.mdやGitHub ActionsのYAMLが検査対象に入ります。実測では検査対象が2ファイルから5ファイルに増え、既存のLintエラー1件に、新たな整形エラー3件が加わりました。 - 導入:
npm install -D -E @biomejs/biomeのあとnpx biome initでbiome.jsonを作ります。2.6ではGitリポジトリ内で実行すると.gitignoreの尊重が自動で有効になります。 - 設定:対象と除外は
files.includesに!付きのパターンで書き、推奨ルールは"preset": "recommended"で有効にします。 - 移行:ESLint 10の推奨設定に個別ルールを追加した検証用設定では、68ルール中62ルールが直接移りました。Stylelintの標準設定は82ルール中24ルールにとどまるため、CSSのLintは急いで置き換えないほうが安全です。
Biomeの担当範囲とESLint・Prettierとの比較
Biomeは2023年8月29日にRomeの公式フォーク(派生)として発表され、Romeの開発者が引き継いだプロジェクトです。ソースコードはGitHubの biomejs/biome で公開され、ライセンスはMITとApache-2.0のデュアル(npmパッケージの表記は MIT OR Apache-2.0)、スター数は2026年10月25日時点で25,990(GitHub APIの値)です。1つのバイナリでフォーマッタ・リンター・アシスト(importの並び替えなど)を兼ねるため、従来の構成と比べると次のように部品が減ります。
| 観点 | ESLint+Prettier | Biome 2.6 |
|---|---|---|
| 設定ファイル | eslint.config.js・.prettierrc | biome.json 1つ |
| 整形とLintの衝突回避 | 競合ルールの無効化(eslint-config-prettier等) | 不要 |
| import整列 | 別プラグイン | アシストに内蔵 |
| 型情報を使うルール | typescript-eslint(TypeScript API利用) | 独自の型推論(TypeScript不要) |
| 独自ルールの追加 | JSプラグイン(成熟) | GritQL・JS(プレビュー) |
| CSS・Markdown・YAML | Prettier(Lintは別ツール) | 整形とLintの両方 |
2.6.3に同梱されている設定スキーマで数えると、ルールは安定版の7グループで486(a11y 38・complexity 57・correctness 112・performance 16・security 7・style 117・suspicious 139)、試験段階のnurseryで154あります(各グループの設定項目であるpresetとrecommendedは除外)。2.5.14の安定版427から59増えたのは、2.6.0でnurseryの59ルールが安定版へ昇格したためです。ESLintとPrettierの単体での使い方はESLintをVSCodeで使う設定手順|ESLint 10のflat configと保存時の自動修正【10.13対応】とPrettierとは?意味・読み方と使い方・設定、ESLintとの違い【3.9対応】で扱っています。
Biomeのバージョン履歴と最新版の確認方法
npmの latest タグは2026年10月25日時点で2.6.3です。v2系のマイナー版の公開日と主な変更は次のとおりです(公開日はnpmとGitHub Releases、内容は公式CHANGELOGより)。公式ブログの日付はnpmへの公開より前になることがあり、2.6のブログは10月15日付です。
| 版 | 公開日 | 主な変更 |
|---|---|---|
| 2.0.0 | 2025-06-17 | 型認識Lint・GritQLプラグイン・入れ子設定 |
| 2.1.0 | 2025-07-08 | noMisusedPromises追加・スキャナの対象絞り込み |
| 2.2.0 | 2025-08-14 | 並び替え順の指定・Qwikドメイン追加 |
| 2.3.0 | 2025-10-24 | Vue・Svelte・Astroの試験対応・Tailwind v4構文 |
| 2.4.0 | 2026-02-15 | SARIFレポーター・複数レポーター出力 |
| 2.5.0 | 2026-06-12 | preset設定・–watch・SVG対応 |
| 2.6.0 | 2026-10-21 | Markdown・YAML・SCSS・JSプラグイン・inspect |
v2.0の柱は、typescript パッケージを使わずにPromiseの扱い漏れなどを検出する型認識Lintです。2.6では型推論エンジンが書き直され、型を必要になった時点で計算して再利用する方式になりました(Biome v2.6の公式ブログ)。
手元の版は npx biome --version(出力は Version: 2.6.3)、公開中の最新版は npm view @biomejs/biome version で確認できます。更新するときは、パッケージを上げたあとに biome migrate --write を実行します。2.5.14の設定のまま2.6.3を動かすとThe configuration schema version does not match the CLI version 2.6.3 という通知が出ますが、検査自体は続行されます。v1系から移行する場合は、まずv2.0へ更新して移行コマンドを実行し、その後に新しいv2系へ更新して再度移行します(v2.1以降の migrate は、v1で推奨だったstyleルールを有効化しないため)。
npm install -D -E @biomejs/biome@latest
npx biome migrate --write
v2.6で追加された主な機能
Markdown・YAML・SCSSの整形とLint
2.6の公式ブログによると、MarkdownのパーサーはCommonMarkの適合テストを100%通過し、フォーマッタはPrettierとの互換が約92%です。表やタスクリストなどGitHub Flavored Markdownの拡張は既定で読み取ります。YAMLはパーサーが公式テストスイートに100%適合し、フォーマッタはPrettierと100%互換とされています。YAMLのLintルールは現時点で1本だけです。SCSSは公式テストスイートの90%以上に対応し、既存のCSS向けLintルールがSCSSにも効きます。
Markdown内のコードブロックも整形されます。実測では、```js のブロック内の const a = 'b' が const a = "b"; に書き換わりました。この挙動は markdown.formatter.formatEmbeds を false にすると止まります。日本語の文中で **「重要」** のように記号の直後に強調記号を置く書き方向けに、markdown.parser.cjkFriendlyEmphasis という読み取りオプションもあります。
JavaScriptで書くLintプラグイン(開発者プレビュー)
独自ルールは2.0からGritQLで書けましたが、2.6でJavaScript(または型を除去して読み込まれるTypeScript)でも書けるようになりました。公式ブログの例をそのまま plugin.js に保存し、biome.json に "plugins": ["plugin.js"] を足して実行すると、eval と setTimeout の呼び出しに Restricted callee のエラーが出ました。読み込み元の @biomejs/runtime/plugin は追加でインストールする必要がなく、Biome本体に組み込まれた実行環境(Rust製のJavaScriptエンジンboa)で動きます。
import { ast, defineRule, registerDiagnostic } from "@biomejs/runtime/plugin";
const RESTRICTED = new Set(["eval", "setTimeout", "setInterval"]);
export const restrictedCallee = defineRule({
query: ast("JS_CALL_EXPRESSION"),
run(node) {
const callee = node.callee;
if (callee?.kind !== "JS_IDENTIFIER_EXPRESSION") return;
if (!RESTRICTED.has(callee.text)) return;
registerDiagnostic(callee, "error", "Restricted callee");
},
});
プラグインが受け取るのはESLintのASTではなく、空白やコメントまで保持する構文木(CST)です。ESLintのプラグインはそのまま動かないので、社内ルールを移すときは書き直しが前提になります。開発者プレビューの段階なので、まずは警告として試すのが無難です。警告にするには、上のコードの registerDiagnostic の第2引数を "error" から "warning" に変えます。
biome inspect configによる設定値と適用元の確認
biome inspect config は、extends を解決した設定を表示します。overrides の適用結果を確認するには、--path で対象ファイルを指定します。フィールドと対象ファイルを指定すると、その値がどの設定のどの行から来たかがわかります。次は、**/*.test.ts に行幅120を指定したoverrideがある状態で実行した結果です。
$ npx biome inspect config formatter.lineWidth --path src/x.test.ts
i The key formatter.lineWidth has the following value.
> 55 │ "lineWidth": 120
i This value is provided by override 0 in the root configuration.
i The override matched src/x.test.ts using **/*.test.ts.
このほか、Stylelintの設定を読み込む biome migrate stylelint、Node.jsなしで入れられるスタンドアロンのインストーラ、Android(Termux)向けのバイナリが2.6で加わりました。
Biome 2.5から2.6への更新に伴うMarkdown・YAML・SCSSの検査対象追加
2.6ではMarkdown・YAML・SCSSの整形とLintが既定で有効です。2.5のころに作った biome.json を変えずに上げると、それまで無視されていたファイルが検査対象に入ります。src/a.ts・README.md・.github/workflows/ci.yml・styles/main.scss を置いたプロジェクトで、同じ設定のまま biome check . を実行した結果は次のとおりです。
| 版 | 検査したファイル(biome.jsonを含む) | エラー | 増えた指摘 |
|---|---|---|---|
| 2.5.14 | 2 | 1 | – |
| 2.6.3 | 5 | 4 | README.md・ci.yml・main.scssの整形 |
README.mdでは箇条書きの * が - に、*emphasis* が _emphasis_ に変わり、YAMLではインデントがスペース5つから4つに詰められました。biome ci はエラーがあると終了コード1を返すので、それまでエラーのなかったリポジトリでも、パッケージの版を上げただけのプルリクエストがCIで落ちます。対処は2通りあります。整形を受け入れるなら、先に npx biome check --write . を1回流して差分を別のコミットにします。MarkdownやYAMLを当面対象外にするなら、次のように言語ごとに止めます。
{
"markdown": { "formatter": { "enabled": false }, "linter": { "enabled": false } },
"yaml": { "formatter": { "enabled": false }, "linter": { "enabled": false } }
}
この設定を足して再実行すると、README.mdとci.ymlへの指摘は消え、止めていないSCSSの指摘だけが残りました。ドキュメントをPrettierで整形しているリポジトリでは、どちらで整形するかを先に決めてください。
ほかに2.6で挙動が変わった点として、内部向けだった javascript.parser.gritMetavariables が削除され、残っていると設定エラーで終了します。Tailwindのルール群が自動で有効になる条件も、package.json の tailwindcss がv3以上からv4以上に変わりました。
npm・pnpmでのインストールとbiome initの初期設定
インストールコマンドとNode.jsの要件
公式は -E(--save-exact)付きで版を固定して入れる手順を案内しています。上の2.6の例のように整形結果は版で変わるため、開発者ごとやCIで版がずれると差分が出るからです。
npm install -D -E @biomejs/biome
pnpm add -D -E @biomejs/biome
yarn add -D -E @biomejs/biome
bun add -D -E @biomejs/biome
curl -fsSL https://biomejs.dev/install | bash
最後の行が2.6で加わったスタンドアロンのインストーラ(macOS・Linux用。WindowsはPowerShellの irm https://biomejs.dev/install.ps1 | iex)で、Node.jsを使わないプロジェクト向けです。npm版の @biomejs/biome の要件は node >=14.21.3 だけで、実体はRust製のネイティブバイナリです。2.6.3ではAndroidの2種を含む10種のOS別パッケージから該当するものがoptionalDependenciesとして入ります。npx がローカルの版を優先して実行する仕組みはnpxとは?npm execとの違い・キャッシュ実行の仕組みとCIでの固定手順で解説しています。
biome initが生成するbiome.json(v2.6.3)
Gitリポジトリの外で npx biome init を実行すると、次の biome.json ができます。Biomeの既定はインデントがタブ、文字列が二重引用符で、Prettierの既定(スペース2つ)とは違います。
{
"$schema": "https://biomejs.dev/schemas/2.6.3/schema.json",
"vcs": { "enabled": false, "clientKind": "git", "useIgnoreFile": false },
"files": { "ignoreUnknown": false },
"formatter": { "enabled": true, "indentStyle": "tab" },
"linter": { "enabled": true, "rules": { "preset": "recommended" } },
"javascript": { "formatter": { "quoteStyle": "double" } },
"assist": { "enabled": true, "actions": { "source": { "organizeImports": "on" } } }
}
(実際の出力は各項目が複数行に展開されます。上は内容を変えずに行をまとめたものです。)git init 済みのフォルダ(サブフォルダを含む)で実行すると、vcs が "enabled": true・"useIgnoreFile": true で書き出され、.gitignore に載ったファイルが自動で対象外になります。Gitの外でも同じ設定にしたい場合は biome init --git を使います。古い記事で見かける "recommended": true は2.5で非推奨になった書き方で、現在は "preset" に recommended・all・none のいずれかを指定します。
biome.jsonの主要設定
files.includesによる対象ファイルと除外の指定
v2では、v1の files.include と files.ignore が files.includes 1つにまとまりました。除外したいパスは先頭に ! を付けて並べます。
{
"vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
"files": { "includes": ["**", "!**/dist", "!**/*.gen.ts"] }
}
dist/out.js を置いたまま biome check . を実行すると、dist 配下の診断は出ませんでした。! で外したパスはLintと整形の対象外になる一方、型情報の索引には残ります。索引からも外したい大きな生成物フォルダには !!(例 "!!**/dist")を使います。パターンは biome.json のある場所を基準に解決されます。
formatterとlinterの設定例(noConsoleの有効化)
{
"formatter": { "indentStyle": "space", "indentWidth": 2, "lineWidth": 100 },
"linter": {
"rules": {
"preset": "recommended",
"suspicious": {
"noConsole": { "level": "warn", "options": { "allow": ["error", "warn"] } }
}
}
},
"javascript": { "formatter": { "quoteStyle": "single", "semicolons": "asNeeded" } }
}
noConsole は2.6.3でも推奨ルールに含まれていません。console.log("x") だけのファイルを推奨設定で検査しても診断は0件だったため、上のように個別に有効化します。allow に並べたメソッド(例では console.error と console.warn)は対象外になります。
モノレポでの入れ子設定(root: falseとextends: “//”)
ルートの biome.json に加えて、サブディレクトリにも設定ファイルを置けます。入れ子の設定には "root": false を書き、ルートの設定を引き継ぐ場合は "extends": "//" を指定します(指定しないとルートを継承しません)。次は packages/app/biome.json に置く例です。biome.json にはコメントを書けないので、コメントを入れたい場合は biome.jsonc にします。
{
"root": false,
"extends": "//",
"formatter": { "lineWidth": 80 }
}
packages/app の中で biome lint を実行すると、ルートで有効にした noConsole の警告が出て、設定が引き継がれていることを確認できました。2.6からは extends で読み込んだ設定がさらに別の設定を読み込む形を10段まで辿れるため、共有設定をnpmパッケージで配る構成も組めます。パッケージ構成の考え方はモノレポ(Monorepo)とは?マルチレポとの違い・メリット・デメリットと導入手順を参照してください。
check・lint・format・ciコマンドの使い分け
| コマンド | 実行内容 | 主な用途 |
|---|---|---|
biome check |
整形・Lint・import整列 | 手元での一括確認 |
biome check --write |
安全な修正だけ適用 | 保存前の自動修正 |
biome lint |
Lintのみ | ルール単位の確認 |
biome format --write |
整形のみ適用 | Prettierの置き換え |
biome ci |
checkと同じ検査・書き込みなし | CI |
--write が当てるのは安全と判定された修正だけです。サンプルでは、== を === にする noDoubleEquals と、fs を node:fs にする useNodejsImportProtocol が安全でない修正(Unsafe fix)の扱いで、--write 後もソースは変わりませんでした。これらも直すには --unsafe を足します。挙動が変わりうる修正なので、差分を確認してから入れてください。
エラーが1件でもあると終了コードは1になります。対象を絞るオプションには、ステージ済みファイルだけの --staged、既定ブランチとのコミット済みの差分だけの --changed、監視モードの --watch があります。--changed は比較元を vcs.defaultBranch か --since=REF で決めておかないと失敗します。
biome-ignoreコメントでルールを抑制する方法
特定の行だけルールを止めるには、直前の行に biome-ignore と理由を書きます。ファイル全体を対象にする biome-ignore-all(ファイルの先頭に書く)と、範囲を指定する biome-ignore-start / biome-ignore-end もあります。
// biome-ignore lint/suspicious/noConsole: デバッグ出力を残す
console.log("keep");
抑制コメントは、対象のルールが実際に指摘を出している場合にだけ意味を持ちます。何も検出していない箇所に biome-ignore lint/suspicious/noDebugger を書くと、2.6.3は suppressions/unused(使われていない抑制コメント)という診断を出しました。noConsole を有効にしていない状態で上の例を書いた場合も同じです。理由の部分に雛形の <explanation> を残すとA suppression shouldn't have an <explanation> placeholder という警告が出ます。
ESLint・Prettier・StylelintからBiomeへの移行手順
biome migrate eslintの実行結果(ESLint 10のflat config)
ESLint 10.13.0の eslint.config.js(@eslint/js 10.0.1の推奨設定に no-console・eqeqeq・no-var・prefer-const・no-unused-vars を追加し、ignores: ["build/**"] を指定)を用意し、2.6.3で npx biome migrate eslint --write を実行しました。
- ESLintのルール68件のうち62件をBiomeのルールへ直接移行(91%)
no-cond-assignとno-unused-private-class-membersは--include-inspiredで類似ルールへ、no-octalとno-useless-assignmentは--include-nurseryで試験段階のルールへ移行できるno-invalid-regexpとno-unexpected-multilineは未実装ignoresはlinter.includesの"!build/**"に変換
見落としやすいのは、移行後の biome.json が "preset": "none" になる点です。Biomeの推奨ルールは無効になり、ESLintから移したルールだけが動きます。Biome独自の推奨ルールも使うなら、preset を recommended に戻してから増えた指摘を確認します。2.6からは no-unused-vars の ignoreRestSiblings も移されるようになり、ESLint側で省略していた値はESLintの既定(false)で書き込まれました。Biomeは node を呼び出してESLintの設定ファイルを読み込むため、設定が参照するパッケージは移行が終わるまで消さないでください。@eslint/js を外した状態で実行すると ERR_MODULE_NOT_FOUND で止まりました。
biome migrate prettierで変換される項目
.prettierrc に {"semi":false,"singleQuote":true,"printWidth":100} を書いて npx biome migrate prettier --write を実行すると、formatter.lineWidth: 100、javascript.formatter.semicolons: "asNeeded"、quoteStyle: "single" に変換され、インデントはPrettierの既定に合わせて indentStyle: "space"・indentWidth: 2 が書き込まれました。2.6.3では trailingCommas: "all" などPrettierの既定値もすべて明示され、HTMLの空要素を <br /> の形にする selfCloseVoidElements: "always" も入ります。セミコロンを省略する書き方の是非はTypeScriptのセミコロンは必要か|省略の判断とESLint・Prettier設定【2026年版】で整理しています。
biome migrate stylelintの実行結果
Stylelint 17.16.0と stylelint-config-standard 40.0.0を使った .stylelintrc.json(ignoreFiles: ["dist/**"] 付き)で npx biome migrate stylelint --write を実行すると、82ルール中24ルール(29%)が直接移り、2ルールが試験段階のルールへ移行可能、56ルールは対応するBiomeのルールがありませんでした。対応がないものには color-hex-length・selector-class-pattern・rule-empty-line-before など、命名や書式の規約を決めるルールが多く含まれます。ignoreFiles は linter.includes の "!dist/**" になりました。Stylelintの標準設定に頼っているなら、CSSのLintはStylelintを残し、整形だけBiomeに寄せるのが現実的です。Stylelint側の設定はStylelintとは?v17の変更点・導入手順・設定とCSSネスト対応【17.16対応】で解説しています。
型認識ルール・独自プラグイン依存時の段階移行
typescript-eslintの型情報を使うルールに頼っているプロジェクトは、すぐに置き換えないほうが安全です。Biome v2の公式ブログは、noFloatingPromises がv2.0公開時の予備検証でtypescript-eslintの検出ケースの約75%を捉えたと報告しています。v2.1の公式ブログでは約85%まで改善したと報告されていますが、2.6や個別のプロジェクトでの検出率を保証する数値ではありません。eslint-plugin-jsx-a11yのようにフレームワーク固有のルールを多数持つプラグインを使っている場合も、Biomeに同等のルールがないことがあります。どちらかに当てはまるなら、整形だけを先にBiomeへ移し、LintはESLintを残す段階移行にします。ツールの入れ替えをきっかけに、テストやCIを含めた開発基盤から作り直す場合はフルスクラッチ開発の支援も相談できます。Rust製の別系統のリンターとの比較はOxlintとESLintの違いとは?読み方・速度実測・移行手順とBiomeとの比較【1.88対応】にまとめています。
GitHub ActionsでのCI組み込み(setup-biome@v2)
name: Code quality
on: [push, pull_request]
jobs:
biome:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: biomejs/setup-biome@v2
- run: biome ci
setup-biome の入力は version・working-dir・token の3つです。version を省略すると、npm・yarn・pnpm・bunのロックファイル、package.json、biome.json の $schema の順に版を探し、どこにもなければ最新版を入れます。手元で -E 付きで固定していれば、CIも同じ版で動きます。@v2 はv2系のメジャータグで、2026年10月25日時点の最新リリースはv2.7.1(2026年3月11日)です。手順の全体は公式のContinuous Integrationにあります。
biome ci は環境変数 GITHUB_ACTIONS=true を検出するとGitHub向けの出力に切り替わり、次の形式で診断を出します(手元では --reporter=github で同じ出力を確認できます)。この形式の行は、プルリクエストの差分画面に注釈として表示されます。
::error title=lint/suspicious/noDoubleEquals,file=src/a.ts,line=3,endLine=3,col=8,endColumn=10::Using == may be unsafe if you are relying on type coercion.
依存のキャッシュ設計はGitHub Actionsのキャッシュ|actions/cacheのkey設計と復元されない原因の切り分けが参考になります。
VS Code拡張機能の設定
拡張機能のIDは biomejs.biome です。VS CodeはMarketplace、CursorやVSCodiumはOpen VSXから入れます。保存時に整形し、安全な修正とimportの整列も当てるには、.vscode/settings.json に次を書きます。
{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.biome": "explicit",
"source.organizeImports.biome": "explicit"
}
}
Prettier拡張も入っている環境では、editor.defaultFormatter を指定しないと整形がどちらで行われるか定まりません。2.6でMarkdownとYAMLも整形できるようになったため、[markdown] や [yaml] の言語別設定でPrettierを指定している場合は、どちらに任せるかを決め直します。biome.json のないプロジェクトでBiomeを動かしたくない場合は、拡張側の biome.requireConfiguration を true にします。
よくある質問
Biomeの最新バージョンはいくつですか?
2026年10月25日時点で2.6.3(2026年10月24日公開)です。最新の版は npm view @biomejs/biome version で確認でき、更新後は biome migrate --write で設定の $schema などを新しい版に合わせます。
Biomeについて質問できるチャットはありますか?
公式のDiscordがあり、https://biomejs.dev/chat から参加できます(Discordの招待リンクへ転送されます)。biome init の実行後にもこのURLが表示されます。不具合の報告と機能要望はGitHubのbiomejs/biomeで受け付けています。
特定のファイルやフォルダをBiomeの対象から外すには?
biome.json の files.includes に "!**/dist" のように ! 付きで書きます。v1の files.ignore はv2で使えなくなりました。vcs.enabled と vcs.useIgnoreFile を true にすると .gitignore の内容も除外に使われます。
console.logが検出されないのはなぜですか?
noConsole が推奨ルールに含まれていないためです。linter.rules.suspicious.noConsole を warn か error にすると検出されます。
ESLintとBiomeは併用できますか?
できます。整形だけBiome、LintはESLintという分担が一般的な段階移行です。その場合はESLintの整形系ルールとPrettierを外し、同じファイルを2つのツールが別々に書き換えないようにします。