Oxlint の JavaScript プラグインがアルファに
Oxlint 向け JavaScript プラグインがアルファ段階に達しました。ESLint ユーザーの約 80% は、この時点で Oxlint へ切り替えても「そのまま動く」状態になると見込んでいます。
Oxlint にはすでに 650 以上の人気ルールが Rust で実装され、ネイティブ速度で動きます。JS プラグインはそこを埋めます。ESLint 互換のプラグイン API で、既存の ESLint プラグインをそのまま走らせたり、独自ルールを書いたりできます。大部分のルールはネイティブ性能、残りは完全な柔軟性を確保します。
昨年の初回テクニカルプレビュー以来、ESLint プラグイン API をほぼ全体まで埋め、TypeScript プラグイン、自動修正、IDE 連携、パフォーマンスの大幅改善 を追加しました。
多くのチームは、Lint ルールを書き直さずに ESLint を Oxlint に置き換えられるはずです。
このアルファは、実プロジェクトでの採用に JS プラグインが足ると判断した地点を示します。
ほとんどのプロジェクトで、Oxlint は ESLint のドロップイン代替になり、移行は素直で、Lint 時間は大きく短くなるはずです。
機能
- ほとんどの既存 ESLint プラグインを改変なしで実行
- JavaScript / TypeScript で独自 Lint ルールを記述
- JS プラグインルールから自動修正とサジェストを取得
- 言語サーバ経由で IDE 上に JS プラグインの診断をライブ表示
どれだけ信頼できる?
Oxlint の JS プラグイン対応は、ESLint 本体のテストスイート全体に加え、次のような幅広い ESLint プラグインでも検証しています。
| プラグイン | テスト数 | 合格率 |
|---|---|---|
| ESLint 組み込みルール | 33,006 | 100% |
| React hooks(React Compiler ルール含む) | 5,007 | 100% |
| ESLint Stylistic | 18,310 | 99.99% |
| Testing Library | 17,016 | 100% |
| SonarJS | 3,951 | 99.6%* |
| e18e | 474 | 100%* |
* 型対応ルールを除く
上記にないプラグインでも、非常に高い確率で動作します。まだ この適合テストスイート に載っていないだけです。
ESLint 自身のテストが API 表面全体を覆うため、100% 合格はコーナーケースまで押さえられたという自信につながります。ぜひ試してフィードバックをください。
Oxlint はすでに Midjourney、Preact、PostHog、Outline、Actual など、多くの企業・プロジェクトで本番利用されています(Midjourney、Preact、Posthog、Outline、Actual)。
まだできないこと(当面)
- Svelte、Vue、Angular などフロントエンド向け独自ファイル形式のサポートは限定。今年後半の予定です。
- カスタムの型対応ルールは非対応(TypeScript-ESLint のルール相当は Oxlint の型対応 Lintに組み込み済み)。
- Windows で体験が劣るという声があります。特に Windows でのメモリ不足は既知の問題です。対処中です。当面は可能なら WSL で Oxlint を実行することを推奨します。
これらの穴埋めの進捗は tracking issue を参照してください。
はじめに
oxlint を dev 依存としてインストール:
pnpm add -D oxlintpackage.json にスクリプトを追加:
{
"scripts": {
"lint": "oxlint"
}
}設定ファイルを作成する(または 移行ツールを利用):
{
"jsPlugins": ["eslint-plugin-testing-library"],
"rules": {
"testing-library/no-render-in-lifecycle": "error"
}
}プロジェクトを Lint:
pnpm run lintESLint からの移行
多くのプロジェクトで、ESLint からの移行は素直なはずです。
一番簡単なのは @oxlint/migrate です。
npx @oxlint/migrate eslint.config.jsあるいはコーディングエージェントに migrate-oxlint skill で任せても構いません。
詳しくは 移行ガイド を参照してください。
ESLint ルール
Oxlint は ESLint 組み込みルールの大半を Rust でネイティブ実装済みですが、まだ未実装のものもあります。
その隙間を埋めるため、oxlint-plugin-eslint を提供しています。ESLint の組み込みルールをすべて Oxlint JS プラグインとしてパッケージしたものです。
これで Oxlint 本体にまだネイティブがない no-restricted-syntax なども使えます。
{
"jsPlugins": ["oxlint-plugin-eslint"],
"rules": {
// 注意: "eslint-js" であって "eslint" ではない
"eslint-js/no-restricted-syntax": [
"error",
{
"selector": "ThrowStatement > CallExpression[callee.name=/Error$/]",
"message": "Use `new` keyword when throwing an `Error`.",
},
],
},
}Oxlint は eslint-plugin-jsdoc など一部プラグインのルールをネイティブで実装しています。本体にないルールは eslint-plugin-jsdoc パッケージを直接使うのが推奨パターンです。
{
"jsPlugins": [
// プラグイン "jsdoc-js" のエイリアスを定義
{ "name": "jsdoc-js", "specifier": "eslint-plugin-jsdoc" },
],
"rules": {
// エイリアスでプラグインのルールを参照
"jsdoc-js/check-examples": "error",
"jsdoc-js/require-description": "error",
// Oxlint がネイティブ実装しているルールは素の "jsdoc" で
"jsdoc/require-property-name": "error",
"jsdoc/require-property-description": "error",
},
}パフォーマンス
初回テクニカルプレビュー以降、JS プラグインを支えるコードの大きな部分を「Rust 化」し、性能が大きく伸びました。特にトークン API に依存するプラグイン(例: ESLint Stylistic)は、以前比で最大約 5 倍高速です。
ベンチマークとして、Node.js リポジトリを ESLint から Oxlint に移行しました。Node.js は大規模でカスタム Lint ルールや重い ESLint プラグインを多数使い、JS Lint ルールは合計 98 本です。
| Linter | 時間 | 高速化 |
|---|---|---|
| ESLint | 1 分 43 秒 | |
| Oxlint | 21 秒 | 4.8 倍 |
詳細
INFO
Lint 対象ファイル 6298 本
Oxlint 組み込みルール 104(Rust)
JS プラグイン由来ルール 75(JS)
カスタムルール 23(JS)
計測環境: Mac mini M4、48GB RAM、Node.js 24.14.0
ESLint 計測:
git checkout bench-eslint
npm ci
hyperfine -i --warmup 1 --runs 5 "node --run eslint"- Oxlint 計測:
git checkout bench-oxlint
npm ci
hyperfine -i --warmup 1 --runs 5 "node --run oxlint"現状 TypeScript-ESLint や eslint-plugin-import を多用しているプロジェクトでは、はるかに大きい高速化が見込めます。Discord のあるユーザーは、約 200 万行の社内コードベースで ESLint から Oxlint へ切り替え、JS プラグインも多用する構成で 16 倍高速化したと報告しています。JS プラグインを控えめに使うプロジェクトでは最大 100 倍近いという報告もあります。
今後の性能改善
まだ始まりにすぎません。
JS プラグイン付き Oxlint はすでに ESLint より明らかに高速ですが、パイプライン上にも最適化は山ほどあります。
鍵となるのは Rust と JS の間をつなぐ、新しく高度に最適化された低レベル機構で、私たちはこれを raw transfer と呼んでいます。
ネイティブツールが JS プラグインを載せるとき、いつも根本になるのは Rust / JS の境界です。ネイティブは速い一方、往復のデータ移動コストが高すぎて相殺され、全体では平凡な性能になることがありました。
raw transfer は Rust と JS の間のデータ移動コストをほぼゼロに近づけ、ネイティブと JS プラグインがようやく効果的に組み合わせられるようにします。
raw transfer の第一世代はすでに Oxlint の内部で動いていますが、できることを活用しきれた段階ではありません。この作業を進めるにつれ、さらに一段階の性能変化が起き、JS プラグインがネイティブ Rust に近づくと期待しています。
詳細に興味があれば、Oxc コアチームの @overlookmotel が ViteConf 2025 でこのテーマの講演を行っています。
要するに:Oxlint はすでに存在する中で最速クラスの JS/TS リンターです。さらに速くなります。
性能のヒント 1: フォーマッタを使う
可能なら、コード整形をリンターから切り離し Oxfmt(または好みのフォーマッタ)へ移すことを強く推奨します。
Oxfmt は Prettier より約 30 倍高速で、ESLint Stylistic のような「整形系」Lint プラグインと比べても Lint 時間を大きく減らせます。
Oxlint と Oxfmt の組み合わせは非常に強力です。
性能のヒント 2: プラグイン選び
多くの人の思い込みとは逆に、極めて高性能な JavaScript も書けます。Oxlint が速いのは Rust だからだけではなく、性能を意識して設計されているからでもあります。
JS プラグインのコード自体は Oxlint が管理できません。全体として良い性能を出すには、選ぶ JS プラグイン自身もよく動く必要があります。
非効率なアルゴリズムやファイルシステム操作の多用があるプラグインは、ESLint でも Oxlint でも遅くなります。Oxlint ができるのは超高速パーサと、プラグイン向けの性能の良い API の提供までで、遅い JS を魔法のように速くはできません。
Lint が期待ほど速くない場合、将来、どのプラグイン/ルールがボトルネックか診断するユーティリティも提供する予定です。
カスタムプラグインの作成
プロジェクト固有の要件がある場合、Oxlint 用のカスタム JS プラグインを作るのは簡単です。
JS プラグインガイド を参照してください。
FAQ
Oxlint は ESLint プラグインを実行できる? はい。ほとんどのプラグインは改変なしで動きます。
Oxlint は ESLint より速い? はい。ベンチマークでは通常 4〜100 倍程度の高速化が報告されます。
段階的に移行できる? はい。ESLint と Oxlint を並行実行できます。
謝辞
JS プラグインをこのマイルストーンまで持っていくのは多くの人の仕事でした。特に:
コミュニティへ
Oxlint JS プラグインについてのフィードバックを聞かせてください。開発ワークフローの改善にどう役立つか楽しみにしています。
連絡先:
- Discord: リアルタイムの議論は コミュニティサーバ
- GitHub: フィードバックは GitHub Discussions
- Issues:
oxlintの不具合は oxc へ

