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