Back to the blog
Tooling· May 12, 2026· 6 min read

Vite 7: what changed and what it means for your dev loop

Rolldown replaces Rollup under the hood, ESM-first becomes the default, and the plugin API gets a cleaner shape. Here's what actually changes day-to-day.

#vite#bundling#dx#performance

Vite 7 shipped Rolldown as its production bundler, replacing Rollup. If you've been watching the Vite roadmap, you saw this coming - the team has been building Rolldown in Rust for two years specifically because Rollup's JavaScript runtime was the last major performance ceiling in the chain. The headline claim is a 5–10x build speed improvement for large projects. In our own usage, we measured closer to 4x on a 200-component design system - still very real.

What Rolldown actually changes

Rolldown is API-compatible with Rollup. Most plugins just work. The difference is under the hood: Rolldown's module graph traversal and tree-shaking are implemented in Rust and run in parallel, whereas Rollup's implementation is single-threaded JavaScript. For large codebases with deep import graphs, this difference is significant. For small SPAs with a dozen entry points, you'll barely notice.

ESM-first by default

Vite 7 drops CommonJS as the default output format for library builds. If you're shipping a library with `build.lib`, you now get ESM by default - the `formats: ['es']` config is the new zero-config behavior. CJS is still supported via explicit config but is no longer the fallback. For app builds (not library mode), this change doesn't affect you directly - apps already produced ESM-friendly output.

// vite.config.ts - v7 library build defaults to ESM
export default defineConfig({
  build: {
    lib: {
      entry: './src/index.ts',
      // No 'formats' needed - ['es'] is the new default
      // Add 'cjs' explicitly if you still need CommonJS consumers
    },
  },
});

Plugin API changes worth knowing

The Vite plugin API has a few new hooks that Rolldown unlocked. The most useful in practice is `buildEnd`, which now fires with proper parallelism information so you can do cleanup only after all chunks are emitted, not speculatively. The `renderChunk` hook also gains access to the module graph, which is useful for metaprogramming plugins that inject imports based on what's in a chunk.

Should you upgrade now?

If you're on Vite 5 or 6, the upgrade path is straightforward for apps. Run the migration script (`npx vite-migration`), check your plugin list against the compatibility table, and you're likely done in under an hour. The only reason to wait is if you rely on a plugin that hasn't been updated for Rolldown compatibility - check the ecosystem tracker before upgrading.

Written by Appesto Engineering.