Skip to main content

Why Developers Are Moving to Rust-Based Tools 2026

·PkgPulse Team
0

TL;DR

Developers aren't learning Rust — they're using tools written in Rust. The distinction matters. You don't need to know Rust to use SWC, Biome, Turbopack, or Rspack. You just install an npm package, and suddenly your builds are 10x faster. The adoption pattern is pragmatic: when a Rust tool reaches API parity with its JS predecessor and the migration path is < 1 hour, teams switch. That threshold has been crossed for transpilation, formatting, and linting in 2026.

Key Takeaways

  • Speed is the gateway drug — 10-100x faster feedback loops justify the switch
  • Migration cost matters — Tools with JS-compatible APIs win (Biome ≈ ESLint, Rspack ≈ Webpack)
  • The "no config" advantage — Biome replaces two configs with one; tsx replaces ts-node configs
  • Not a rewrite — Most teams adopt Rust tools incrementally, one tool at a time
  • Rule parity is the blocker — Teams hold back when the Rust tool lacks rules they depend on

The Adoption Pattern

How teams actually switch to Rust-based tools:

Stage 1: The Slow Build Problem

Every team hits this. CI takes 5 minutes. Local build takes 30 seconds. Nobody talks about it; everyone hates it.

# A typical pre-Rust CI pipeline:
lint (ESLint + Prettier):   ~45s
type-check (tsc):           ~25s
test (Jest):                ~90s
build (Webpack):            ~180s
Total:                      ~340s (~6 minutes)

# Post-Rust CI pipeline:
lint (Biome):               ~2s
type-check (tsc --noEmit):  ~22s  # tsc has no Rust replacement
test (Vitest):              ~40s
build (Turbopack/esbuild):  ~30s
Total:                      ~94s (~1.5 minutes)

The CI speed win is what opens the conversation.

Stage 2: The Gateway Tool (Usually Formatting)

Prettier → Biome is the most common entry point. The motivation: formatting is 100% mechanical. There's no linting philosophy, no team debate. It just formats code. When Biome formats identically to Prettier and runs 30x faster, the migration is a no-brainer.

# Migration path: Prettier → Biome
# 1. Install Biome
npm install --save-dev @biomejs/biome

# 2. Generate biome.json from .prettierrc
npx @biomejs/biome migrate prettier --write

# 3. Replace scripts
# "format": "prettier --write ." → "format": "biome format --write ."

# 4. Remove Prettier
npm uninstall prettier

# Time: ~20 minutes
# Risk: Very low (formatting is non-breaking)

Stage 3: Bundler Migration

After formatting, teams often look at build speed. The pattern here is more risk-sensitive:

Vite path:
  - New React/Vue projects: Start with Vite
  - Existing Webpack: Consider if webpack-specific plugins are blocking

Rspack path:
  - Existing Webpack: Same config, Rust speed
  - Good for: large apps (1000+ modules) where Webpack is slow
  - Not good for: small apps already fast enough

Turbopack path:
  - Next.js users: Already have it
  - Zero migration cost — it's the default in Next.js 15

Where the Resistance Comes From

Not every team switches, and the reasons are worth understanding:

1. ESLint Plugin Ecosystem

// Teams stay on ESLint for specific plugin coverage:
// eslint-plugin-react-hooks — critical for React
// eslint-plugin-jsx-a11y — accessibility rules
// @tanstack/eslint-plugin-query — TanStack Query rules
// eslint-plugin-import — import ordering, missing deps
// @typescript-eslint — advanced TypeScript rules

// Biome's coverage in 2026:
// ✅ ~300 rules (vs ESLint's ~700+ across plugins)
// ⚠️ No React hooks plugin equivalent yet
// ⚠️ No import plugin equivalent yet
// ✅ No config complexity (one file)

The compromise many teams use:

// Use Biome for formatting + basic linting
// Keep ESLint for framework-specific rules only

// package.json
{
  "scripts": {
    "format": "biome format --write .",
    "lint": "eslint src/ --ext .ts,.tsx",  // Only for React hooks etc.
    "check": "biome check . && eslint src/"
  }
}

2. Native Addon Compatibility

Some packages use Node.js native addons (.node files compiled from C++). These target V8 specifically and may not work on Bun's JSC or require recompilation for ARM vs x86.

3. "Good enough" Problem

For small projects, a 2-second lint step doesn't need to become a 20ms lint step. The investment in migration isn't worth the gain.


The Technical Reason Rust Won

JavaScript tooling in Rust has three concrete advantages:

1. Parallelism

Node.js: event loop, single-threaded JS, worker threads for parallelism
Rust:    native threads, no GIL, shares memory safely via ownership system

