ESLint v10 Drops Legacy Config — And the JS Ecosystem Is Taking Notes

ESLint v10 Drops Legacy Config — And the JS Ecosystem Is Taking Notes

lschvn

ESLint v10 landed this month, and while the headline reads like an internal cleanup — flat config is now final, legacy eslintrc is gone — the release exposes a fracture line in the JavaScript tooling landscape that's been building for years.

What actually changed

The headline removal is LegacyESLint, the compatibility layer that kept .eslintrc.json working after flat config (eslint.config.js) became the default in v9. That's gone entirely. The defineParser(), defineRule(), defineRules(), and getRules() methods on Linter are gone. shouldUseFlatConfig() now unconditionally returns true.

The config file lookup also changed meaningfully: ESLint now resolves configuration from the directory of each linted file rather than the current working directory. For monorepos where packages need different rule sets, this is a direct fix to a long-standing pain point.

JSX reference tracking is the other major addition. Previously, ESLint's no-unused-vars would flag components imported and used only in JSX as unused — a false positive that required workarounds like @eslint-react/jsx-uses-vars. That plugin is no longer needed.

RuleTester gets three new assertion options — requireMessage, requireLocation, and requireData — letting plugin authors enforce stricter, more consistent test definitions. Stack traces now include the index and file location of failing test cases.

Node.js support tightened to ^20.19.0 || ^22.13.0 || >=24 — all of v21 and v23 are dropped.

The migration

The official tool handles it cleanly:

px @eslint/migrate-config .eslintrc.json

This generates an eslint.config.mjs that teams review and adjust. The official migration guide covers every breaking change in detail.

One wrinkle: eslint-plugin-react hadn't declared ESLint 10 in its peer dependencies at the time of release, causing install conflicts for React projects. eslint-config-next had a similar open issue. Both have since been addressed, but it's a reminder that ecosystem lag is real when a breaking change this significant ships.

The competitive context

ESLint has sat largely unchallenged as the default JS linter for over a decade. That position is now being tested from two directions simultaneously.

Biome combines linting and formatting in a single tool — no separate ESLint + Prettier setup — with 467 rules covering ESLint, TypeScript ESLint, and other sources. Its v2.4 release (February 2026) added embedded CSS and GraphQL snippet support, 15 HTML accessibility rules, and experimental full parsing for Vue, Svelte, and Astro. It ships a Rust-based parser and is known for significantly lower memory usage.

Oxc takes the performance argument further. Its linter, Oxlint, claims 50–100x faster throughput than ESLint depending on CPU core count. It has 700+ rules, true type-aware linting via its tsgo project, and supports ESLint JS plugins natively. Its formatter, Oxfmt, benchmarks 30x faster than Prettier and 3x faster than Biome. All of it is open source under the OpenJS Foundation.

The trade-off is rule coverage. Oxlint doesn't yet match ESLint's full catalogue, and Biome is still catching up on TypeScript-specific rules. But the trajectory is clear, and the performance gap is not marginal — it's structural. ESLint's single-threaded JavaScript architecture has a ceiling that Rust-based alternatives don't share.

tldr

  • ESLint v10 removes LegacyESLint and legacy eslintrc entirely — flat config is the only option now, and config lookup starts from each file's directory for better monorepo support
  • JSX reference tracking eliminates a long-standing false positive with no-unused-vars, and RuleTester gets meaningful improvements for plugin authors
  • Rust-based challengers Biome and Oxc are making real inroads: Biome combines linting and formatting in one tool, while Oxlint claims 50–100x throughput over ESLint with 700+ rules and ESLint plugin compatibility

faq

  • Should I upgrade immediately? If you're on Vercel or a platform with managed ESLint, your config will likely be updated automatically. For custom setups, test in CI before rolling out.
  • Does this break my React project? Possibly — if eslint-plugin-react hasn't been updated for your project, you may hit peer dependency conflicts. Check your package manager's resolution output.
  • Should I switch to Biome or Oxlint? Not yet for full ESLint parity, but worth evaluating if lint performance is a bottleneck. Both are production-ready for most projects.
  • What's the Node.js requirement? v10 needs Node.js 20.19+, 22.13+, or 24+. Node 21 and 23 are dropped.

Related articles

More coverage with overlapping topics and tags.

Oxc Is Quietly Building the Fastest JavaScript Toolchain in Rust — And It's Almost Ready
javascript

Oxc Is Quietly Building the Fastest JavaScript Toolchain in Rust — And It's Almost Ready

While ESLint v10 was wrestling with legacy cleanup, the Oxc project shipped a linter 100x faster, a formatter 30x faster than Prettier, and a parser that leaves SWC in the dust. Here's what the JavaScript oxidation compiler actually is.
Knip v6 Lands oxc Parser for 2-4x Performance Gains Across the Board
typescript

Knip v6 Lands oxc Parser for 2-4x Performance Gains Across the Board

The popular dependency and unused-code scanner for JavaScript and TypeScript gets a major overhaul, replacing its TypeScript backend with the Rust-based oxc-parser — and the results are dramatic.
Next.js 16.2 Stabilizes the Adapter API — and It's a Bigger Deal Than It Sounds
typescript

Next.js 16.2 Stabilizes the Adapter API — and It's a Bigger Deal Than It Sounds

Vercel, Netlify, Cloudflare, AWS, and Google Cloud all signed the same public contract. Next.js 16.2 makes cross-platform deployment a first-class, documented feature.

Comments

Log in Log in to join the conversation.

No comments yet. Be the first to share your thoughts.