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 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.