Result: Biome can analyze 1000 files simultaneously in native threads
        ESLint runs rules mostly single-threaded (worker_threads helps but overhead exists)

2. Zero-copy parsing

Typical JS parser (acorn, babylon):
  String → char[]  → AST nodes (heap allocations per node)

Rust AST (SWC, oxc):
  String → AST backed by arena allocator
  Thousands of nodes in one allocation
  Cache-friendly, no GC pressure

3. AOT compilation

JavaScript tools: JIT compiled at runtime, warm-up time exists
Rust tools: compiled to native machine code, immediate peak performance

The Practical Migration Roadmap

For a team ready to move:

Week 1: Formatting
  - Replace Prettier with Biome formatter
  - ~20 min migration, zero risk
  - Win: 30x faster formatting, fewer deps

Week 2-3: Linting (partial)
  - Add Biome linting rules
  - Keep ESLint only for rules Biome doesn't have
  - Win: 80% of lint runs faster

Month 2: Bundler (if appropriate)
  - Next.js: Already on Turbopack, no action
  - Vite users: Already fast enough (Vite dev = ESM, no bundle)
  - Webpack users: Evaluate Rspack migration

Ongoing: Test runner
  - Migrate from Jest → Vitest (1-2 hours, worth it for ESM support alone)

Tools That Don't Have Rust Replacements Yet

Not everything has moved to Rust:

ToolStatus in 2026
TypeScript type checking (tsc)No Rust alternative — too complex
Babel plugins (custom transforms)Stay on Babel if using custom plugins
Webpack custom loadersRspack supports most; some need updates
ESLint framework pluginsNo Biome equivalent for react-hooks etc.
Prettier plugins (MDX, etc.)Biome supports some but not all

The rule: Rust tools win on the generic cases. Custom/niche tooling stays in JavaScript.


Common Mistakes When Adopting Rust Tools

Teams that switch to Rust-based tooling often stumble in predictable ways. Knowing these pitfalls saves hours of debugging.

Mistake 1: Assuming Config Parity

Biome's biome.json is not a drop-in replacement for .eslintrc. Many rules have different names, different defaults, or don't exist yet. Teams that assume "same rules, faster execution" end up with either failing CI or silently permissive linting. The fix: audit your existing ESLint config rule by rule before migrating, and use biome migrate eslint to handle the mechanical parts.

Mistake 2: Forgetting the TypeScript Type Checker

SWC and esbuild compile TypeScript by stripping types — they do not type-check. This means your build can succeed even when tsc --noEmit would fail. Teams that remove tsc from their pipeline thinking "SWC handles TypeScript" are shipping type errors silently.

// package.json — keep tsc in CI even when using SWC for building
{
  "scripts": {
    "build": "swc src -d dist",
    "typecheck": "tsc --noEmit",
    "ci": "npm run typecheck && npm run build"
  }
}

Mistake 3: Rspack + Webpack Plugin Conflicts

Rspack aims for Webpack compatibility but is not 100% identical. Webpack plugins that use internal APIs (compiler.hooks, resolver internals) may break silently. Before migrating, audit each Webpack plugin in your config and check the Rspack compatibility list. The safe approach: test Rspack in a branch, run both build outputs side-by-side, compare file hashes.

Mistake 4: Rushing the Biome + ESLint Dual Setup

Some teams add Biome alongside ESLint without removing overlapping rules, then wonder why CI catches different things locally vs remotely. If you run both tools, ensure they don't check the same rules. A formatter running twice with different configs can also cause endless format loops in editors.

Mistake 5: Ignoring Line Endings and Encoding

Biome's formatter handles line endings differently than Prettier in some edge cases. On Windows + WSL2 teams, this can cause persistent diffs where the formatter re-formats already-formatted files. Always set lineEnding explicitly in biome.json and standardize across your team.


When Rust Tools Are the Wrong Choice

The performance gains of Rust tooling are real, but there are clear scenarios where switching is the wrong move.

When your existing JS tooling is fast enough. For a 10-file project or a simple script repository, Webpack's 2-second build doesn't need to become an 80ms build. The migration overhead — learning new config syntax, debugging edge cases, updating CI — costs more than the speedup gains back.

When you depend on an ESLint plugin with no Biome equivalent. If your codebase relies on eslint-plugin-react-hooks for enforcing hooks rules, eslint-plugin-jsx-a11y for accessibility enforcement, or @typescript-eslint rules for advanced type-aware linting, you can't fully replace ESLint yet. These rules have no Biome equivalents as of 2026. Running both tools works but eliminates some of the simplicity benefit.

When you have a large Babel plugin ecosystem. Babel plugins that transform JSX in unusual ways, add custom decorators, or implement macros (like babel-plugin-macros) may not work with SWC. SWC has Babel-compatible plugin support via WASM, but performance drops and compatibility is not guaranteed. If custom Babel transforms are core to your build, stay on Babel.

