Skip to content

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,006100%
React hooks(React Compiler ルール含む)5,007100%
ESLint Stylistic18,31099.99%
Testing Library17,016100%
SonarJS3,95199.6%*
e18e474100%*

* 型対応ルールを除く

上記にないプラグインでも、非常に高い確率で動作します。まだ この適合テストスイート に載っていないだけです。

ESLint 自身のテストが API 表面全体を覆うため、100% 合格はコーナーケースまで押さえられたという自信につながります。ぜひ試してフィードバックをください。

Oxlint はすでに Midjourney、Preact、PostHog、Outline、Actual など、多くの企業・プロジェクトで本番利用されています(MidjourneyPreactPosthogOutlineActual)。

まだできないこと(当面)

  • Svelte、Vue、Angular などフロントエンド向け独自ファイル形式のサポートは限定。今年後半の予定です。
  • カスタムの型対応ルールは非対応(TypeScript-ESLint のルール相当は Oxlint の型対応 Lintに組み込み済み)。
  • Windows で体験が劣るという声があります。特に Windows でのメモリ不足は既知の問題です。対処中です。当面は可能なら WSL で Oxlint を実行することを推奨します。

これらの穴埋めの進捗は tracking issue を参照してください。

はじめに

oxlint を dev 依存としてインストール:

sh
pnpm add -D oxlint

package.json にスクリプトを追加:

package.json
json
{
  "scripts": {
    "lint": "oxlint"
  }
}

設定ファイルを作成する(または 移行ツールを利用):

.oxlintrc.json
json
{
  "jsPlugins": ["eslint-plugin-testing-library"],
  "rules": {
    "testing-library/no-render-in-lifecycle": "error"
  }
}

プロジェクトを Lint:

sh
pnpm run lint

ESLint からの移行

多くのプロジェクトで、ESLint からの移行は素直なはずです。

一番簡単なのは @oxlint/migrate です。

sh
npx @oxlint/migrate eslint.config.js

あるいはコーディングエージェントに migrate-oxlint skill で任せても構いません。

詳しくは 移行ガイド を参照してください。

ESLint ルール

Oxlint は ESLint 組み込みルールの大半を Rust でネイティブ実装済みですが、まだ未実装のものもあります。

その隙間を埋めるため、oxlint-plugin-eslint を提供しています。ESLint の組み込みルールをすべて Oxlint JS プラグインとしてパッケージしたものです。

これで Oxlint 本体にまだネイティブがない no-restricted-syntax なども使えます。

.oxlintrc.json
jsonc
{
  "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 パッケージを直接使うのが推奨パターンです。

.oxlintrc.json
jsonc
{
  "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時間高速化
ESLint1 分 43 秒
Oxlint21 秒4.8 倍
詳細

INFO

  • ベンチマーク用リポジトリ

  • Lint 対象ファイル 6298 本

  • Oxlint 組み込みルール 104(Rust)

  • JS プラグイン由来ルール 75(JS)

  • カスタムルール 23(JS)

  • 計測環境: Mac mini M4、48GB RAM、Node.js 24.14.0

  • ESLint 計測:

sh
git checkout bench-eslint
npm ci
hyperfine -i --warmup 1 --runs 5 "node --run eslint"
  • Oxlint 計測:
sh
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 プラグインをこのマイルストーンまで持っていくのは多くの人の仕事でした。特に:

  • 言語サーバ統合への献身的な取り組み:@Sysix
  • 多くの API 整備:@lilnasy

コミュニティへ

Oxlint JS プラグインについてのフィードバックを聞かせてください。開発ワークフローの改善にどう役立つか楽しみにしています。

連絡先: