Upgrade to Pro — share decks privately, control downloads, hide ads and more …

XO から Oxlint に移行した話

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

XO から Oxlint に移行した話

Avatar for Ryuya Yanagi

Ryuya Yanagi

July 24, 2026

More Decks by Ryuya Yanagi

Other Decks in Programming

Transcript

  1. XO を導入してどうだったか シンプルに学びが多かった 知らない JavaScript の記法を学ぶことができた 普段書いてるコードの危険性を知ることができた こんなリントルールあるんだ、と思うことが多々あった JavaScript/TypeScript の書き方のベストプラクティスを知れた

    XO のバージョンアップをするだけで新しい JS の記法に対応したリントルールが 勝手に追加される リントルールに興味を持つ人が増えた カスタムルールを作成したり、この書き方リントで禁止できないかな、という 話がよく出るようになった
  2. XO のデメリット 遅い!!! M2 Pro の MacBook で2分10秒ほどかかる ルールが500種類あるので遅いのは一定しょうがない ESLint

    には2025年8月にマルチスレッドリンティングが追加されたが、 XO は未対応 XO のアーキテクチャ上、ESLint のマルチスレッドリンティングを使うことは できない
  3. Linter の実行速度の重要性 AI がコードを書く現在ではフィードバックサイクルは生産性に直結する リントやフォーマット、自動テストの速さは重要 コードを書く速度も前と比べてかなり速くなっているので Pull Request も大量に できる

    CI 上でリントを回す速度も生産性に直結する XO を2年間ほど運用してきて、リントルールに興味を持つようメンバーも増えて きており、XO に頼らなくても自分たちでルールセットを運用できるのではない かという感覚があった
  4. Oxlint とは Rust 製の JavaScript/TypeScript 向けリンター ドキュメント:https://oxc.rs/docs/guide/usage/linter.html Oxc という JavaScript/TypeScript

    向けのツール群の1つ Oxlint 以外にも Oxfmt(Prettier 互換のフォーマッター)や、oxc-parser などが ある Oxlint の内部で oxc_parser や oxc_allocator などを使用している 最近 Type-Aware Linting が stable になった https://oxc.rs/blog/2026-07-22-type-aware-linting-stable
  5. Oxlint のベンチマーク ESLint の50~100倍、同じ Rust 製のリンターである Biome の約2倍速い https://github.com/oxc-project/bench-linter 手元検証(MacBook

    Pro M1 Max / 64GB): 個人プロジェクトで ESLint 約6秒 → Oxlint 約0.9秒(約6.7倍高速化) プロジェクトの規模が大きくなるほど倍率は上がっていく
  6. XO から Oxlint への移行方法 1. XO から ESLint の設定ファイルを出力する xo

    --print-config=src/components/button.tsx > .eslintrc.json 2. 生成した .eslintrc.json を eslint.config.js (Flat Config)に変更する ( @oxlint/migrate は Flat Config にしか対応していないため) 3. @oxlint/migrate を実行して ESLint の設定ファイルから Oxlint の設定ファイルを 生成する $ npx @oxlint/migrate eslint.config.js --with-nursery --type-aware 4. Oxlint で未対応のルールを JS plugins を使用して有効にする この手順で約500種類のルールを一気に Oxlint へ移行 ※ XO のフォーマッタ機能(Prettier)は Oxfmt に移行してます
  7. react/jsx-no-target-blank の例 // eslint-plugin-reactではaタグの横にdisable-lineを記述する export function Link() { return (

    <a // eslint-disable-line react/jsx-no-target-blank className={styles.link} href="https://prtimes.jp/" target="_blank" > PR TIMES </a> ); } // Oxlintのnativeルールでは target='_blank' の上にdisable-lineを記述する export function Link() { return ( <a className={styles.link} href="https://prtimes.jp/" // oxlint-disable-next-line react/jsx-no-target-blank target="_blank" > PR TIMES </a> ); }
  8. 有効にできなかったルールたち unicorn/expiring-todo-comments ESLint の一部の API が Oxlint で実装されておらず、実行時エラーがでた Oxlint v1.63.0

    で解消済み @typescript-eslint/member-ordering Oxlint の native で実装されていなかった typescript-eslint 系のルールは JS plugins で有効にすることはまだできない @typescript-eslint/naming-convention こちらも同じく
  9. まとめ フロントエンドのリントルール整備のために XO を導入した 500種類ほどのリントルールが有効になった環境で開発したことは学ぶことが 多く、リントルールに興味を持つきっかけになった 2年ほど XO を運用してきて、実行速度の改善のために Oxlint

    へ移行した 2分10秒から27秒まで約4.8倍高速化することができた ただ全てが順調だったわけではなく、Oxlint と ESLint で実装されているルールに 挙動が違うものがあったり、有効化できないものがあった