Oxlint v1.71.0 und oxfmt v0.56.0 sind am 22. Juni 2026 gemeinsam erschienen, vier Tage nach der crates_v0.137.0-Release und eine Woche nach der v1.70.0-Apps-Release. Die Release ist die Apps-seitige Übernahme des v0.137-Crates-Zyklus und die letzte Apps-Release, bevor die v0.138-Crates-Linie am Montag 2026-06-29 erscheint. Die zentrale Arbeit ist der Bucketed-Rule-Dispatch-Refactor auf der Linter-Seite und die CRLF-Normalisierung plus der Member-Chain-Panic-Fix auf der Formatter-Seite.
Die Oxlint-Release trägt 18 neue Features, 28 Bugfixes und 13 Performance-Einträge. Die Oxfmt-Release trägt 9 Bugfixes und 3 Performance-Einträge. Insgesamt: 71 Einträge über die beiden Apps verteilt, vergleichbar mit dem v1.70-Zyklus und leicht über dem v1.68-Zyklus.
Das zentrale Thema: Bucketed Rule Dispatch
Die größte einzelne Performance-Änderung in v1.71 ist linter: Reuse rule dispatch buckets (#23450, camc314), gefolgt von linter: Use bucketed dispatch for all files (#23452, camc314). Vor v1.71 emittierte der Linter einen RuleEnum-Match-Arm pro Timing-Branch bei jedem Eintritt in eine Regel und emittierte dieselben Match-Arme bei jeder folgenden Datei erneut. Der Bucketed-Refactor verschiebt die Match-Arme in eine einzige Allokation, die über alle Dateien eines Runs hinweg wiederverwendet wird.
Der ergänzende Performance-Eintrag ist linter: Emit RuleEnum dispatch match once instead of per timing branch (#23499, Boshen). Zusammen entfernen die beiden PRs die pro-Datei-Setup-Kosten, die bei Cold Runs die Wandzeit von oxlint dominierten. Die Regel-Arbeit selbst war bereits schnell; teuer war die Buchhaltung darum herum.
Die Release fixt zudem die Kaltstart-Kosten: oxlint: Start Tokio only for LSP (#23447, camc314) verschiebt den Tokio-Async-Runtime-Start aus dem CLI-Pfad. Vor v1.71 startete oxlint bei jeder Aufrufung eine Tokio-Runtime, auch wenn die CLI synchron lief und nie eine brauchte. Nach v1.71 bekommt der LSP-Pfad weiterhin eine Runtime (er braucht eine, um das Language-Server-Protokoll zu bedienen), und der CLI-Pfad überspringt die Startup-Kosten vollständig.
Die v0.137-Crates-Übernahme
Die v0.137-Crates-Release vom 18. Juni lieferte zwei neue Minifier-Treeshaking-Passes, einen lang laufenden inkrementellen Scoping-Refresh, der LiveUsageCollector entfernte, und zwei ESTree-Breaking-Changes. Die v1.71-Apps-Release übernimmt die für den Benutzer sichtbaren Teile: minifier: Treeshake pure typed arrays and Set/Map array literals (#23469, Dunqing) ist im v1.71-Minifier-Build, zusammen mit der LiveUsageCollector-Entfernung, den Parser-Performance-Patches und den React-Compiler-Performance-Einträgen. Die beiden ESTree-Breaking-Changes (#23574, #23573) sind opt-in: Sie betreffen nachgelagerte Crates, die einen eigenen ESTree-AST bauen, nicht die Oxlint-Nutzer.
Die Begleit-Minifier-Passe inline const value for read-only vars (#22593) ist ebenfalls im v1.71-Minifier-Build. Beide Passes bleiben standardmäßig aus; die CompressOptions-Defaults des Minifiers entsprechen in v1.71 v1.70 / v0.136, daher sind die Gewinne opt-in über die Konfiguration.
18 neue Linter-Regeln
Die v1.71-Release liefert 18 neue Linter-Regeln aus den Kategorien ESLint, TypeScript, Node, Unicorn, Vue, JSDoc und React. Die wichtigsten:
unicorn/prefer-number-coercion(#23497, Shekhu) erkennt das Konsistenzproblem zwischenNumber(x),+xundparseFloat(x)zur Lint-Zeit.node/no-sync(#23589, fujitani sora) markiert synchrone Dateisystem- und Kindprozess-Aufrufe in Server-Einstiegspunkten.vue/no-async-in-computed-properties(#23493, bab) schließt eine echte Korrektheitslücke in Vue-Computed-Property-Definitionen.node/no-mixed-requires(#23539, fujitani sora) markiert gemischte Require-Stile in CommonJS-Modulen.unicorn/max-nested-calls(#23461, arieleli01212) erkennt zu tief verschachtelte Funktionsketten.
Die Release liefert außerdem Schema-Support für eslint/no-restricted-properties (#23619, Sysix), node/callback-return (#23615, Sysix), import/extensions (#23557, WaterWhisperer), unicorn/numeric-separators-style (#23554, Mikhail Baev), eslint/prefer-destructuring (#23410, WaterWhisperer) und react/jsx-no-script-url (#23475, WaterWhisperer). Die Schema-Arbeit eröffnet Migrationspfade aus ESLint-Konfigurationen, die zuvor manuell waren.
Auf der Suggestion-Seite fügen linter/typescript: Implement suggestion for no-unnecessary-type-constraint rule (#23646, Mikhail Baev) und linter/jsdoc/require-param-type: Implement fixer (#23513, camc314) Auto-Fix-Support für zwei Regeln hinzu, die zuvor nur meldeten.
Der React-Lifecycle-Refactor
Die größte einzelne Quelle für Allokations-Churn auf React-Codebases mit tief verschachtelten Komponenten war die react/no-deprecated- und react/jsx-no-undef-Traversierung, die jeden Vorfahren jedes JSX-Elements in einem Vec sammelte, bevor sie irgendwelche Regel-Arbeit verrichtete. linter: Stream React lifecycle ancestors (#23545, camc314) ersetzt die Vec-Sammlung durch einen Streaming-Iterator, der die Vorfahrenkette bedarfsgesteuert durchläuft.
Zusammen mit linter: Avoid JSX fragment child collections (#23486, camc314) und linter/oxc/branches-sharing-code: Borrow shared branch suggestion text (#23484, camc314) ist v1.71 die erste Release, in der die React-bezogenen Linter-Regeln auf dem Hot Path allokationsbewusst arbeiten. Die drei PRs machen zusammen den Großteil der React-bezogenen Performance-Arbeit in dieser Release aus.
28 Lint-Bugfixes, größtenteils Yunfei He
Die 28 Lint-Bugfixes in v1.71 werden von Yunfei He Fixer-Rewrite-Arbeit dominiert. Das Muster ist über alle Fixes hinweg dasselbe: Der Linter vor v1.71 schrieb eine Code-Konstruktion mit String-Konkatenation um, entfernte Klammern, die der Quellcode explizit hinzugefügt hatte, oder klebte ein Fragment an eine Stelle, die ungültige Syntax erzeugte. Die v1.71-Fixes erhalten Klammern (#23578, #23579), erhalten den Operand-Quelltext (#23533), überspringen Fixes auf Empfängern, die nicht vom erwarteten Typ sind (#23518, #23520, #23527), und erhalten Import-Aliase (#23568).
Der bemerkenswerteste Fix ist der parseInt(_, spread)-Panic. linter/radix: Avoid panic on parseInt with a spread radix argument (#23623, Jerry Zhao) schließt einen echten Panic, der ausgelöst wurde, wenn parseInt(x, ...args) mit einem berechneten Radix-Argument aufgerufen wurde. Derselbe Fix wurde in derselben Release auf zwei benachbarte Regeln angewendet: linter/prefer-numeric-literals (#23624, Jerry Zhao) und der linter/radix-Follow-up (#23626). Vor v1.71 panicte der Linter und ließ die CI auf Codebases abstürzen, die parseInt mit berechneten Radix-Argumenten verwendeten.
Weitere erwähnenswerte Bugfixes: linter/prefer-query-selector: Use a compound selector for multiple classes (#23628, Jerry Zhao) fixt eine Korrektheitslücke in prefer-query-selector, bei der ein Multi-Class-Selektor als Folge von Single-Class-Selektoren umgeschrieben wurde, was die semantische Absicht brach; linter: False positives with non *.setTimeout call in no-confusing-set-timeout (#23444, camc314) hindert die Regel daran, setTimeout-Aufrufe aus einem umbenannten Import zu markieren; und linter/eslint/no-useless-assignment: Handle exceptional control-flow paths (#23544, camc314) schließt eine Korrektheitslücke, bei der die Regel Zuweisungen innerhalb von try/finally-Blöcken übersah.
Die Formatter-Änderungen
Oxfmt v0.56.0 liefert drei substanzielle Änderungen. Die erste ist die CRLF-Normalisierung für unterdrückten Text: formatter_json: Normalize CRLF for suppressed text (#23702, leaysgur) und formatter: Normalize CRLF for suppressed text (#23701, leaysgur) sorgen dafür, dass Unterdrückungskommentare wie // @ts-ignore und // oxlint-disable-next-line ihre Zeilenenden behalten, wenn der Formatter den umgebenden Code in einem Projekt umschreibt, das CRLF und LF mischt. Die zweite ist der Member-Chain-Panic-Fix: formatter: Member chain panic when tail is merged with comment in dev build (#23698, leaysgur) schließt einen Panic im Dev-Build, der ausgelöst wurde, wenn das Ende einer Member-Chain mit einem nachgestellten Kommentar verschmolz. Die dritte ist formatter: Preserve parens with default export and type cast (#23697, leaysgur), die Klammern um export default x as Y-Konstrukte erhält, die der Formatter zuvor einebnete.
Die Formatter-Performance-Einträge sind kleiner, aber konsistent: formatter: Avoid arena copy for already-lowercase bigint literals (#23534, Yunfei He), formatter: Avoid arena copy for borrowed numeric-literal text (#23512, Yunfei He) und formatter: Avoid arena copy for borrowed string-literal text (#23465, Yunfei He) entfernen alle Arena-Kopien, die der Formatter vor v0.56 auf Text durchführte, von dem der Formatter bereits festgestellt hatte, dass er gefahrlos geborgt werden konnte.
Was v1.71 nicht ändert
Die Release ändert keine Regel-Defaults, die Parser-Oberfläche oder die öffentliche API des React Compilers. Die CompressOptions-Defaults des Minifiers entsprechen v1.70 / v0.136. Der LSP-Server erhält den Tokio-Startup-Fix, aber keine neue Protokollfunktion. Die nächste Crates-Release am Montag 2026-06-29 (v0.138) wird die erste sein, die Änderungen ausliefert, die nicht im v0.137-Zyklus sind; die v1.71-Apps-Release schließt den Zyklus ab, der mit crates_v0.135 am 2026-06-08 begann und über die v1.70-Apps-Release am 2026-06-15 läuft.
Die Release ist zudem die dritte, die das Emoji-Section-Format (🚀 Features, 🐛 Bug Fixes, ⚡ Performance, 📚 Documentation) des Oxc-Teams trägt, das Oxc v0.135 einführte. Das Muster entspricht dem Biome-Changelog-Format und den Vite-8-Release-Notes und macht es einfacher, eine Release danach zu scannen, was für Ihren Code relevant ist.
Was zu beobachten ist
Drei Nachfolgeereignisse sind in den nächsten zwei bis vier Wochen wahrscheinlich. Das erste ist die crates_v0.138.0-Release am Montag 2026-06-29, die erste Crates-Release außerhalb des v0.137-Zyklus. Das zweite ist die entsprechende oxlint v1.72.0- und oxfmt v0.57.0-Apps-Release am Montag 2026-07-06, die aufgreift, was die v0.138-Crates-Linie ausliefert. Das dritte ist die Fortsetzung von camc314s Bucketed-Dispatch-Refactor: Die v1.71-Release hat das Fundament gelegt, aber mehrere Regeln verwenden noch das pro-Regel-Allokationsmuster, das v1.71 für die Dispatch-Schicht abgeschafft hat; rechnen Sie mit weiterer Bucketing-Arbeit in v1.72.



