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

SWC v1.15.43 bringt den React Compiler als erstklassige Transformation, behebt einen stillen Template-Literal-Minifier-Bug und richtet `unsafe_math` an Terser aus

SWC v1.15.43, veröffentlicht am 2026-06-22 mit swc_core v71.0.3, liefert den experimentellen Rust-React-Compiler als konfigurierbare SWC-Transformation über .swcrc jsc.transform.reactCompiler (PR #11917, 54 Dateien, 12.986 Hinzufügungen); behebt einen stillen Template-Literal-Minifier-Bug, bei dem `compress` den Text nach der letzten Interpolation des linken Template-Literals beim Verketten zweier Template-Literale abschnitt (#11939); koppelt Number(x) -> +x an SOWOHL `unsafe: true` ALS AUCH `unsafe_math: true`, um mit terser v4.3.11+ übereinzustimmen (#11944, #11949); korrigiert den Geltungsbereich von ES2022-Privatfeld-Brand-Checks (#11953); und bringt sieben interne React-Compiler-Korrekturen (#11940, #11943, #11946, #11950, #11951, #11952, #11957) sowie eine Parser-Korrektur für No-Default-Builds (#11956) und einen Dok-Eintrag zum Sicherheitsumfang nicht vertrauenswürdiger Eingaben (#11937).

Vite 8.1.0 stable bringt Bundled Dev Mode (15x schnellerer Start bei 10k-React-Komponenten), WASM-ESM-Importe und Chunk Import Map, erweitert server.fs.deny um .npmrc und private Schlüssel

Vite 8.1.0 stable, veröffentlicht am 2026-06-23 vom Vite-Team (announcing-vite8-1), hebt Bundled Dev Mode von einem experimentellen Flag auf einen dokumentierten --experimental-bundle-Einstiegspunkt (15x schnellerer Cold Start bei einer React-App mit 10 000 Komponenten, 10x schnellere Full Reloads; Linear meldet 3x schnelleres Cold-Start-Rendering, ~40% schnellere Full Reloads), stabilisiert die WASM-ESM-Integration mit direkten .wasm-Importen und build.chunkImportMap aus der 8.1-Beta vom 2026-06-15, bringt Lightning CSS mit External-CSS-in-CSS und Plugin-Dateiabhängigkeiten einen Schritt näher an den Default-Status, aktualisiert Rolldown auf 1.1.2 (1.1.3 folgt am selben Tag), pinnt rolldown mit einem Tilde-Range, sodass Patch-Releases ohne Vite-PR durchfließen, erweitert server.fs.deny um .npmrc, .yarnrc.yml und *.{key,p12,pfx,cer,der} und gibt eine Runtime-Deprecation-Warnung für envFile: false aus.

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

Oxlint v1.72 und Oxfmt v0.57 liefern den crates-v0.138-Zyklus aus, vereinheitlichen den AstBuilder und entfernen den Prettier-Fallback für CSS/GraphQL
tooling

Oxlint v1.72 und Oxfmt v0.57 liefern den crates-v0.138-Zyklus aus, vereinheitlichen den AstBuilder und entfernen den Prettier-Fallback für CSS/GraphQL

Oxlint apps_v1.72.0 und oxfmt apps_v0.57.0, beide am 2026-06-29 veröffentlicht, schließen den v0.138-Zyklus ab, der in den [v1.71-Versionsnotizen](/articles/2026-06-23--oxlint-v1-71-oxfmt-v0-56) vorausgesagt wurde. Das crates-Release (crates_v0.138.0, ebenfalls 2026-06-29) vereinheitlicht die alten und neuen AstBuilder-APIs (#23876, #23834, #23831, mit den Legacy-Methoden als `#[deprecated]` markiert), benennt `AllocatorAccessor` in `GetAllocator` um und lässt dessen `allocator`-Methode `&self` annehmen (#23675, #23676), lässt `Str`- und `Ident`-Methoden `&GetAllocator` annehmen (#23781), fügt `transformer_plugins: Support typeof define keys` für vue-i18n und ähnliche Makros hinzu (#23605, Alexander Lichter) und liefert die herausragende Performance-Eintragung des Zyklus: `minifier: memoize value_type to remove its O(n^2) re-walk on long binary chains` (#23929, Dunqing), die eine arithmetische Additionskette mit 20 000 Gliedern von 6 118 ms auf 4,7 ms (≈1300x) bringt und das reale antd.js-Bundle von 78,1 ms auf 65,4 ms. Oxlint v1.72.0 liefert 3 Features (React-`no-unknown-property`-Vorschlag #23936, AstBuilder-Vereinheitlichung #23875, Schema für `eslint/no-restricted-import` #23642), 18 Fehlerbehebungen und 23 Performance-Eintragungen. Oxfmt v0.57.0 enthält zwei BREAKING-Änderungen, die den Prettier-Fallback für CSS/LESS/SCSS- und GraphQL-Dateien entfernen: `Format parser:css,less,scss files + css-in-js by oxc_formatter_css` (#23321, leaysgur) und `Support draft syntax with removing prettier fallback` (#23326, leaysgur), beide aufbauend auf den neuen Crates `oxc_formatter_css` (#23320) und `oxc_formatter_graphql` (#23317).
Vite 8.1.0 stable bringt Bundled Dev Mode (15x schnellerer Start bei 10k-React-Komponenten), WASM-ESM-Importe und Chunk Import Map, erweitert server.fs.deny um .npmrc und private Schlüssel
tooling

Vite 8.1.0 stable bringt Bundled Dev Mode (15x schnellerer Start bei 10k-React-Komponenten), WASM-ESM-Importe und Chunk Import Map, erweitert server.fs.deny um .npmrc und private Schlüssel

Vite 8.1.0 stable, veröffentlicht am 2026-06-23 vom Vite-Team (announcing-vite8-1), hebt Bundled Dev Mode von einem experimentellen Flag auf einen dokumentierten --experimental-bundle-Einstiegspunkt (15x schnellerer Cold Start bei einer React-App mit 10 000 Komponenten, 10x schnellere Full Reloads; Linear meldet 3x schnelleres Cold-Start-Rendering, ~40% schnellere Full Reloads), stabilisiert die WASM-ESM-Integration mit direkten .wasm-Importen und build.chunkImportMap aus der 8.1-Beta vom 2026-06-15, bringt Lightning CSS mit External-CSS-in-CSS und Plugin-Dateiabhängigkeiten einen Schritt näher an den Default-Status, aktualisiert Rolldown auf 1.1.2 (1.1.3 folgt am selben Tag), pinnt rolldown mit einem Tilde-Range, sodass Patch-Releases ohne Vite-PR durchfließen, erweitert server.fs.deny um .npmrc, .yarnrc.yml und *.{key,p12,pfx,cer,der} und gibt eine Runtime-Deprecation-Warnung für envFile: false aus.
SWC v1.15.43 bringt den React Compiler als erstklassige Transformation, behebt einen stillen Template-Literal-Minifier-Bug und richtet `unsafe_math` an Terser aus
tooling

SWC v1.15.43 bringt den React Compiler als erstklassige Transformation, behebt einen stillen Template-Literal-Minifier-Bug und richtet `unsafe_math` an Terser aus

SWC v1.15.43, veröffentlicht am 2026-06-22 mit swc_core v71.0.3, liefert den experimentellen Rust-React-Compiler als konfigurierbare SWC-Transformation über .swcrc jsc.transform.reactCompiler (PR #11917, 54 Dateien, 12.986 Hinzufügungen); behebt einen stillen Template-Literal-Minifier-Bug, bei dem `compress` den Text nach der letzten Interpolation des linken Template-Literals beim Verketten zweier Template-Literale abschnitt (#11939); koppelt Number(x) -> +x an SOWOHL `unsafe: true` ALS AUCH `unsafe_math: true`, um mit terser v4.3.11+ übereinzustimmen (#11944, #11949); korrigiert den Geltungsbereich von ES2022-Privatfeld-Brand-Checks (#11953); und bringt sieben interne React-Compiler-Korrekturen (#11940, #11943, #11946, #11950, #11951, #11952, #11957) sowie eine Parser-Korrektur für No-Default-Builds (#11956) und einen Dok-Eintrag zum Sicherheitsumfang nicht vertrauenswürdiger Eingaben (#11937).

Kommentare

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

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