2026 landscape

The Nuxt 5 changes

Every behaviour change the upgrade guide documents, each paired with what a layer or module author has to audit.

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.

Know — the documented changes

Change Nuxt 5 What it meansWhat to audit in your layer or module
Vite Environment APIone shared config with per-environment plugins, instead of separate client and server configsany addVitePlugin using the client/server options, and extendViteConfig (deprecated); move to applyToEnvironment
Vite 8 / RolldownRolldown replaces esbuild and Rollup internalsplugin ordering and any Rollup-specific plugin API
Nitro v3web-standard Request/Response throughoutdeep nitropack imports in server code; prefer Nuxt's auto-imports
Server utilities from nuxt/servercore server helpers and session helpers moveimports in server/ code shipped by a layer
Case-sensitive routing/About no longer matches pages/about.vuelinks and redirects in layer pages; tests that relied on the old behaviour
Normalised page component namespage component names match route namesanything keyed on component names, <KeepAlive> include/exclude lists
clearNuxtState resets to defaultspreviously set state to undefinedcomposables that relied on undefined after clearing
Non-async callHookmay return void instead of a promisenever chain .then() on callHook; await it instead
Client-only comment placeholders<ClientOnly> uses HTML comments, not <div>, as the SSR placeholderCSS or selectors that targeted the placeholder element
process.* type augmentation removedprocess.client and friends are gone from the typesreplace with import.meta.client / import.meta.server; the nuxt/prefer-import-meta lint rule finds them
Options API compiled outthe Vue Options API is removed from the client bundleruntime components written with the Options API
typedPages on by defaultroutes are type-checkedroute strings in layer code that were subtly wrong
Stricter TypeScriptnoUncheckedSideEffectImports, no baseUrl for alias resolutionside-effect imports and any path resolution relying on baseUrl
jiti no longer bundledNode 22.19+ required for native TypeScript loadingyour engines field and CI Node version
payloadExtraction becomes 'client'prerendered payload handling changesanything reading _payload.json directly

How it works

Turn the flag on in your playground and read the failures:

.playground/nuxt.config.ts
export default defineNuxtConfig({
  extends: ['..'],
  future: { compatibilityVersion: 5 },
})

The three edits that fix most packages:

src/runtime/plugin.ts
-if (process.client) {
+if (import.meta.client) {
   // browser-only setup
 }
src/module.ts
-addVitePlugin(myPlugin, { client: true, server: false })
+addVitePlugin({ ...myPlugin, applyToEnvironment: env => env.name === 'client' })
src/module.ts
-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:

.github/workflows/ci.yml
  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
Gotcha· `compatibilityVersion: 5` is not the same as Nuxt 5

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.

Verify before the interview:

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 ↗

Exercise

Exercise
  • Grep your packages for process.server|process.client|process.dev|process.browser and replace every hit with import.meta.*.
  • Add 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.
  • Add the nightly CI job and let it fail once, so you have seen what upstream breakage looks like.

Be able to say

Be able to say· How would you make our modules and layers Nuxt 5 ready?

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