When your team is on Windows with native addons. Some Rust-based tools ship platform-specific binaries. While this has improved significantly, occasional install failures on certain Windows configurations still occur. Teams with strict IT policies around native binary installation may face friction.

When you're mid-way through another major migration. Migrating Webpack → Rspack while simultaneously moving to React Server Components and upgrading to TypeScript 5 is asking for trouble. Rust tool migrations are low-risk individually but compound with other changes. Pick one thing at a time.


The Oxc Ecosystem: What's Coming

Oxc (the Oxidation Compiler) is the most watched Rust tool project for 2026 and beyond. Where SWC focused on being a Babel replacement, Oxc aims to be a complete, unified JavaScript infrastructure layer.

As of 2026, Oxc provides:

  • oxc-parser — claimed to be the fastest JavaScript/TypeScript parser available
  • oxc-linter (oxlint) — a linter that runs ~50-100x faster than ESLint on large codebases
  • oxc-transform — a transformer replacing Babel/SWC for most transform tasks
  • oxc-minifier — an alternative to Terser for minification

The key difference from Biome: Oxc is building a toolkit meant to power other tools (Rolldown, Vite's next bundler) rather than an end-user CLI. Rolldown — the Rust-based Rollup replacement built on Oxc — is expected to become Vite's default bundler, meaning every Vite user will benefit from Oxc performance without changing any configuration.

# oxlint — you can already use it today
npx oxlint@latest src/

# Significantly faster than ESLint, growing rule coverage
# Can run alongside ESLint as a fast pre-check

The Oxc ecosystem represents the next generation of Rust JS tooling: not just individual faster tools, but a unified infrastructure layer that the entire ecosystem builds on.


Ecosystem Integration: How Rust Tools Work Together

Rust-based tools aren't isolated replacements — they compose into a coherent, fast pipeline:

Source code (TypeScript, JSX)
        │
        ▼
  oxc-parser / SWC parser   ← Fastest parsing layer
        │
        ▼
  oxlint / Biome linting    ← Lint in parallel across all files
        │
        ▼
  SWC transform / oxc-transform  ← Strip types, transform JSX
        │
        ▼
  Rolldown / Rspack / Turbopack  ← Bundle modules
        │
        ▼
  oxc-minifier / esbuild minify  ← Minify output
        │
        ▼
  vite-plugin-compression (Brotli)  ← Compress

Each layer is replaceable independently. A team might use Biome for linting + SWC for transforms + Webpack for bundling — or go all-in with oxlint + Rolldown. The tools interoperate because they share a common data model (ESTree-compatible ASTs, source maps) and npm packaging.

One underappreciated integration: SWC powers Next.js's compiler (replacing Babel by default since Next.js 12) and esbuild powers Vite's dependency pre-bundling (for fast dev server startup). Most developers using Next.js or Vite are already using Rust-based tools without knowing it.


FAQ

Q: Will I notice the speed difference on a small project?

On projects under 20-30 files, the absolute time saved is minimal — a 200ms lint might become a 20ms lint. The bigger wins are psychological: near-instant feedback loops change how you work. You save changes constantly instead of waiting for lint to finish.

Q: Is Biome stable enough for production use?

Yes. Biome reached v1.0 in 2023 and has been production-stable since. Large codebases, including PkgPulse itself, use it as the primary formatter and linter. The main caveat: check that your specific ESLint rules have Biome equivalents before fully removing ESLint.

Q: Can I use Rust tools with Yarn/pnpm workspaces?

Yes. All major Rust tools ship as standard npm packages and work in any workspace setup. Biome, SWC, esbuild, and others are all workspace-compatible.

Q: Does Turbopack work outside of Next.js?

Not yet in a stable form. Turbopack is designed as Next.js's bundler and is not (as of 2026) released as a standalone bundler for arbitrary projects. For non-Next.js projects, Rspack (Webpack-compatible) or Rolldown (Vite-integration) are the practical Rust bundler choices.

Q: What's the binary size overhead of Rust tools?

Rust binaries are larger than JavaScript packages because they include compiled code rather than interpreted scripts. A typical Rust tool npm package is 10-50MB (platform-specific binary) vs 1-5MB for a pure JS package. This matters for install speed in CI but is not a runtime concern.


Compare Rust vs JS tooling package health on PkgPulse.

See also: esbuild vs SWC and Rise of Rust in JavaScript Tooling, Oxc vs SWC: Rust JS Toolchains Compared 2026.

The 2026 JavaScript Stack Cheatsheet

One PDF: the best package for every category (ORMs, bundlers, auth, testing, state management). Used by 500+ devs. Free, updated monthly.