🚀

Oxc のリンター(oxlint)を試してみる

に公開

はじめに

oxc-projectには以前から興味がありましたが未実装な機能がまだまだ多く実践投入は見送っていたのですが、6月にバージョン1がリリースされ、10月にはvite+が発表され、その説明にはoxfmtの近日リリースのお知らせもあり、盛り上がりを感じるのでそろそろ試してみようと思います。
機能がたくさんあるので、この記事ではまずoxlintを使ってみます。

Oxcとは

Oxcは、Rustで実装されたJavaScriptツールのコレクションです。
https://oxc.rs/

オキシと読んでしまいがちですが、読み方はオーエックスシーです。
Oxcは、以下のようなツールで構成されています。

✅ 実装済み / 🚧 開発中(2025年11月時点)

  • Parser ✅:swcより3倍、Biomeより5倍高速なパーサー
  • Linter (oxlint) ✅:ESLintより50〜100倍高速なリンター(600+ルール)
  • Resolver ✅:enhanced-resolveより28倍高速なリゾルバー
  • Transformer ✅:Babel互換のトランスフォーマー(TypeScript/React JSX対応)
  • Formatter (oxfmt) 🚧:Prettier互換のフォーマッター(プロトタイプ完成)
  • Minifier 🚧:より高速で圧縮率の高いミニファイアー(アルファ段階)
  • Bundler (Rolldown) 🚧:Rollup互換のバンドラー(Vite向け設計)

Oxcのセットアップ

リポジトリにインストールします。

npm add -D oxlint

ESlintからの移行

すでにESlintがリポジトリで使われている場合、oxlint-migrateを使うことでESlintの設定をoxlintに移行することができます。

# <your-eslint-flat-config-path>を書かなくてもOK。その場合デフォルトのESlint設定ファイルを探す。
npx @oxlint/migrate <your-eslint-flat-config-path>

設定ファイル

oxlintは、設定ファイルが不要で600以上のルールが利用可能です。デフォルトで有効になっているのは103のルールです。
https://oxc.rs/docs/guide/usage/linter/rules.html
特定のルールを無効化したい場合は、.oxlintrc.jsonファイルを作成できます。

{
  "rules": {
    "no-unused-vars": "allow",
    "no-console": "allow"
  }
}

または、コマンドライン引数で指定することもできます:

npm oxlint . --allow no-unused-vars --allow no-console

基本的な使い方

リポジトリのルートディレクトリで、以下のコマンドを実行します:

# カレントディレクトリのすべてのファイルをリント
npm oxlint .

# 特定のファイルやディレクトリを指定
npm oxlint src/

# 自動修正(利用可能なルールのみ)
npm oxlint . --fix

必要な場合、tsgolintをインストールすことにより、type-awareを追加することもできます。

# インストール
npm add -D oxlint-tsgolint@latest

# 実行
npm oxlint --type-aware

エラー表示

リント実行後のコマンドラインのエラー表示です。

どの部分で何がダメかがわかりやすいですね。
エラー表示は設定で変更可能です。

# 1行表示
npm oxlint -f unix

# エラー出力
test.ts:1:7: Variable 'hello' is declared but never used. [Error/eslint(no-unused-vars)]

他にも設定があるのでプロジェクトの状況に合わせて変更するのが良いと思います。

ESlintのプラグインとして使う

全面移行が難しい場合でも、eslint-plugin-oxlintを使うことにより、ESlintを使いつつoxlintがサポートしている部分はoxlintが実行してくれるようになり、安全にoxlintの恩恵を受けることができます。
また、このプラグインはESLint 9.0未満のLegacy Configにも対応しているため導入ハードルが非常に低いのが良いです。

パフォーマンス比較

lint実行速度を比較してみます。
比較ファイル数は441ファイル(.ts, .tsx)です。

比較結果

ツール 実行時間 短縮率
ESlint 8.95秒 基準
oxlint 0.073秒 約122倍
oxlint(--type-aware) 0.859秒 約10.4倍
Biome 0.15秒 約60倍
Eslint(oxlintプラグイン) 0.77秒 約11.6倍

早すぎて涙が出ます。今までの10秒弱の虚無タイムが無くなるのはとても嬉しいです。
体感ではほとんど差はありませんが、Biomeよりも2倍のスピードが出ているのも驚きです。
また、oxlintのプラグイン導入だけでも、他と見比べれば劣りますが十分すぎる効果がありました。

使ってみて

oxlintを実際に試してみた結果、以下のような点がわかりました。

  • oxlintは設定不要で高速:すぐに試せる点が優れている
  • Biomeより約2倍高速:パフォーマンス面で優位性がある
  • 豊富なルール:600以上のルールが利用可能で、デフォルトで103のルールが有効
  • エラー表示:エラー箇所や指摘が具体的で何を修正すれば良いかがわかりやすい

とても使いやすく、設定も簡単で使い勝手も良くなるため非常に良かったです。
ESlintプラグインでも十分に早いのはとても嬉しく、今請け負っているプロジェクトにはさっさと導入することにします。

余談

Biomeとどっちを使うかはとても悩ましくあります。
パフォーマンスの面だけでいうとoxcを選択したくはありますが、現時点ではBiomeの方がサポートしている内容もフォーマットもあるため実践向きではあります。
また、機能とは関係ありませんがBiomeはユーザーに優しいわかりやすい実装を心がけているため、なんだか少し応援したい気持ちもあります。

ただ、oxcはoxfmtの近日リリースの発表や、typescript/no-deprecatedも実装されたことにより、よりBiomeとの差がなくなってきています。
vite+が一般に公開され始めたら、大規模未満のプロジェクトはほとんどの場合vite+を使うことになるのではないかと思っており、そうなるとoxcが自然と導入されているため、oxcを使っておけばvite+の学習コストや移行コストも下がるため、今後を見据えるとoxcが良いのでしょうかね。

まだまだ2つとも道半ばだと思いますので、しばらく追いかけて判断していこうと思います。

GitHubで編集を提案

Discussion