2026 landscape

What Nuxt 4.5 changed

Vite 8 on Rolldown, the Rspack builder, experimental SSR streaming and the security releases, read from a layer and module author's point of view.

The 4.5 line is best described as plumbing: it moved the build onto newer foundations and shipped the groundwork that makes the Nuxt 5 migration boring. For an application developer most of it is invisible. For someone shipping layers and modules, three of the items are directly actionable.

Know

  • Vite 8, running on Rolldown. The bundler underneath Vite changed, which is mostly a speed story but touches anyone with custom plugins: plugin ordering (enforce: 'pre' | 'post'), assumptions about Rollup-specific plugin APIs, and optimizeDeps behaviour are the things to re-test. If your module registers a Vite plugin, this is the release to run your fixtures against.
  • Rspack 2 with an Rsbuild pipeline as the alternative builder (builder: '@nuxt/rspack-builder'). Relevant if you write build plugins: addBuildPlugin with unplugin means one implementation serves Vite, webpack and Rspack, and a consumer switching builders should not break your module. Worth an entry in your CI matrix if you claim support.
  • Experimental SSR streaming. Off by default; lets the server flush the shell before all data resolves. Interesting for TTFB, but it interacts with anything that assumes a complete HTML document (some third-party scripts, some head manipulation), so treat it as something to test rather than enable.
  • Security releases on the 4.4 and 4.5 lines. The habit this creates matters more than the CVE list: upgrade on a cadence, subscribe to advisories, purge caches after upgrading (senior craft).
  • The rest of the line added quality-of-life APIs and stabilised error codes; the point for an interview is that 4.5 was deliberately unexciting, because its job was to make v5 a small step.

How it works

Auditing a module's Vite plugin against the Environment API direction, which starts in 4.5's Vite version and becomes the default in Nuxt 5:

src/module.ts
import { addVitePlugin, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup() {
    addVitePlugin({
      name: 'toolkit-transform',
      enforce: 'pre',
      // ✗ Historically: rely on addVitePlugin's `client` / `server` options.
      // ✓ Now: let the plugin decide per environment, which survives the Environment API.
      applyToEnvironment: environment => environment.name === 'client',
      transform(code, id) {
        if (!id.endsWith('.vue')) return
        return code.replace('__TOOLKIT_VERSION__', JSON.stringify('2.3.0'))
      },
    })
  },
})

Trying the alternative builder in CI, so "we support Rspack" is a tested claim rather than a hope:

.github/workflows/ci.yml
strategy:
  matrix:
    builder: ['vite', 'rspack']
steps:
  - run: pnpm add -D @nuxt/rspack-builder
    if: matrix.builder == 'rspack'
  - run: pnpm nuxt build test/fixtures/basic
    env:
      NUXT_BUILDER: ${{ matrix.builder }}
Gotcha· A bundler change is a plugin-order change

Transform plugins that worked by accident because of ordering are exactly what a bundler swap exposes. If your module transforms source, assert the output in a build-level test rather than trusting that it ran.

Verify before the interview:

The current 4.x patch version, the exact contents of the 4.5 line, and which releases were security releases. Read the release notes rather than quoting this page; the list moves.

docs ↗

Exercise

Exercise
  • Run your module's fixtures against the latest 4.x and read every warning the build prints. Warnings are where the next major's breakage announces itself.
  • Add an Rspack job to your CI matrix and see whether your build plugin survives.
  • Enable experimental SSR streaming in a fixture, measure TTFB with curl -w, and note what breaks.

Be able to say

Be able to say· What changed in Nuxt 4.5, and did it affect your work?

"It was a plumbing release: Vite 8 on Rolldown, Rspack 2 as an alternative builder, experimental SSR streaming, plus security releases on the 4.4 and 4.5 lines. Deliberately unexciting, because its job was to make the Nuxt 5 step small. What it changed for me as a tooling author: a bundler swap is a plugin-ordering test, so I ran our build plugins against it and asserted the transformed output rather than assuming; I added the alternative builder to the CI matrix so our support claim is tested; and the security releases reinforced the upgrade cadence, including purging caches afterwards because stale HTML references the old chunks."

Your notes

Open in Notes

Nothing yet. Notes filed here show up on this page and the section overview.