---
title: "Rolldown 1.0: the bundler under Vite 8 is stable · vuejs.school"
description: "Rolldown 1.0 locks the API of the Rust bundler inside Vite 8. What the promise covers, what it means for a Vue project, and how to read its errors."
canonical_url: "https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable"
meta:
  "og:description": "Rolldown 1.0 locks the API of the Rust bundler inside Vite 8. What the promise covers, what it means for a Vue project, and how to read its errors."
  "og:image": "https://vuejs.school/_og/d/a_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxlIMK3IHZ1ZWpzLnNjaG9vbA%2Cc_OgCard.takumi%2Ctitle_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxl%2Cdescription_~Um9sbGRvd24gMS4wIGxvY2tzIHRoZSBBUEkgb2YgdGhlIFJ1c3QgYnVuZGxlciBpbnNpZGUgVml0ZSA4LiBXaGF0IHRoZSBwcm9taXNlIGNvdmVycywgd2hhdCBpdCBtZWFucyBmb3IgYSBWdWUgcHJvamVjdCwgYW5kIGhvdyB0byByZWFkIGl0cyBlcnJvcnMu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA2IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy9yb2xsZG93bi0xLTAtdGhlLWJ1bmRsZXItdW5kZXItdml0ZS04LWlzLXN0YWJsZSI%2Cs_PsisgCQzT357qrUB.png"
  "og:image:alt": "Rolldown 1.0: the bundler under Vite 8 is stable · vuejs.school"
  "og:image:height": "600"
  "og:image:type": image/png
  "og:image:width": "1200"
  "og:title": "Rolldown 1.0: the bundler under Vite 8 is stable · vuejs.school"
  "twitter:image": "https://vuejs.school/_og/d/a_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxlIMK3IHZ1ZWpzLnNjaG9vbA%2Cc_OgCard.takumi%2Ctitle_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxl%2Cdescription_~Um9sbGRvd24gMS4wIGxvY2tzIHRoZSBBUEkgb2YgdGhlIFJ1c3QgYnVuZGxlciBpbnNpZGUgVml0ZSA4LiBXaGF0IHRoZSBwcm9taXNlIGNvdmVycywgd2hhdCBpdCBtZWFucyBmb3IgYSBWdWUgcHJvamVjdCwgYW5kIGhvdyB0byByZWFkIGl0cyBlcnJvcnMu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA2IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy9yb2xsZG93bi0xLTAtdGhlLWJ1bmRsZXItdW5kZXItdml0ZS04LWlzLXN0YWJsZSI%2Cs_PsisgCQzT357qrUB.png"
  "twitter:image:alt": "Rolldown 1.0: the bundler under Vite 8 is stable · vuejs.school"
---

