Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
XO から Oxlint に移行した話
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Ryuya Yanagi
July 24, 2026
Programming
36
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
200
最近の推しリンター、Oxlintをご紹介
apple_yagi
0
750
forwardRef を禁止したくて Biome に PR を出した話
apple_yagi
0
180
PR_TIMESにおけるFastlyの導入と運用について.pptx.pdf
apple_yagi
1
82
PR TIMESにおけるNext.jsとcacheの付き合い方
apple_yagi
4
3.2k
開発速度を上げつつ品質を保つためのフロントエンド開発
apple_yagi
1
1k
Other Decks in Programming
See All in Programming
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
500
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
280
初めての模倣学習とVLA
natsutan
0
180
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
700
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
720
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
100
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
360
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
220
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
380
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
220
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
1
160
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.9k
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Ruling the World: When Life Gets Gamed
codingconduct
0
310
Un-Boring Meetings
codingconduct
0
390
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
210
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
470
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
310
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
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 で実装されているルールに 挙動が違うものがあったり、有効化できないものがあった