Nuxt 5 is in development, and you can run its behaviour today with future.compatibilityVersion: 5 on a 4.x project. For a tooling author that flag is not curiosity, it is the cheapest possible early-warning system: your playground either still works or tells you exactly what to fix, months before consumers upgrade.
| Change Nuxt 5 | What it means | What to audit in your layer or module |
|---|---|---|
| Vite Environment API | one shared config with per-environment plugins, instead of separate client and server configs | any addVitePlugin using the client/server options, and extendViteConfig (deprecated); move to applyToEnvironment |
| Vite 8 / Rolldown | Rolldown replaces esbuild and Rollup internals | plugin ordering and any Rollup-specific plugin API |
| Nitro v3 | web-standard Request/Response throughout | deep nitropack imports in server code; prefer Nuxt's auto-imports |
Server utilities from nuxt/server | core server helpers and session helpers move | imports in server/ code shipped by a layer |
| Case-sensitive routing | /About no longer matches pages/about.vue | links and redirects in layer pages; tests that relied on the old behaviour |
| Normalised page component names | page component names match route names | anything keyed on component names, <KeepAlive> include/exclude lists |
clearNuxtState resets to defaults | previously set state to undefined | composables that relied on undefined after clearing |
Non-async callHook | may return void instead of a promise | never chain .then() on callHook; await it instead |
| Client-only comment placeholders | <ClientOnly> uses HTML comments, not <div>, as the SSR placeholder | CSS or selectors that targeted the placeholder element |
process.* type augmentation removed | process.client and friends are gone from the types | replace with import.meta.client / import.meta.server; the nuxt/prefer-import-meta lint rule finds them |
| Options API compiled out | the Vue Options API is removed from the client bundle | runtime components written with the Options API |
typedPages on by default | routes are type-checked | route strings in layer code that were subtly wrong |
| Stricter TypeScript | noUncheckedSideEffectImports, no baseUrl for alias resolution | side-effect imports and any path resolution relying on baseUrl |
jiti no longer bundled | Node 22.19+ required for native TypeScript loading | your engines field and CI Node version |
payloadExtraction becomes 'client' | prerendered payload handling changes | anything reading _payload.json directly |
Turn the flag on in your playground and read the failures:
export default defineNuxtConfig({
extends: ['..'],
future: { compatibilityVersion: 5 },
})
The three edits that fix most packages:
-if (process.client) {
+if (import.meta.client) {
// browser-only setup
}
-addVitePlugin(myPlugin, { client: true, server: false })
+addVitePlugin({ ...myPlugin, applyToEnvironment: env => env.name === 'client' })
-nuxt.callHook('toolkit:extend', registry).then(finish)
+await nuxt.callHook('toolkit:extend', registry)
+finish()
And the nightly job that turns "will it break?" into a notification:
nightly:
runs-on: ubuntu-latest
continue-on-error: true # informative, not blocking
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with: { node-version: 22, cache: pnpm }
- run: pnpm install
- run: pnpm add -D nuxt@npm:nuxt-nightly@5x
- run: pnpm nuxt prepare .playground && pnpm test
The flag enables the parts of v5 behaviour that can be backported into 4.x. It does not give you Nitro v3 or the new bundler internals. It is an excellent smoke test and a poor guarantee; the nightly job is what covers the rest.
This whole table. The upgrade guide is the source of truth and the list moves between nightlies, so re-read it the week of the interview and note anything added or removed.
docs ↗process.server|process.client|process.dev|process.browser and replace every hit with import.meta.*.future: { compatibilityVersion: 5 } to the playground, run it, and write every breakage into your notes with its fix. That list is a ready-made interview story."I would make the breakage visible before consumers see it. Two switches: future.compatibilityVersion: 5 in the playground, which surfaces most behavioural changes today, and a nightly CI job against nuxt-nightly that is allowed to fail but not to go unnoticed. Then the audit list from the upgrade guide: process.* replaced with import.meta.*, Vite plugins moved off the client/server options to applyToEnvironment because of the Environment API, no deep nitropack imports because Nitro v3 moves to web-standard request and response, never chaining .then() on callHook since it may return void, and checking anything keyed on page component names or case-sensitive routes. Each finding becomes a fix in the current major, so the actual upgrade is uneventful."
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.
Vue 3.5 and the ecosystem
The Vue features that matter for SSR, the status of 3.6, the modules an interviewer expects you to know by name, and the CLI commands you should use without thinking.