> Index of every page on this site: [llms.txt](https://vuejs.school/llms.txt)

## What 1.0 promises

Rolldown follows semantic versioning, so everything in the `^1.0.0` range keeps its public API. The announcement spells out what that covers: option names, option types and plugin hook signatures stay backward-compatible, and there are no planned breaking changes to the public API. The one exception is anything marked experimental.

It is just as clear about what is not frozen. The output can still change. Dead code elimination (removing code nothing uses), chunking and inlining heuristics will keep improving, and option defaults may shift to produce smaller and faster bundles. The team says this does not change how the output behaves at runtime, and that such changes will be noted in the release notes.

For anyone already on the latest release candidate, the post says upgrading needs no code changes. The changes since the RC are mostly bug fixes, plus two experimental pieces: watch mode rebuilt on a new native file watcher, with WASM support, and a native MagicString (the library plugins use to edit code while keeping source maps) that can stand in for the JavaScript version.

## Speed, plugins and smaller bundles

The announcement puts Rolldown at 10 to 30 times faster than Rollup, with the gap growing as projects get bigger, and on par with esbuild. It quotes three production results: Ramp cut its build time by 57%, Mercedes-Benz.io by up to 38% and Beehiiv by 64%. Rolldown uses Oxc, the Rust toolchain from the same team, for parsing and minification.

Plugin compatibility was the condition for putting it inside Vite. Rolldown implements Rollup's plugin API, and the post says most Vite plugins work out of the box on Vite 8. Two additions make plugins cheaper. A plugin can declare a hook filter on the module id, code or module type, and Rolldown then skips the trip from Rust to JavaScript for modules that do not match. Built-in plugins written in Rust, such as `replacePlugin` and `esmExternalRequirePlugin`, replace common Rollup plugins.

For the output, the post highlights:

- more aggressive dead code elimination, which honours `@__PURE__`, `@__NO_SIDE_EFFECTS__` and the `sideEffects` field
- inlining of constants and TypeScript `const enum` values
- granular code splitting with chunk rules, credited with a 67% reduction in chunks at Framer

## How it fits with Vite 8 and Vite+

The announcement calls swapping Vite's bundler a two-year project:

- April 2024: the first public release
- December 2024: the first 1.0 beta
- May 2025: `rolldown-vite`, a temporary preview package
- December 2025: the Vite 8 beta, with Rolldown as the default bundler
- January 2026: the 1.0 release candidate
- 12 March 2026: Vite 8 stable
- 7 May 2026: Rolldown 1.0

It names Vite 8 as Rolldown's main entry point, so new Rolldown features and improvements reach Vite users directly.

Vite+ is the other place Rolldown appears. It is VoidZero's unified toolchain, open source under the MIT licence and in alpha since 13 March, which wraps Vite, Vitest, Oxlint, Oxfmt, Rolldown and tsdown behind one `vp` command. The Rolldown announcement mentions Vite+ only through the `vp` tab in its command snippets, which puts `vp add -D rolldown` next to the npm, pnpm, yarn and bun commands.

## Update Vite to get Rolldown 1.0

Rolldown reaches your app through Vite. Vite 8.0.11, published on 7 May, still shipped with release candidate 18. Vite 8.0.12, published on 11 May, pins `rolldown` 1.0.0 exactly. Update Vite and check which Rolldown you got:

```
npm install -D vite@^8.0.12
npm ls rolldown
```

The second command should print `rolldown@1.0.0` under `vite@8.0.12`. Vite 8 still needs Node 20.19 or a later 20.x release, or Node 22.12 or newer, according to its `engines` field.

Then run `npm run build` and compare the file sizes Vite prints with your last build. They may move a little; that is the "output behaviour may still change" clause at work, not a bug.

## Rename `rollupOptions` and replace `manualChunks`

In a Vite 8 config, Rolldown's options live under `build.rolldownOptions`. The [build options reference](https://vite.dev/config/build-options) lists `build.rollupOptions` as a deprecated alias for the same thing, and `worker.rollupOptions` is renamed `worker.rolldownOptions` in the same way. The alias still works, but one option inside it does not. This chunking config is common in Vite 7 projects:

*vite.config.ts**Breaks***

```
import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [vue()],
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          vue: ['vue', 'vue-router', 'pinia'],
        },
      },
    },
  },
})
```

Rolldown 1.0 warns that `manualChunks` should be a function, then stops the build with `TypeError: manualChunks is not a function`. The [Vite 8 migration guide](https://vite.dev/guide/migration) says the object form of `manualChunks` is no longer supported and the function form is deprecated. The replacement is Rolldown's `codeSplitting` option with groups:

*vite.config.ts**Works***

```
import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [vue()],
  build: {
    rolldownOptions: {
      output: {
        codeSplitting: {
          groups: [
            { name: 'vue', test: /node_modules[\\/](vue|@vue|vue-router|pinia)[\\/]/, priority: 2 },
            { name: 'vendor', test: /node_modules/, priority: 1 },
          ],
        },
      },
    },
  },
})
```

Each group's `name` becomes the chunk name, so this build writes a `vue-` file and a `vendor-` file into `dist/assets/`. `test` matches module ids; Rolldown's reference recommends `[\\/]` rather than `/` so the pattern also matches Windows paths. When a module matches two groups, the higher `priority` wins, which is why the Vue group takes Vue's packages before the catch-all vendor group sees them.

## How to read a Rolldown error

When a build fails, Vite prints `error during build:` followed by an error whose first line counts the problems, such as `Build failed with 1 error:`. The errors come next, at most five, and an ellipsis stands for the rest. Errors Rolldown detects itself carry a code in square brackets and a code frame: the source line involved, with the problem underlined. Import a function under a name the other file does not export, and you get this:

```
[MISSING_EXPORT] Error: "formatPrice" is not exported by "src/utils/money.ts".
   ╭─[ src/stores/cart.ts:1:10 ]
   │
 1 │ import { formatPrice } from '../utils/money'
   │          ─────┬─────
   │               ╰─────── Missing export
───╯
```

Read it in three parts:

1. The code in brackets, `MISSING_EXPORT`, identifies the kind of problem.
2. The message names the file missing the export, in quotes. The frame header names the file doing the importing, with line and column: `src/stores/cart.ts:1:10`.
3. The frame underlines the exact name that failed.

In this case `money.ts` exports `formatMoney`, and the fix is to correct the import.

Errors thrown by a plugin look different. They start with `[plugin vite:vue]` and a file path, which tells you the Vue plugin failed while compiling that component, so the problem is in the `.vue` file's template or script rather than in how modules connect. A stack trace follows all of this. Read the first lines first; they usually hold the answer.

## What the Rolldown team is working on next

The post lists two next steps, both work in progress.

- **Full bundle mode for Vite's development server.** It bundles the whole app in development the way production does, instead of serving each file as a separate module. The team quotes preliminary numbers of 3 times faster startup, 40% faster full reloads and 10 times fewer network requests.
- **Stable lazy barrel optimisation.** A barrel is an `index.ts` that re-exports a whole folder. Bundlers have traditionally compiled every module behind it, even when you use only part of it; the optimisation, experimental in 1.0, compiles only the modules you use.

**Check it stuck**3 questions from the Start a project with create-vue quiz.

[**Practice now**](https://vuejs.school/learn/tooling/start-a-project-with-create-vue?tab=quiz)

**Was this helpful?**

## **Keep reading**

[Tutorial · 8 min read**Editor and Vue DevTools setup in 2026**](https://vuejs.school/community/blog/editor-and-vue-devtools-setup-in-2026) [Release notes · 7 min read**Vite 8 is out: Rolldown, one bundler and what a Vue project notices**](https://vuejs.school/community/blog/vite-8-is-out)

```json
{"@context":"https://schema.org","@graph":[{"@id":"https://vuejs.school/#website","@type":"WebSite","description":"A free AI-instructed school for Vue.js. Short tutorials, runnable code and quizzes that adapt to you.","name":"vuejs.school","url":"https://vuejs.school/","publisher":{"@id":"https://vuejs.school/#identity"}},{"@id":"https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable#webpage","@type":"WebPage","dateModified":"2026-10-27T19:31:40.253Z","datePublished":"2026-05-12","description":"Rolldown 1.0 locks the API of the Rust bundler inside Vite 8. What the promise covers, what it means for a Vue project, and how to read its errors.","name":"Rolldown 1.0: the bundler under Vite 8 is stable","url":"https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable","breadcrumb":{"@id":"https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable#breadcrumb"},"isPartOf":{"@id":"https://vuejs.school/#website"},"potentialAction":[{"@type":"ReadAction","target":["https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable"]}],"primaryImageOfPage":{"@id":"https://vuejs.school/#logo"}},{"@id":"https://vuejs.school/#identity","@type":"Organization","description":"A free AI-instructed school for Vue.js. Short tutorials, runnable code and quizzes that adapt to you.","name":"vuejs.school","url":"https://vuejs.school","logo":{"@id":"https://vuejs.school/#logo"}},{"@id":"https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable#article","dateModified":"2026-10-27T19:31:40.253Z","datePublished":"2026-05-12","description":"Rolldown 1.0 locks the API of the Rust bundler inside Vite 8. What the promise covers, what it means for a Vue project, and how to read its errors.","headline":"Rolldown 1.0: the bundler under Vite 8 is stable","inLanguage":"en","isAccessibleForFree":true,"thumbnailUrl":"https://vuejs.school/_og/d/a_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxlIMK3IHZ1ZWpzLnNjaG9vbA%2Cc_OgCard.takumi%2Ctitle_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxl%2Cdescription_~Um9sbGRvd24gMS4wIGxvY2tzIHRoZSBBUEkgb2YgdGhlIFJ1c3QgYnVuZGxlciBpbnNpZGUgVml0ZSA4LiBXaGF0IHRoZSBwcm9taXNlIGNvdmVycywgd2hhdCBpdCBtZWFucyBmb3IgYSBWdWUgcHJvamVjdCwgYW5kIGhvdyB0byByZWFkIGl0cyBlcnJvcnMu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA2IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy9yb2xsZG93bi0xLTAtdGhlLWJ1bmRsZXItdW5kZXItdml0ZS04LWlzLXN0YWJsZSI%2Cs_PsisgCQzT357qrUB.png","@type":["Article","BlogPosting"],"articleSection":["Release notes"],"author":{"@id":"https://vuejs.school/#identity"},"image":{"@id":"https://vuejs.school/#/schema/image/1"},"isPartOf":{"@id":"https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable#webpage"},"mainEntityOfPage":{"@id":"https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable#webpage"},"publisher":{"@id":"https://vuejs.school/#identity"}},{"@id":"https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable#breadcrumb","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","name":"Blog","item":"https://vuejs.school/community/blog","position":1},{"@type":"ListItem","name":"Rolldown 1.0: the bundler under Vite 8 is stable","position":2}]},{"@id":"https://vuejs.school/#logo","@type":"ImageObject","caption":"vuejs.school","contentUrl":"https://vuejs.school/apple-touch-icon.png","inLanguage":"en","url":"https://vuejs.school/apple-touch-icon.png"},{"@id":"https://vuejs.school/#/schema/image/1","@type":"ImageObject","contentUrl":"https://vuejs.school/_og/d/a_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxlIMK3IHZ1ZWpzLnNjaG9vbA%2Cc_OgCard.takumi%2Ctitle_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxl%2Cdescription_~Um9sbGRvd24gMS4wIGxvY2tzIHRoZSBBUEkgb2YgdGhlIFJ1c3QgYnVuZGxlciBpbnNpZGUgVml0ZSA4LiBXaGF0IHRoZSBwcm9taXNlIGNvdmVycywgd2hhdCBpdCBtZWFucyBmb3IgYSBWdWUgcHJvamVjdCwgYW5kIGhvdyB0byByZWFkIGl0cyBlcnJvcnMu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA2IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy9yb2xsZG93bi0xLTAtdGhlLWJ1bmRsZXItdW5kZXItdml0ZS04LWlzLXN0YWJsZSI%2Cs_PsisgCQzT357qrUB.png","inLanguage":"en","url":"https://vuejs.school/_og/d/a_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxlIMK3IHZ1ZWpzLnNjaG9vbA%2Cc_OgCard.takumi%2Ctitle_~Um9sbGRvd24gMS4wOiB0aGUgYnVuZGxlciB1bmRlciBWaXRlIDggaXMgc3RhYmxl%2Cdescription_~Um9sbGRvd24gMS4wIGxvY2tzIHRoZSBBUEkgb2YgdGhlIFJ1c3QgYnVuZGxlciBpbnNpZGUgVml0ZSA4LiBXaGF0IHRoZSBwcm9taXNlIGNvdmVycywgd2hhdCBpdCBtZWFucyBmb3IgYSBWdWUgcHJvamVjdCwgYW5kIGhvdyB0byByZWFkIGl0cyBlcnJvcnMu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA2IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy9yb2xsZG93bi0xLTAtdGhlLWJ1bmRsZXItdW5kZXItdml0ZS04LWlzLXN0YWJsZSI%2Cs_PsisgCQzT357qrUB.png"}]}
```