Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
XO から Oxlint に移行した話
Search
Ryuya Yanagi
July 24, 2026
Programming
46
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
XO から Oxlint に移行した話
Ryuya Yanagi
July 24, 2026
More Decks by Ryuya Yanagi
See All by Ryuya Yanagi
BFCacheを活用して無限スクロールのUX を改善した話
apple_yagi
0
210
最近の推しリンター、Oxlintをご紹介
apple_yagi
0
940
forwardRef を禁止したくて Biome に PR を出した話
apple_yagi
0
210
PR_TIMESにおけるFastlyの導入と運用について.pptx.pdf
apple_yagi
1
85
PR TIMESにおけるNext.jsとcacheの付き合い方
apple_yagi
4
6k
開発速度を上げつつ品質を保つためのフロントエンド開発
apple_yagi
1
1k
Other Decks in Programming
See All in Programming
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
320
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.1k
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
330
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
690
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
150
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
130
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.1k
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
Agents on Rails - Rails at Scale 2026
irinanazarova
0
530
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.6k
sbt 2.0: takeoff
eed3si9n
0
120
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
1
660
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
870
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
The SEO Collaboration Effect
kristinabergwall1
1
590
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
Speed Design
sergeychernyshev
33
2.1k
The Pragmatic Product Professional
lauravandoore
37
7.5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Deep Space Network (abreviated)
tonyrice
0
360
A Modern Web Designer's Workflow
chriscoyier
699
190k
The browser strikes back
jonoalderson
0
1.8k
Transcript
XOからOxlintに移行した話 FE Yatai Talks vol.2 やなぎ @apple_yagi
やなぎ PR TIMES フロントエンドエンジニア X: @apple_yagi
先々月 XO から Oxlint に移行しました
XO とは sindresorhus(シンドレ・ソーラス)氏が開発した Opinionated なリントルールを 備えたESLintベースのラッパーツール。フォーマッターの機能も兼ね備えており、 xo というワンコマンドでリントとフォーマットを実行することができる。 デフォルトで有効になっているリントルールは500種類ほどある。
XO を使用していた経緯
XO を使用する前の状況 当時リントルールが全く整備されていなかった 各々がルールを好きに有効・無効にしていた なぜこのルールが有効になっているかという議論がちょくちょく発生していた リントルールに詳しい人、そもそも興味がある人が少なかった
リントルールの整備へ そのような状況であったため、ルールを整備することになったがルールセットを 自分たちで作成、運用していくのは難しい そこであらかじめ作成されたルールセットを使用する話になった
ルールセットの選定 昔有名だったルールセットはほとんどメンテナンスされておらず、活発にメンテナ ンスされていたのが XO だった eslint-config-airbnb 2021年12月からリリースが止まっている eslint-config-google 2016年10月からリリースが止まっている 2026年1月からアーカイブされている
eslint-config-standard 2023年5月からリリースが止まっている
XO を導入してどうだったか シンプルに学びが多かった 知らない JavaScript の記法を学ぶことができた 普段書いてるコードの危険性を知ることができた こんなリントルールあるんだ、と思うことが多々あった JavaScript/TypeScript の書き方のベストプラクティスを知れた
XO のバージョンアップをするだけで新しい JS の記法に対応したリントルールが 勝手に追加される リントルールに興味を持つ人が増えた カスタムルールを作成したり、この書き方リントで禁止できないかな、という 話がよく出るようになった
めでたしめでたし
とはならなかった
XO のデメリット 遅い!!! M2 Pro の MacBook で2分10秒ほどかかる ルールが500種類あるので遅いのは一定しょうがない ESLint
には2025年8月にマルチスレッドリンティングが追加されたが、 XO は未対応 XO のアーキテクチャ上、ESLint のマルチスレッドリンティングを使うことは できない
Linter の実行速度の重要性 AI がコードを書く現在ではフィードバックサイクルは生産性に直結する リントやフォーマット、自動テストの速さは重要 コードを書く速度も前と比べてかなり速くなっているので Pull Request も大量に できる
CI 上でリントを回す速度も生産性に直結する XO を2年間ほど運用してきて、リントルールに興味を持つようメンバーも増えて きており、XO に頼らなくても自分たちでルールセットを運用できるのではない かという感覚があった
そこで速度改善のために Oxlint へ移行
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
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倍高速化) プロジェクトの規模が大きくなるほど倍率は上がっていく
ESLint との互換性 ESLint の主要なプラグインのルールを Rust で実装しており、すでに840ものルー ルを実装済み JS plugins という機能を使用することで既存の
ESLint プラグインや JavaScript で 記述したカスタムルールを実行できる
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 に移行してます
実行速度はどれくらい速くなったのか 実行環境は MacBook M2 Pro Linter Duration Speedup vs. XO
XO 2分10秒 Oxlint 27秒 x4.8
めでたしめでたし
と言いたいところですが、 困ったことがいくつかありました
Oxlint のルールと ESLint のルールの 挙動が違う問題
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> ); }
その他にも react/jsx-no-constructed-context-values unicorn/explicit-length-check @typescript-eslint/no-unnecessary-type-arguments @typescript-eslint/prefer-optional-chain などで false-positive なエラーが出たため、Oxlint のルールではなく、JS plugins
経 由で ESLint のルールを使用するようにした
Oxlint では有効にできなかった ルールもあった
有効にできなかったルールたち 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 こちらも同じく
ESLint との併用は考えなかったのか 考えませんでした Oxlint で有効にできないルールを有効にするメリットと、ESLint を併用するコ ストを考えたときに、メリットの方が少ないという判断をした 仮に有効にできないルールがもっとあった or 必要性の高いルールが有効にでき
なかった場合は Oxlint は時期尚早として、移行はしなかったと思う
まとめ フロントエンドのリントルール整備のために XO を導入した 500種類ほどのリントルールが有効になった環境で開発したことは学ぶことが 多く、リントルールに興味を持つきっかけになった 2年ほど XO を運用してきて、実行速度の改善のために Oxlint
へ移行した 2分10秒から27秒まで約4.8倍高速化することができた ただ全てが順調だったわけではなく、Oxlint と ESLint で実装されているルールに 挙動が違うものがあったり、有効化できないものがあった