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
47
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
220
最近の推しリンター、Oxlintをご紹介
apple_yagi
0
950
forwardRef を禁止したくて Biome に PR を出した話
apple_yagi
0
220
PR_TIMESにおけるFastlyの導入と運用について.pptx.pdf
apple_yagi
1
88
PR TIMESにおけるNext.jsとcacheの付き合い方
apple_yagi
4
6k
開発速度を上げつつ品質を保つためのフロントエンド開発
apple_yagi
1
1k
Other Decks in Programming
See All in Programming
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.8k
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
680
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
34k
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
300
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
160
ChromeでローカルLLM
ryu1013
0
160
sbt 2.0: takeoff
eed3si9n
0
170
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
290
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
170
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
140
AWSに止められる覚悟してますか?
morizo_1984
2
540
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
Exploring anti-patterns in Rails
aemeredith
4
540
Un-Boring Meetings
codingconduct
0
460
Paper Plane
katiecoart
PRO
5
54k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
480
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
270
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
430
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.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 で実装されているルールに 挙動が違うものがあったり、有効化できないものがあった