---
title: "Vite 8 beta: Rolldown becomes the bundler · vuejs.school"
description: "The first Vite 8 beta swaps esbuild and Rollup for Rolldown. Here is what changes in a Vue project's config, what still breaks, and how to test it in a branch."
canonical_url: "https://vuejs.school/community/blog/vite-8-beta-rolldown-becomes-the-bundler"
meta:
  "og:description": "The first Vite 8 beta swaps esbuild and Rollup for Rolldown. Here is what changes in a Vue project's config, what still breaks, and how to test it in a branch."
  "og:image": "https://vuejs.school/_og/d/a_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXIgwrcgdnVlanMuc2Nob29s%2Cc_OgCard.takumi%2Ctitle_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXI%2Cdescription_~VGhlIGZpcnN0IFZpdGUgOCBiZXRhIHN3YXBzIGVzYnVpbGQgYW5kIFJvbGx1cCBmb3IgUm9sbGRvd24uIEhlcmUgaXMgd2hhdCBjaGFuZ2VzIGluIGEgVnVlIHByb2plY3QncyBjb25maWcsIHdoYXQgc3RpbGwgYnJlYWtzLCBhbmQgaG93IHRvIHRlc3QgaXQgaW4gYSBicmFuY2gu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA3IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy92aXRlLTgtYmV0YS1yb2xsZG93bi1iZWNvbWVzLXRoZS1idW5kbGVyIg%2Cs_6zHADMOi2Tqcr-_-.png"
  "og:image:alt": "Vite 8 beta: Rolldown becomes the bundler · vuejs.school"
  "og:image:height": "600"
  "og:image:type": image/png
  "og:image:width": "1200"
  "og:title": "Vite 8 beta: Rolldown becomes the bundler · vuejs.school"
  "twitter:image": "https://vuejs.school/_og/d/a_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXIgwrcgdnVlanMuc2Nob29s%2Cc_OgCard.takumi%2Ctitle_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXI%2Cdescription_~VGhlIGZpcnN0IFZpdGUgOCBiZXRhIHN3YXBzIGVzYnVpbGQgYW5kIFJvbGx1cCBmb3IgUm9sbGRvd24uIEhlcmUgaXMgd2hhdCBjaGFuZ2VzIGluIGEgVnVlIHByb2plY3QncyBjb25maWcsIHdoYXQgc3RpbGwgYnJlYWtzLCBhbmQgaG93IHRvIHRlc3QgaXQgaW4gYSBicmFuY2gu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA3IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy92aXRlLTgtYmV0YS1yb2xsZG93bi1iZWNvbWVzLXRoZS1idW5kbGVyIg%2Cs_6zHADMOi2Tqcr-_-.png"
  "twitter:image:alt": "Vite 8 beta: Rolldown becomes the bundler · vuejs.school"
---

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

## Why Vite now uses one bundler instead of two

The announcement names the cost of the old arrangement: two transformation pipelines, two plugin systems, and a growing amount of glue code to keep development and production behaving the same.

Rolldown is a bundler written in Rust by the VoidZero team with the explicit goal of being used inside Vite. It supports the Rollup plugin API, so most Vite plugins keep working. For everything a bundler needs around it, it uses Oxc, the same team's parser, resolver, transformer and minifier. Vite, Rolldown and Oxc are now maintained together, which is the structural point of the release.

The speed numbers come from early adopters of `rolldown-vite`, the technical preview VoidZero announced at the end of May: Linear's production build went from 46 seconds to 6, Mercedes-Benz.io cut its build time by up to 38 percent and Beehiiv by 64 percent. Rolldown's own benchmarks put it at esbuild's level and 10 to 30 times faster than Rollup.

## Renamed and new options in your Vite config

