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
Ryuya Yanagi
July 24, 2026
Programming
22
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
180
最近の推しリンター、Oxlintをご紹介
apple_yagi
0
590
forwardRef を禁止したくて Biome に PR を出した話
apple_yagi
0
170
PR_TIMESにおけるFastlyの導入と運用について.pptx.pdf
apple_yagi
1
74
PR TIMESにおけるNext.jsとcacheの付き合い方
apple_yagi
4
3.2k
開発速度を上げつつ品質を保つためのフロントエンド開発
apple_yagi
1
990
Other Decks in Programming
See All in Programming
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
330
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
270
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
360
えっ!!コードを読まずに開発を!?
hananouchi
0
230
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
160
霧の中の代数的エフェクト
funnyycat
1
420
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
150
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
190
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.7k
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
350
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
Featured
See All Featured
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
370
Google's AI Overviews - The New Search
badams
0
1.1k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
300
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Prompt Engineering for Job Search
mfonobong
0
380
Agile that works and the tools we love
rasmusluckow
331
22k
Speed Design
sergeychernyshev
33
1.9k
The untapped power of vector embeddings
frankvandijk
2
1.8k
The SEO Collaboration Effect
kristinabergwall1
1
510
First, design no harm
axbom
PRO
2
1.2k
We Have a Design System, Now What?
morganepeng
55
8.2k
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 で実装されているルールに 挙動が違うものがあったり、有効化できないものがあった