Oxlint v1.71 und Oxfmt v0.56 liefern die v0.137-Crates-Gewinne aus, bringen 18 neue Linter-Regeln und zähmen die React-Lifecycle-Traversierung mit einem Streamed-Iterator-Refactor

Oxlint v1.71 und Oxfmt v0.56 liefern die v0.137-Crates-Gewinne aus, bringen 18 neue Linter-Regeln und zähmen die React-Lifecycle-Traversierung mit einem Streamed-Iterator-Refactor

lschvn

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 zwischen Number(x), +x und parseFloat(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.

Häufig gestellte Fragen

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

Oxc v0.137 bringt dem Minifier das Treeshaken reiner Typed Arrays und Set/Map-Literale bei, liefert ein inkrementelles Scoping-Refresh und behebt einen React-Compiler-Randfall
tooling

Oxc v0.137 bringt dem Minifier das Treeshaken reiner Typed Arrays und Set/Map-Literale bei, liefert ein inkrementelles Scoping-Refresh und behebt einen React-Compiler-Randfall

Der Oxc-Release crates_v0.137.0, veröffentlicht am 2026-06-18, liefert zwei neue Minifier-Treeshaking-Pässe (Treeshake reiner Typed Arrays und Set/Map-Array-Literale über #23469, sowie Inlining von Const-Werten für Read-Only-Variablen über #22593), ein lang angelegtes inkrementelles Scoping-Refresh, das den LiveUsageCollector-Kollektor vollständig entfernt (#23197), einen freundlichen Parser-Fehler für benachbarte JSX-Elemente (#23378), einen React-Compiler-Fix für Imports, auf die nur über einen berechneten Schlüssel verwiesen wird (#23586), sowie zwei Breaking Changes an der ESTree-Config-API (#23573, #23574). Die Minifier-Passliste bekommt zusätzlich einen Proxy-bewussten Fix für Object-Introspection-Aufrufe (#23483) und eine neue Erhaltungsregel für Map/WeakSet/WeakMap mit String-Argument (#23470). v0.137 ist der erste Crates-Release seit v0.135 am 2026-06-08 und der zweite seit Buns nativer React-Compiler-Integration, die am 2026-06-20 landete.
Bun integriert den React Compiler direkt in seinen Bundler, rund 20x schneller als das Babel-Plugin
tooling

Bun integriert den React Compiler direkt in seinen Bundler, rund 20x schneller als das Babel-Plugin

PR #32504, am 20. Juni 2026 in oven-sh/bun gemergt, macht den Upstream-Rust-Port des React Compilers zu einer eingebauten `bun build`-Transformation hinter `--react-compiler` und `Bun.build({ reactCompiler: true })`. Bun portiert den Upstream-Workspace `compiler/crates/` aus `facebook/react` direkt in eine einzelne Crate `src/react_compiler/` (~62k LOC), anstatt den Weg über Babel, SWC oder Oxc zu gehen, und in einer großen React-Codebasis (rund 860 Komponenten, 1400 Memo-Slots) läuft der Compiler-Durchlauf in 465 ms gegenüber 9,15 s für das Babel-Plugin. Das Feature ist experimentell, standardmäßig deaktiviert und wird zusammen mit `reactCompilerOutputMode` (client oder ssr) und einem `scripts/sync-react-compiler.sh`-Resync-Skript ausgeliefert.
Astro 7.0.0-beta.6 stabilisiert das Routen-Caching und führt JSX-Whitespace-Kompression als Standard ein
tooling

Astro 7.0.0-beta.6 stabilisiert das Routen-Caching und führt JSX-Whitespace-Kompression als Standard ein

Astro 7.0.0-beta.6 (19. Juni 2026) befördert die experimentelle Routen-Caching-API auf stabile Top-Level-Konfiguration. Die Flags experimental.cache und experimental.routeRules entfallen, ersetzt durch eine cache-Konfiguration der obersten Ebene und einen Cache-Helper. Beta.5 (18. Juni) hat „jsx

Kommentare

Anmelden Melden Sie sich an, um an der Diskussion teilzunehmen.

Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.