The [migration guide](https://github.com/vitejs/vite/blob/v8.0.0-beta.0/docs/guide/migration.md) describes a compatibility layer that translates the old Rollup and esbuild options into the new ones and marks the old names as deprecated. A `vite.config.ts` from `create-vue` sets only `plugins` and the `@` alias, so it needs no edits. Two renames matter if you added options of your own.

`build.rollupOptions` is renamed `build.rolldownOptions`, and `output.manualChunks` is deprecated in favour of `advancedChunks`. A config that splits a vendor chunk changes from the function form to a declarative one:

*vite.config.ts*

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

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

`name` is the chunk's name, used in its file name, and `test` picks modules by their path. By default a group also takes in what its modules import, so Vue's internal `@vue/*` packages land in the same chunk without being listed.

The `esbuild` option becomes `oxc`, and the guide lists the mapping: `esbuild.jsxInject` to `oxc.jsxInject`, `esbuild.define` to `oxc.define`, and so on. A Vue project rarely sets any of these.

The beta also adds one option and one automatic feature. `resolve.tsconfigPaths: true` makes Vite resolve imports through the `paths` in `tsconfig.json`; it is off by default because it costs a little speed. TypeScript's `emitDecoratorMetadata` option is now supported automatically.

## New defaults that change the build output

Minification moves to the Oxc minifier for JavaScript and to Lightning CSS for stylesheets. You can switch back with `build.minify: 'esbuild'` (deprecated) or `build.cssMinify: 'esbuild'`, but esbuild is now an optional dependency, so you must install it yourself first. The guide gives two warnings. Lightning CSS lowers more syntax (rewrites newer CSS for older browsers), so a CSS bundle may grow slightly. And the two JavaScript minifiers make slightly different assumptions about your code.

The default browser target moves up, from Chrome 107, Edge 107, Firefox 104 and Safari 16.0 to Chrome 111, Edge 111, Firefox 114 and Safari 16.4. These match the Baseline Widely Available set for 1 January 2026, browsers released about two and a half years before that date. A project that must support older browsers sets `build.target` explicitly.

CommonJS interop can change how code runs, not only how it builds. A CommonJS package is one written with `require` and `module.exports` instead of `import` and `export`. The `default` import from such a package now follows one rule in development and production, where before the two used different rules. A package that depended on the difference may import differently; the deprecated `legacy.inconsistentCjsInterop: true` restores the old behaviour for now while you report the problem to the package author.

## What the beta removes or does not support

Other entries in the guide carry no such promise, among them:

- The `system` and `amd` output formats are not supported.
- Oxc does not support esbuild's property mangling options ( `mangleProps` and related) or `esbuild.supported`.
- `build.rollupOptions.watch.chokidar` is removed; use `rolldownOptions.watch.notify` instead.
- Vite no longer guesses between the `browser` and `module` fields of a dependency's `package.json` by reading the files; it follows `resolve.mainFields` in order. A package that relied on the guess needs a `resolve.alias` entry or a patch.
- Oxc does not yet lower native decorators (rewrite them for runtimes without decorator support), so a project that uses them needs a Babel or SWC plugin for now.
- Extglob patterns (glob syntax such as `+(a|b)`) are not supported yet.

A Vue application built as ES modules is unlikely to meet most of these. The exception is the `browser` and `module` change, because it depends on your dependencies' `package.json` files, not on your own config.

## What plugin authors should check

If you maintain a Vite plugin, four items in the guide are for you. Rolldown assigns a module type from the file extension, so a `load` or `transform` hook that turns another format into JavaScript may need to return `moduleType: 'js'`:

*vite-plugin-txt.ts*

```
import { readFileSync } from 'node:fs'
import type { Plugin } from 'vite'

export function txt(): Plugin {
  return {
    name: 'txt-loader',
    load(id) {
      if (!id.endsWith('.txt')) return
      const content = readFileSync(id, 'utf8')
      return {
        code: `export default ${JSON.stringify(content)}`,
        moduleType: 'js',
      }
    },
  }
}
```

Hooks that Rollup ran in parallel now run one after another. The `bundle` object passed to `generateBundle` and `writeBundle` can no longer be assigned to (use `this.emitFile()`), is not shared between hooks, and fails `structuredClone()` unless you spread it first. And four Rollup hooks are not supported: `shouldTransformCachedModule`, `resolveImportMeta`, `renderDynamicImport` and `resolveFileUrl`.

## What comes next: Full Bundle Mode and Vite+

The announcement says Full Bundle Mode will ship soon. It bundles in development too, and preliminary results show three times faster dev server startup, 40 percent faster full reloads and ten times fewer network requests. Two experiments, raw AST transfer and native `MagicString` transforms, aim to let plugins written in JavaScript keep up with the Rust core.

Around all of this sits Vite+, which VoidZero showed at ViteConf in Amsterdam in October and described in its [announcement](https://voidzero.dev/posts/announcing-vite-plus) as a unified toolchain on top of Vite: `vite new`, `vite test` through Vitest, `vite lint` through Oxlint, `vite fmt`, `vite lib`, `vite run` and `vite ui`, built on Oxc and Rolldown. The announcement described it as still in development, with a public preview targeted for early 2026. It also set out a commercial, source-available licence, free for individuals, open source projects and small businesses, while Vite, Vitest, Rolldown and Oxc stay open source under MIT. None of it is part of the Vite 8 beta.

## Try the beta in a branch

The announcement offers two routes. The gradual one, recommended for large or complex projects, moves from Vite 7 to `rolldown-vite`, which is Vite 7 with Rolldown and nothing else changed, then to Vite 8, so that any failure is isolated to the bundler. The direct one is a version change. Make a branch first (`git switch -c vite-8-beta`) so `main` keeps building on 7.2, then pin `vite` to the exact beta in `package.json`:

*package.json*

```
{
  "devDependencies": {
    "vite": "8.0.0-beta.0"
  }
}
```

Then install, build and preview:

```
npm install --legacy-peer-deps
npx vite build
npx vite preview
```

The flag is there because a plain `npm install` stops with an `ERESOLVE` error. The current `@vitejs/plugin-vue`, 6.0.2, declares Vite 5 to 7 as the versions it works with (its peer range), and npm refuses rather than warns when the conflict involves a dependency in your own `package.json`. `--legacy-peer-deps` is one of the two ways past it that npm's error message offers. It ignores peer dependencies for every package, so keep it to this branch.

The peer range is a declaration, not a test result: the announcement says most Vite plugins work with Vite 8 out of the box, and the team runs key plugins and frameworks against the new bundler in CI. Judge by the build. Compare three things against your `main` branch: the build time, the sizes in `dist/assets`, and the application itself in `vite preview`, clicking through the routes that use dynamic imports and the heaviest pages. Report anything odd in the [rolldown-vite issues](https://github.com/vitejs/rolldown-vite/issues), which is where the team asks for beta reports.

If Vite is not a direct dependency but arrives through a framework or tool, the beta has to be forced with a package manager override, which the announcement spells out for each manager. With pnpm:

*package.json*

```
{
  "pnpm": {
    "overrides": {
      "vite": "8.0.0-beta.0"
    }
  }
}
```

npm and Bun use a top-level `"overrides"` field, Yarn uses `"resolutions"`. Reinstall afterwards.

For a Nuxt project this is a path to look at, not yet to take: the guide's list of items to fix before stable includes a Rolldown issue that affects Nuxt. If you want the gradual route now, Nuxt has had experimental support for the `rolldown-vite` override since 4.1. Do not force the beta into Vitest either. Vitest 4 depends on Vite 6 or 7 itself, so the direct upgrade above leaves its copy alone, and the same list notes a resolver cache problem that breaks minor cases in Vitest.

**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 · 6 min read**Rolldown 1.0: the bundler under Vite 8 is stable**](https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable)

```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/vite-8-beta-rolldown-becomes-the-bundler#webpage","@type":"WebPage","dateModified":"2026-10-27T19:31:40.253Z","datePublished":"2025-12-04","description":"The first Vite 8 beta swaps esbuild and Rollup for Rolldown. Here is what changes in a Vue project's config, what still breaks, and how to test it in a branch.","name":"Vite 8 beta: Rolldown becomes the bundler","url":"https://vuejs.school/community/blog/vite-8-beta-rolldown-becomes-the-bundler","breadcrumb":{"@id":"https://vuejs.school/community/blog/vite-8-beta-rolldown-becomes-the-bundler#breadcrumb"},"isPartOf":{"@id":"https://vuejs.school/#website"},"potentialAction":[{"@type":"ReadAction","target":["https://vuejs.school/community/blog/vite-8-beta-rolldown-becomes-the-bundler"]}],"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/vite-8-beta-rolldown-becomes-the-bundler#article","dateModified":"2026-10-27T19:31:40.253Z","datePublished":"2025-12-04","description":"The first Vite 8 beta swaps esbuild and Rollup for Rolldown. Here is what changes in a Vue project's config, what still breaks, and how to test it in a branch.","headline":"Vite 8 beta: Rolldown becomes the bundler","inLanguage":"en","isAccessibleForFree":true,"thumbnailUrl":"https://vuejs.school/_og/d/a_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXIgwrcgdnVlanMuc2Nob29s%2Cc_OgCard.takumi%2Ctitle_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXI%2Cdescription_~VGhlIGZpcnN0IFZpdGUgOCBiZXRhIHN3YXBzIGVzYnVpbGQgYW5kIFJvbGx1cCBmb3IgUm9sbGRvd24uIEhlcmUgaXMgd2hhdCBjaGFuZ2VzIGluIGEgVnVlIHByb2plY3QncyBjb25maWcsIHdoYXQgc3RpbGwgYnJlYWtzLCBhbmQgaG93IHRvIHRlc3QgaXQgaW4gYSBicmFuY2gu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA3IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy92aXRlLTgtYmV0YS1yb2xsZG93bi1iZWNvbWVzLXRoZS1idW5kbGVyIg%2Cs_6zHADMOi2Tqcr-_-.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/vite-8-beta-rolldown-becomes-the-bundler#webpage"},"mainEntityOfPage":{"@id":"https://vuejs.school/community/blog/vite-8-beta-rolldown-becomes-the-bundler#webpage"},"publisher":{"@id":"https://vuejs.school/#identity"}},{"@id":"https://vuejs.school/community/blog/vite-8-beta-rolldown-becomes-the-bundler#breadcrumb","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","name":"Blog","item":"https://vuejs.school/community/blog","position":1},{"@type":"ListItem","name":"Vite 8 beta: Rolldown becomes the bundler","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_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXIgwrcgdnVlanMuc2Nob29s%2Cc_OgCard.takumi%2Ctitle_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXI%2Cdescription_~VGhlIGZpcnN0IFZpdGUgOCBiZXRhIHN3YXBzIGVzYnVpbGQgYW5kIFJvbGx1cCBmb3IgUm9sbGRvd24uIEhlcmUgaXMgd2hhdCBjaGFuZ2VzIGluIGEgVnVlIHByb2plY3QncyBjb25maWcsIHdoYXQgc3RpbGwgYnJlYWtzLCBhbmQgaG93IHRvIHRlc3QgaXQgaW4gYSBicmFuY2gu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA3IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy92aXRlLTgtYmV0YS1yb2xsZG93bi1iZWNvbWVzLXRoZS1idW5kbGVyIg%2Cs_6zHADMOi2Tqcr-_-.png","inLanguage":"en","url":"https://vuejs.school/_og/d/a_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXIgwrcgdnVlanMuc2Nob29s%2Cc_OgCard.takumi%2Ctitle_~Vml0ZSA4IGJldGE6IFJvbGxkb3duIGJlY29tZXMgdGhlIGJ1bmRsZXI%2Cdescription_~VGhlIGZpcnN0IFZpdGUgOCBiZXRhIHN3YXBzIGVzYnVpbGQgYW5kIFJvbGx1cCBmb3IgUm9sbGRvd24uIEhlcmUgaXMgd2hhdCBjaGFuZ2VzIGluIGEgVnVlIHByb2plY3QncyBjb25maWcsIHdoYXQgc3RpbGwgYnJlYWtzLCBhbmQgaG93IHRvIHRlc3QgaXQgaW4gYSBicmFuY2gu%2Ceyebrow_~UmVsZWFzZSBub3RlcyDCtyA3IG1pbiByZWFk%2Ctint_sand%2Cp_Ii9jb21tdW5pdHkvYmxvZy92aXRlLTgtYmV0YS1yb2xsZG93bi1iZWNvbWVzLXRoZS1idW5kbGVyIg%2Cs_6zHADMOi2Tqcr-_-.png"}]}
```