npm nuxt 4.6.0
v4.6.0

6 hours ago

v4.6.0 is the next minor release.

📣 Some news

🖥️ Nuxt CLI v4

Alongside the release of Nuxt v4.6, today also brings a new major release of the Nuxt CLI: @nuxt/cli v4. It ships as a dependency of nuxt, so you'll get it automatically when you upgrade.

Most of what's new is in nuxt dev:

  • an interactive terminal UI, showing URLs, startup progress and keyboard shortcuts, with panels to dive into error logs, routes, network requests and more
  • the dev server gives you more info, such as why it reloaded or restarted, which nuxt.config keys changed, where the time went during a slow start or build, and how long each module took to set up
  • a CLI-level error channel rendered with my-bad (see below), powering things like automatically reloading when a syntax error in nuxt.config.ts is fixed
  • a lock file in .nuxt/, which lets a second nuxt dev (say, one started by an agent) take over or defer to the one you started, and powers new nuxt curl and nuxt task commands that talk to the running server

There's also a new nuxt docs "<query>" search, and nuxt preview --takeover can replace a running preview server. And in general nuxt/cli is a lot smaller and starts a lot faster:

v3.37 v4.0
@nuxt/cli install size 13.1 MB 3.5 MB -73%
@nuxt/cli dependencies 70 31 -56%
nuxt dev: first paint 330 ms 50 ms 6.6x faster
nuxt dev: port bound 338 ms 104 ms 3.2x faster
nuxt dev: memory at rest (Linux) 630 MB 440 MB -30%
nuxt-dev

Although this is a major version, none of the changes should be breaking for Nuxt v4 users: we require Node.js v22.21+, v24.11+ or v26+, we drop nuxt init and only support npm create nuxt@latest, and Nuxt 2 and @nuxt/bridge are no longer supported.

👉 Check out the full Nuxt CLI v4 release notes for everything that's changed.

💡 A server-agnostic Nuxt

The biggest thing about this release is our move towards making Nuxt server-agnostic.

I feel that freedom of choice is very much a fundamental value of the web, and one that unites the whole Nuxt team.

You can use pages/ (with vue-router) or not. You can use Vite, webpack or Rspack to bundle your code. You can pick from dozens of providers to deploy to, pick any image or font provider, choose any database adapter. In every case, the framework is the same.

The server side was different. #app composables imported h3 types, server code imported from h3 and nitropack, and every module that touched the server was tied to whichever major version of those packages Nuxt happened to depend on.

This has become particularly clear as we have been upgrading to new majors of h3 and nitro, which ship breaking changes with a cascading effect throughout the whole ecosystem.

👉 This release changes that.

Alongside explicitly defining our public API in nuxt/kit (which now does not refer to external packages), Nuxt now specifies our own types for the request event, route rules and typed $fetch, and we expose an import surface (nuxt/server) for the server utilities that will be needed by most apps.

This is the culmination of work we started almost a year ago, making it possible to use any server builder with Nuxt, not just Nitro (#33462).

Of course, under the hood, nuxt/server is still powered by Nitro by default - though we are also announcing a second, experimental implementation, @nuxt/vite-server, which allows pure-Vite server builds using the Vite Environment API.

Important

We believe that Nitro is still the right choice for almost everyone.

🌟 We see a number of key benefits for nuxt/server.

  1. it smooths the upgrade to Nuxt 5, which moves to Nitro v3 and h3 v2. Server code written against nuxt/server on 4.6 runs unchanged there, so a module can ship one file for both.
  2. it decouples Nuxt from the Nitro release cycle. Because we 'own' the API, we can adapt to breaking changes in Nitro or h3 without requiring a future major - and we can release Nuxt majors without having to wait for upstream releases.
  3. it makes Nuxt's code more maintainable. It helps us preserve the separation of concerns between our API - /app and /server - and the bundler + server that you ultimately want to build your app.

... and there are a number of other benefits too, from a single type surface to being able to iterate more quickly on features.

Finally, I want to say a special thank-you to @pi0, whose relentless focus on server agnosticism and work on h3, Nitro and web-standard server primitives over the last few years is what makes a portable RequestEvent possible at all. Thank you, Pooya. ❤️

Almost every feature in this release is already in the Nuxt 5 branch, and most of the remaining Nuxt 5 defaults can be tested today with future.compatibilityVersion: 5 (more details below!).

Tip

Nuxt 3 reached end-of-life on July 31, 2026, so there is no 3.x release alongside this one. If you're still on v3, the upgrade guide is waiting for you.

👀 Highlights

🤷 If you've read this far I'm afraid I have bad news for you: there's a lot more still to say! Nuxt 4.6 is one of our biggest minor releases, with over 420 commits since v4.5.2.

... so, you might want to grab a coffee! ☕️

🧩 nuxt/server

It has been asked for for a long time, and it now exists (#36275)!

nuxt/server is a new import source for server code: handlers, middleware and utilities - a complement to nuxt/app. Where nuxt/app is for the part of your application that also runs in the browser, nuxt/server is for the part that only runs on the server.

import { defineEventHandler, getQuery } from 'nuxt/server'

export default defineEventHandler((event) => {
  const { name } = getQuery<{ name?: string }>(event)
  return { message: `Hello, ${name ?? 'world'}!` }
})

The utilities use web standards and are typed against a portable RequestEvent:

event.req         // Request
event.url         // URL
event.res         // { status, statusText, headers }
event.res.headers // Headers
event.context     // per-request context

Under @nuxt/nitro-server they are backed by Nitro and h3, but you never import from either.

So the same handler runs under Nitro v2, Nitro v3 or @nuxt/vite-server, and a module that imports from nuxt/server doesn't need a peer dependency on h3 or nitropack.

We think this will make a big difference in smoothing out the upgrade to Nuxt v5 and Nitro v3.

There is a typing benefit too. We no longer hoist h3 or Nitro types into your app to type useRequestEvent, $fetch or route rules, which removes a source of type conflicts when versions differ (#36212, #36214, #36293).

The surface is small, and covers what published modules and user code typically need: defineEventHandler, createError/isNuxtError, request URL, headers, query, body (plain and validated with any Standard Schema library or a function), cookies, redirects, response status, getRouterParam(s), getRequestIP, handleCors, getRouteRules, useRuntimeConfig, useAppConfig and sessions.

import { defineEventHandler, readValidatedBody } from 'nuxt/server'
import { z } from 'zod'

export default defineEventHandler(async (event) => {
  const user = await readValidatedBody(event, z.object({ name: z.string() }))
  return { created: user.name }
})

We encourage you to use web APIs (event.req.headers, for example), or raise an issue if there's functionality you're missing from nuxt/server 🙏

If you do need to step outside nuxt/server for a particular handler, don't worry! Nothing has been taken away: import defineEventHandler and the helpers you need from h3 or nitropack/runtime as before, and that handler works exactly as it did on Nuxt 4.5.

import { defineEventHandler, readMultipartFormData } from 'h3'

export default defineEventHandler(async (event) => {
  const parts = await readMultipartFormData(event)
  return { received: parts?.length ?? 0 }
})

Important

On Nuxt 4, the auto-imported defineEventHandler, getQuery, readBody and the rest are still h3's own helpers, which take a different shape of event. Import from nuxt/server explicitly, including defineEventHandler to use the new server runtime. If you mix the two, you'll see a NUXT_E8012 error which should tell you which import to change.

A few helpers also behave differently from their h3 v1 namesakes: sendRedirect returns the response rather than sending it, createError takes status and statusText, and response headers are set through event.res.headers. The upgrade guide has a table of the differences.

Nothing in this release requires a migration. But if you have server code you'd like to make portable ahead of Nuxt 5, this is the best way.

👉 Read the server imports guide.

🔐 appSecret and sessions

Nuxt now has a root application secret: runtimeConfig.appSecret, set with NUXT_APP_SECRET (#35874, thanks to @onmax). Modules and server features derive purpose-specific secrets from it with deriveSecret(purpose), so NUXT_APP_SECRET is the only secret you need to configure.

openssl rand -base64 32

In development Nuxt generates and persists one if none is configured (and warns the first time a derived secret is used). Builds never generate one.

The first thing to use it is a set of session helpers in nuxt/server (#36358). Sessions are sealed into a cookie with iron, so there's no server-side storage to configure:

import { defineEventHandler, useSession } from 'nuxt/server'

export default defineEventHandler(async (event) => {
  const session = await useSession<{ visits: number }>(event)
  await session.update(data => ({ visits: (data.visits ?? 0) + 1 }))
  return { visits: session.data.visits }
})

Note

As a reminder, runtime config keys prefixed with app (runtimeConfig.app, runtimeConfig.appSecret) are reserved for Nuxt.

🎯 Typed $fetch, rebuilt

$fetch and useFetch have been typed from your server routes for a long time. But the types were derived from Nitro's InternalApi interface, and past a few hundred routes they hit TypeScript's instantiation limit with the familiar TS2589: Type instantiation is excessively deep and possibly infinite.

We've rebuilt typed fetch on top of fetchdts (#36238). Nuxt compiles your server routes into a route tree with an exact-match table for static paths and accessors specialised to your route set. Resolution cost now scales with call sites, not with route count:

routes before after
100 1,397,361 instantiations / 0.77s 51,558 / 0.26s
300 5,774,425 / 3.49s (TS2589) 51,558 / 0.16s
1000 12,831,467 / 7.44s (TS2589) 51,558 / 0.20s
3000 (200 call sites) 71,875,148 / 53.63s (TS2589) 101,678 / 0.62s

Peak memory for the same runs dropped from 946 MB to 140 MB. 🔥

Plus, the route set also carries the body, query and headers a handler validates, so calls are checked more tightly than before:

// server/api/users.post.ts validates { title: string, count: number }
await $fetch('/api/users', { method: 'post', body: { title: 'a', count: 1 } })
await $fetch('/api/users', { method: 'post', body: { title: 'a', count: 'no' } })
//                                                                ^ not assignable to number
await $fetch('/api/users', { method: 'post' })
//           ^ body is required

On Nuxt 4 this is opt-in, because there are small changes to type inference, and hand-written ServerRoutes augmentations need a small rewrite. It is the default in Nuxt 5.

export default defineNuxtConfig({
  experimental: {
    routeTypedFetch: true,
  },
})

There's also a new experimental.strictRouteTypes option to reject calls to paths that don't exist (otherwise these just return unknown), and an 'isomorphic' mode that types your pages as GET routes too if you want to be able to $fetch from the Vue renderer with type safety.

👉 Read more in the experimental features docs.

🐛 Better errors in development with my-bad

Server-side errors in development used to look like this:

ReferenceError: foo is not defined
    at Object.<anonymous> (/_nuxt/app/pages/index.vue:1:1)

There was no source position or code frame, and the Youch iframe we rendered could not show you the frame in your own source either. Both are now fixed (#36258, nuxt/cli#1518).

Dev SSR stack traces are now mapped before anything reads the error, and the Youch overlay has been replaced with my-bad. It renders into your app's own error page as an overlay (or as a standalone page when the app can't render one), with the mapped stack trace and a code frame from your source, and the same report is printed in your terminal. We are still working with @atinux, @HugoRCD and @antfu to make these pages nicer still.

my-bad-ssr-expanded-dark my-bad-ssr-copymenu-dark

With Nuxt CLI v4, there is a single live error channel at the CLI level. It survives worker restarts, so (for example) a syntax error in nuxt.config.ts will live-reload the page once you fix it. Each error is rendered once rather than at every layer it passes through, and the same channel streams build progress and app logs to the dev panel.

🎨 A new loading screen, 404 and error pages

@HugoRCD has redrawn the loading screen you see while the dev server starts. It is now a WebGL2 particle field that traces a mountain range behind the Nuxt lockup (#36178), using a single shader and a single draw call. Without WebGL2 it falls back to the static lockup, and with prefers-reduced-motion the animation stops. Try hovering over it. 🏔️

Hugo also gave the built-in 404 and error pages a neutral palette and lighter type (#36255), and @MirkoJa added a back button to the 404 page (#35688).

404-page-dark

⚡️ Vue Vapor support

Nuxt now supports Vue 3.6's Vapor Mode in interop mode (#35759). Your app root stays on the virtual DOM, and you can opt individual components or pages into Vapor by adding the vapor attribute to <script setup>:

export default defineNuxtConfig({
  vue: {
    vapor: true,
  },
})
<script setup vapor lang="ts">
const count = ref(0)
</script>

<template>
  <button @click="count++">
    count is {{ count }}
  </button>
</template>

Routing, useAsyncData, layouts and most built-in components keep working unchanged. Along the way we made the auto-import loader, useAsyncData, definePageMeta and slot inspection Vapor-aware, and we now have a Vapor test suite so we can track what's supported.

Note

This requires Vue ^3.6.0-rc.2 or newer. See the known limitations and try it in a fresh project first.

🧩 Addons for useFetch and useAsyncData

@cernymatej has added an addons option to the createUseFetch and createUseAsyncData factories (#35797). An addon can declare custom call-site options, adjust the merged options, wrap the handler with middleware, and extend what the composable returns, and it can be reused across as many custom instances as you like.

const refreshOnFocus = defineUseFetchAddon({
  setup: (options: UseFetchAddonOptions<{ refreshOnFocus?: boolean }>) => {
    if (import.meta.server || !options.refreshOnFocus) { return }

    return (asyncData) => {
      const focused = useWindowFocus()
      watch(focused, focused => focused && asyncData.refresh())
      return { focused }
    }
  },
})

export const useApiFetch = createUseFetch({ baseURL: '/api', addons: [refreshOnFocus] })
<script setup lang="ts">
const { data, focused } = await useApiFetch('/todos', { refreshOnFocus: true })
</script>

This resolves a long list of feature requests for useAsyncData and useFetch (refresh on focus, polling, retries, auth headers and more) without making the core composables opinionated about any of them.

👉 Read about defineUseFetchAddon and defineUseAsyncDataAddon.

🚀 Performance

There is a lot of performance work in this release.

  • <NuxtLink> renders 58% faster on the server (#36015). Internal links are now rendered as a plain <a> with no useLink, no computed and no reactive state. Rendering 200 links went from 1.36ms to 0.57ms, which is 1.4x faster than a bare <RouterLink>.
  • Early 404s (#36117). With experimental.early404, page routes are compiled into a static matcher at build time and requests that can't match any page skip creating the Vue app, running plugins and middleware entirely. On an app with 30 pages and ~23ms of boot work per render, a JSON 404 went from 37.1ms to 0.3ms.
  • Templates declare their dependencies (#35875). The virtual file templates used in Nuxt's build used to regenerate on every file change. They now declare what invalidates them, so editing a component regenerates 0 of 49 core templates instead of all of them, and the builder:watch hook settles in 0.6ms instead of 36ms.
  • Cookie jars (#36114). useCookie parses the cookie header once per request (or once per microtask on the client) instead of on every call. A nice side effect: a cookie set in a plugin during SSR can now be read by a later useCookie in a page.
  • ssr: false pages are tree-shaken from the server bundle (#35836, thanks to @Austin1serb).
  • Serializable definePageMeta keys are extracted at build time (#35919), behind experimental.extractSerializablePageMeta.
  • Faster dev server warm-up: Vite's server module graph is warmed before the client (#36154), the client graph is crawled during warm-up (#35870), and warm-up yields to your first navigation so it never competes with a real request (#36412).
  • Smaller client bundle: unctx is no longer shipped to the browser and defu is skipped for a single app.config (#36371).
  • Fewer dependencies: @nuxt/kit no longer depends on c12, untyped, confbox, pkg-types, ufo or mlly, and jiti and giget are now optional peers loaded only when needed (#35936, #35943, #35946, #36071, #36073, #36083).
  • Lazy impound tracing for builds (#36172), virtual module hooks filtered by id (#36077), isVue checks migrated to plugin filters (#36116) and an flru prerender cache (#36340).

Put together, on our benchmark machine (arm64 Linux, Node 24.15, medians of 5 runs):

v4.5.2 v4.6.0
@nuxt/kit install size 6.4 MB 2.1 MB -67%
@nuxt/kit transitive dependencies 36 22 -39%
nuxt build, starter 4.4 s 3.6 s -18%
nuxt build, 200 pages / 200 components / 50 routes 11.6 s 10.3 s -11%
SSR throughput, page with 300 <NuxtLink>s 110 req/s 140 req/s +26%

Dev server start-up (spawn to first HTML) on the same machine is about 12% faster on a starter app, with the second request served in roughly half the time, though the CLI major changed alongside so not all of that is Nuxt.

📦 Lighter payloads

useAsyncData and useFetch accept a serialize: false option to keep data out of the __NUXT_DATA__ payload (#35779). That's most useful inside components that never hydrate, and experimental.stripNeverHydratedData applies it automatically to data fetched within hydrate-never component trees.

Nuxt also warns in development when a page's payload exceeds 100 kB (#35777) and when a route rendered with noScripts relies on client-side JavaScript (#35780), and noScripts pages keep their non-script resource hints and attach their styles correctly (#35803, #36356, #36359).

<NuxtLink> now prefetches server-page islands (#35808), and @atinux made prefetch hints throttled and prioritised so a page full of links doesn't flood the network (#36261, #36324). Building on that, route chunks, layouts, middleware, payloads, islands and resource hints all now go through one client prefetch scheduler with per-kind concurrency caps, deduplication by key, and cancellation of in-flight work when you navigate away (#36391).

🔮 Nuxt 5 features, today

Most of what's new in Nuxt 5 is already in 4.6, either as the default or behind a flag. future.compatibilityVersion: 5 turns on the Nuxt 5 defaults in one go, and every one of them can be enabled (or disabled) individually.

export default defineNuxtConfig({
  future: {
    compatibilityVersion: 5,
  },
})

Newly gated behind the flag in this release:

  • Typed pages (experimental.typedPages) (#35789)
  • Typed $fetch (experimental.routeTypedFetch), described above
  • Case-sensitive routing, matching Nitro (#35650, thanks to @Mateleo)
  • Early return from navigateTo (experimental.navigateToEarlyReturn): navigateTo in <script setup> short-circuits the rest of the setup, so redirects and 404s don't throw on missing data (#36115)
  • Serializable page meta extraction (experimental.extractSerializablePageMeta)
  • Client-side payload extraction (experimental.payloadExtraction: 'client')
  • Normalized page names, clearNuxtState resetting to defaults, experimental.watcher: 'builder', and no auto-imported server-only head composables
  • No baseUrl in generated tsconfigs (#36040, thanks to @oritwoen)
  • Inline error rendering (experimental.inlineErrorRendering): when a server render fails, error.vue is rendered in the same request with a plain try/catch, instead of re-entering the server over an internal request to /__nuxt_error. Headers and cookies the failed render had already set are kept, error renders no longer pass through Nitro middleware and route rules a second time, and render:html fires with the original event (#36399).

The upgrade guide now lists exactly what the flag changes on Nuxt 4.

🧪 Experimental: @nuxt/vite-server

Since v4.2 server.builder has been configurable. This release adds a second server builder: @nuxt/vite-server. It builds a Nuxt app with Vite alone (#36218, #36279, #36288).

This is all you need to do to configure it.

export default defineNuxtConfig({
  server: {
    builder: 'vite', // 'nitro' is the default
  },
})

It can produce a pure client SPA, a server-rendered app with a small Node entry, a web-standard fetch handler for platforms that provide the server (there are e2e examples for Cloudflare Workers, Netlify and universal deploy), as well as fully static output with nuxt generate.

Right now, this helps keep Nuxt's code agnostic, enforce the contract behind nuxt/server, and to give Vite plugins that provide a deploy target something to build on. It does not have Nitro's full feature set (there is no storage, caching, tasks or server plugins), and we expect most apps to keep using Nitro. Nitro remains the default.

Warning

This is highly experimental and the API will change. 'nitro' and 'vite' are new shorthands for @nuxt/nitro-server and @nuxt/vite-server.

🛠️ Developer experience

  • Clickable file paths in terminal output (#35898). Warnings that mention a file now link to it in your editor, at the line responsible where we know it.
  • IDE hover docs for built-in components (#35701). Hovering a built-in component like <NuxtLayout> or <NuxtLink> in a template now shows a short description and a link to the docs. Thanks to @Ibochkarev.
  • app/types/ and server/types/ are included in the right tsconfig, so ambient types and augmentations placed there are picked up (#35783, thanks to @Flo0806, who also added an augmentable NuxtPageMeta for typing NuxtPage.meta in #34816).
  • Grouping folders in components/: a (group)/ folder is excluded from the component name (#35699, thanks to @abaza738).
  • Dynamic expires in useCookie, accepting a function (#35628, thanks to @DarlanPrado).
  • A warning when a public/ file shadows an application route (#35674, thanks to @Norbiros).
  • Install hints use your package manager (#35871).
  • Prerender your error pages as real HTML (404.html, or any status codes you pass) with experimental.prerenderErrorPages instead of an empty SPA shell (#35193, thanks again to @Flo0806).
  • $Fetch is exported from nuxt/app (#35625) and ShallowRef is in the Vue auto-import preset (#36266), both from @DamianGlowala; preloadComponents and the NuxtIsland name prop are typed (#35775), and useLayout, useLoadingIndicator and useRequestHeader are exported from nuxt/app (#36033).
  • typescript.tsConfig is now a shared baseline for all four generated tsconfigs, with appTsConfig and serverTsConfig for per-context overrides (#35697, thanks to @chairulakmal).
  • Top-level prerender option, an alias for nitro.prerender in the same way runtimeConfig and routeRules are top-level (#32356). Nuxt now also points you towards top-level options where they exist, since those work across server builders (#36416).
  • Links to public/ files just work. If the router has no route for a <NuxtLink> target (a PDF in public/, say, or a link from Markdown with Nuxt Content), Nuxt falls through to a full-page load instead of rendering your 404, so external is no longer required (#36169).
  • Renaming a component in development refreshes its imports, so you no longer see stale references to the old file (#36165, thanks to @oritwoen).
  • Layers: dependencies of layers installed from node_modules are pre-bundled by Vite (#36208), and symlinked layer directories resolve to their real path (#36402, thanks to @silverbackdan).

🧰 For module authors

If you maintain a module with server code, we've enabled making modules compatible with both Nuxt 4 & 5, without requiring a major bump. (And we'll be opening PRs proactively after the release of Nuxt v4.6 to assist with preparing for a Nuxt v5 release...)

  • One module for Nuxt 4 and Nuxt 5. addServerHandler, addDevServerHandler and addNitroPlugin accept a map of variants per server API (#36317). Nuxt chooses the most appropriate one. A handler that imports only from nuxt/server needs no Nitro 2/3 variants at all (but does require Nuxt v4.6+).

    addServerHandler({
      route: '/api/my-module/status',
      handler: {
        nuxt: resolve('./runtime/server/status'),
        nitro2: resolve('./runtime/server/status.legacy'),
      },
    })

    Nuxt reads the file's imports to decide which API it uses. Where that isn't enough, you can declare meta.compatibility.server. getNitroVersion and hasNitroVersion are also there in case you have logic that explicitly requires you to know the Nitro version installed (#36127).

    👉 Read the server compatibility guide for more information.

  • Nuxt-owned, augmentable server types: ServerTypes, ServerRoutes, AppRouteRules and NuxtRequestContext. Augment @nuxt/schema once; nuxt/schema mirrors it (#36293).

  • useTerminal for host-aware prompts, status messages and tasks in progress, rendered by the CLI's dev panel when there is one (#36162).

  • module:before and module:done hooks, which Nuxt CLI v4 uses to show per-module setup time as it happens (#36173).

  • onConfigResolved and diffNuxtConfig to see what changed between two config loads (#35853).

  • ensureDependencyInstalled and getAddDependencyCommand to check for and offer to install optional dependencies with the user's package manager (#34554).

  • Template dependencies to say exactly what should invalidate a template (#35875).

  • addServerImports, addServerImportsDir and addServerTemplate work the same across Nitro versions; a server tsconfig and versioned route config types are generated for you (#36265).

  • @nuxt/kit has an explicit public API (#36074) and @nuxt/schema is an optional peer (#36246).

  • Modules can now set experimental.asyncContext (#36175, thanks to @cernymatej), Vite plugins added via kit land at the top level rather than wrapped (#36037), and more build-time warnings have moved to diagnostic codes with docs pages (#36138).

  • @nuxt/kit peer dependency ranges are widened to the versions actually required rather than tracking the latest of each package (#36417), and updateRuntimeConfig no longer warns when called before Nitro exists (#36403, thanks to @Neekoras).

🔒 Security

  • The internal error route is only served to an error render, and can no longer be reached from outside (259058cf4, #36305).
  • Dev error reports are scoped for remote peers, and the dev error channel is kept out of production builds (#36389, #36407).
  • Unhandled error data is no longer passed to the error page (38a40cfc0), oversized island bodies are drained before being rejected (#36320), and error-render recursion is tracked in request context rather than via a client-controllable header (d8c729435).

🩹 Important fixes

  • Awaited useAsyncData no longer resolves with unfetched data on hydration (#36124), awaited lazy async data resolves immediately (#36301), and useAsyncData types resolve for generic type params (#36316).
  • useRequestFetch forwards request headers (#36180, thanks to @hdwebpros).
  • navigateTo matches vue-router's path encoding (#36055), preserves percent-encoding in server redirects (#36112), and applies baseURL with open (#36197).
  • Scoped styles apply to server component slots (#36047), island asset requests are deduped (#36048), lazy hydration no longer produces blank remounts (#36051), all from @oritwoen, and hydrated nuxt-client markup is stripped from cached island HTML (#36298).
  • A batch of CSS fixes across Vite, webpack and rspack: duplicate CSS links for inlined chunks (#36056), baseURL and url() rewriting in inlined styles (#36137, #36143), island descendant CSS extraction (#36260) and stable style chunk names (#36361).
  • View transitions handle interrupted and skipped navigations (#35537 from @Askerka00, #36314), and page transitions stay mounted for nested routes with no children (#36304).
  • The streaming shell head renders after the first render pass (#36120).
  • Payload URLs are parsed as origin-relative paths, so a path like //x/_payload.json no longer serves the wrong payload (#36409, spotted by @Kushalkhemka).
  • /index.html is prerendered for client-only apps with islands (#36299).
  • definePageMeta works at the top level of setup() (#36245), and changed auto-import sources are rescanned before their consumers (#33671, thanks to @Flo0806).
  • A template that never finishes compiling now fails the build instead of exiting 0 (#36322).
  • Error causes are preserved in development (#35632, thanks to @onmax).
  • Layout onBeforeLeave reuses the pending transition promise (#36395), and baseURL and middleware flags are respected in apps without pages/ (#36034).
  • stripNeverHydratedData no longer mutates the options object (#36035), the dev error module is stubbed out of production builds (55e61d75d), and preloading a component that is not global now warns (47de80ece).

✅ Upgrading

Our recommendation for upgrading is to run:

npx nuxt upgrade --dedupe

This will refresh your lockfile and pull in all the latest dependencies that Nuxt relies on, including Nuxt CLI v4.

Note

This release requires Node.js ^22.22.3 || ^24.15.0 || >=26.0.0.

If you have server code you'd like to make portable, read Moving to nuxt/server in the upgrade guide.

👉 Changelog

compare changes

🚀 Enhancements

  • kit: add resolveServerVariant + addServerImports variant support (#36445)
  • nuxt: add addon support to createUseFetch and createUseAsyncData (#35797)
  • vite-server: back serverFetch and route rules in nuxt/server (2386a5b6a)
  • nuxt,nitro,schema: add useServerHooks to nuxt/server (e003cd46d)
  • nuxt,nitro: add serverFetch to nuxt/server (d14e82bc2)
  • nuxt,nitro: add forwarded url, cookie and route rule helpers to nuxt/server (92c15e581)
  • nuxt,vite: add hook, bundler and middleware tracing channels (#36423)
  • nuxt: serve unmatched public asset paths on client-side navigation (#36169)
  • nuxt,schema: add top-level prerender alias for nitro.prerender (#32356)
  • nuxt,vite-server: render the error page in the renderer itself (#36399)
  • nuxt: unified client prefetch scheduler (#36391)
  • nuxt: add useAppConfig to nuxt/server (083b44ee4)
  • nuxt: add handleCors to nuxt/server (f2c93dbfc)
  • nuxt: add readValidatedBody and getValidatedQuery to nuxt/server (c8343d7a4)
  • nuxt: add getRouterParam(s) and getRequestIP to nuxt/server (158901fde)
  • nuxt,nitro,vite,vite-server: scope dev error reports for remote peers (#36389)
  • nitro,vite: map dev ssr stacktraces and render errors with my-bad (#36258)
  • ui-templates: use neutral palette and lighter error type (#36255)
  • ui-templates: particle mountain loading screen (#36178)
  • nuxt: add session utils to nuxt/server (#36358)
  • nuxt,schema: add nuxt appSecret (#35874)
  • nuxt: add server + client cookie jars to avoid unnecessary reads (#36114)
  • kit,nitro,schema: register server handlers and plugins per server API (#36317)
  • nuxt,nitro,vite-server: compile nuxt core route rules (#36307)
  • vite-server: support nuxt generate prerendering (#36288)
  • kit,schema,vite-server: render in a target's own env (+ add e2e tests) (#36279)
  • nuxt,schema: give nuxt/server handlers a portable event (5bf478b8c)
  • nuxt,kit,schema,nitro,vite-server: add nuxt/server (#36275)
  • kit: add a server tsconfig and versioned nitro route config types (#36265)
  • nuxt: add ShallowRef type to vue preset (#36266)
  • nuxt: type $fetch and useFetch from generated server routes (#36238)
  • kit,nuxt,vite,vite-server: add experimental pure vite server (#36218)
  • kit,schema: add module:before/module:done hooks (#36173)
  • kit: add useTerminal for host-aware prompts and tasks (#36162)
  • nuxt: add experimental early404 for unmatched page routes (#36117)
  • nuxt: add experimental early return after navigateTo (#36115)
  • kit: nitro version utils + version-tagged server utils (#36127)
  • nuxt: support vue vapor (#35759)
  • nitro: allow prerendering error page (#35193)
  • nuxt: use @nuxt/cli v4 prerelease (#35981)
  • nitro,nuxt: improvements when rendering with noScripts (#35803)
  • kit,nitro,nuxt,rspack,vite,webpack: use package manager in hints (#35871)
  • nuxt: make file names clickable 🖱️ (#35898)
  • nitro: warn in dev when noScripts routes rely on client JS (#35780)
  • nitro,nuxt,schema: let templates declare dependencies (#35875)
  • nuxt: prefetch server page islands via <NuxtLink> (#35808)
  • kit: expose resolved config snapshot and diff helper (#35853)
  • nitro: warn in dev when payload exceeds 100 kB (#35777)
  • nuxt,nitro: auto-import types from app/types and server/types directories (#35783)
  • nuxt: type preloadComponents and NuxtIsland name (#35775)
  • schema: enable typedPages with compatibilityVersion: 5 (#35789)
  • nuxt: add serialize option to keep async data out of payload (#35779)
  • ui-templates: add back button on 404 page (#35688)
  • kit: easier way to define global tsConfig options (#35697)
  • nuxt: log template write paths when debugging (#35686)
  • nuxt: export $Fetch type (#35625)
  • nuxt: add IDE hover docs for built-in components (#35701)
  • nuxt: support grouping folders in component directories (#35699)
  • schema: add augmentable NuxtPageMeta interface for NuxtPage.meta (#34816)
  • nuxt: warn when public files override application routes (#35674)
  • nuxt: support dynamic expires in useCookie (#35628)
  • schema: case-sensitive routing by default in v5 (#35650)

🔥 Performance

  • kit: use package-manager-detector to install packages (#36434)
  • vite: stop serial-build warmup on first navigation (04f319837)
  • vite: evaluate ssr entry before the first dev render (2da76d248)
  • vite-server: index public files only once (#36373)
  • nuxt: drop unctx from client environment (+ defu in single-object config) (#36371)
  • nitro: use flru for prerender cache (#36340)
  • nitro,nuxt: use lazy impound tracing for builds (#36172)
  • vite: warm the server module graph before the client (#36154)
  • nuxt,vite: migrate isVue calls into plugin filters (#36116)
  • kit: remove confbox and pkg-types from dependencies (#36083)
  • nuxt: filter virtual module load hooks by id (#36077)
  • kit: drop ufo dependency (#36073)
  • kit: use microdiff and node:crypto (#36071)
  • nuxt: render internal <NuxtLink> anchors directly on server (#36015)
  • nuxt,kit: avoid loading jiti unless it is needed (#35943)
  • nuxt: tree-shake ssr: false pages from server bundle (#35836)
  • nuxt: extract serializable definePageMeta keys at build time (#35919)
  • vite: crawl client module graph when warming dev server (#35870)

🩹 Fixes

  • nuxt: resolve anchor hrefs through the router (#36459)
  • nuxt: leave a newer async data entry alone when an old one is taken off (#36436)
  • nuxt: await async layouts before navigation (#36454)
  • nuxt,vite: show compile error overlay on client-only pages (#36444)
  • schema,vite-server: accept null from prerender ignore functions (6c36b5e39)
  • nuxt: keep CookieOptions compatible with cookie serialize options (62ebbd909)
  • kit: point NUXT_B1022 at resolving templates before bundling (3f269cb66)
  • kit: only write missing types when building into a relocated build dir (dfbab4f7c)
  • kit,nuxt: preserve types when building into a relocated build dir (#36418)
  • nuxt,nitro: render html page errors + json server route errors (#36455)
  • nuxt,vite-server: keep cookies + respond to json clients on errors (#36451)
  • vite,nitro: rewrap console if build throws (aec739e93)
  • kit,nuxt: provide nuxt/internal/dev-error as a server runtime module (a17d9dbc6)
  • nuxt: allow @nuxt/cli runtime imports in server runtime (e2eb0b5e3)
  • nuxt: type nitro type path helper with NitroConfig (507002bb0)
  • nuxt: refresh component imports after rename (#36165)
  • nuxt: skip browser notices without error in dev overlay (#36415)
  • kit: widen peer dependency ranges to supported versions (#36417)
  • schema: deprecate nitro.* options duplicated at the top level (#36416)
  • vite: pre-bundle deps of layers installed in node_modules (#36208)
  • nuxt: respect base URL and clear middleware flags without pages/ (#36034)\ (#36034)
  • nuxt,nitro: stub dev error module in production builds (55e61d75d)
  • nitro: do not warn for public asset dirs generated in the build dir (61fdd921a)
  • nuxt: resolve @nuxt/* type paths from nuxt's own resolution (3796a4105)
  • nuxt: warn when preloading a component that is not global (47de80ece)
  • nitro: resolve nitro dependency types from the copies nitro uses (70bf7caf7)
  • nuxt: avoid mutating options when stripping never-hydrated data (#36035)
  • kit: do not warn when updateRuntimeConfig runs before nitro exists (#36403)
  • kit: resolve symlinked layer directories to their real path (#36402)
  • nuxt: reuse pending transition promise in layout onBeforeLeave (#36395)
  • vite: keep named compile report over nameless hmr payload (98bc0a675)
  • nuxt: reject sealed values not issued by nuxt sessions (#36413)
  • nitro,vite: sort prerendered routes in app manifest (d54d0c7db)
  • nuxt: parse payload url as origin-relative path (#36409)
  • nitro: explain when an h3 event reaches a nuxt/server helper (a973b058b)
  • nuxt: invalidate auto-import consumers on the hmr-less ssr dev server (1718612ad)
  • nitro: give the portable event's response headers the full Headers interface (9c3525f6a)
  • nuxt: accept Endpoint-shaped ServerRoutes augmentations in the InternalApi engine (9d4d1edaf)
  • nitro: keep dev error channel out of production builds (#36407)
  • nuxt: share client app context across module instances (984832f0a)
  • nitro: resolve path placeholders in nitro preview command (71a61556d)
  • nitro: extend nitropack runtime app config with nuxt fields (b0e1abf52)
  • nitro: detect an http error by brand in the dev error handler (134256aa4)
  • nuxt: explain nitro 2 env parsing when a derived secret is unusable (262d62e2c)
  • nuxt: prepend the vite unctx transform so it reaches page-meta macro modules (3a43e1d74)
  • nitro: renumber duplicate NUXT_E8009 diagnostic code (70eabb790)
  • vite: await ssrFixStacktrace (#36372)
  • vite: keep deduped packages out of importer-based external resolution (#36363)
  • nuxt,vite: attach resources to pages served without scripts (#36359)
  • vite: share a style chunk-name counter across component extractions (#36361)
  • nuxt: keep non-script resource hints on noScripts routes (#36356)
  • nuxt: strip hydrated nuxt-client markup from cached island html (#36298)
  • nuxt: widen nuxt/server helper event types (#36335)
  • nuxt: keep a configured appSecret and warn when it is used (31b47404d)
  • nuxt: keep session managers in step after clearSession (4ae850572)
  • nuxt: use a throttle approach for hint prefetching (#36324)
  • kit: normalise method case when checking for duplicates (d7a41e6dc)
  • kit: respect method when checking for existing handlers (#36329)
  • kit: register the base path of a wildcard route on nitro v2 (#36325)
  • nitro: render streaming shell head after first render pass (#36120)
  • vite: skip client manifest finalisation for aborted builds (#36270)
  • nitro: apply server replacements to prerenderer (#36311)
  • kit,nuxt,schema: let a server build declare the module backing fetch (f61a5149b)
  • kit,nitro: follow host nitro major in server build runtime fallback (4418fdb2d)
  • nuxt: apply nitro type paths in prepare:types in dev (#36244)
  • nuxt: forward request headers with useRequestFetch (#36180)
  • nitro: serve repeated reads of a nuxt/server request body (639960e90)
  • nitro: write registered server plugins into the nitro config (e47c43d33)
  • nuxt: resolve awaited lazy async data immediately (#36301)
  • nuxt: resolve useAsyncData type for generic type params (#36316)
  • nitro: drain oversized island body before rejecting it (#36320)
  • kit,nuxt: fail the build when a template never finishes compiling (#36322)
  • nitro: buffer the body read through a nuxt/server event (0fca34007)
  • nitro: scan a layer's server utils before the project's (0d23fa357)
  • nitro: pass glob patterns to devStorage fs watch ignore (#36306)
  • nuxt: keep view transition state for interrupting navigations (#36314)
  • nuxt: handle rejected ready promise of skipped view transition (#35537)
  • nitro: serve the internal error route only to an error render (259058cf4)
  • nitro: guard internal error render on request context (d8c729435)
  • vite: resolve bare ssr externals from their importer (#36309)
  • nitro,vite-server: render error.vue 404 when accessing /__nuxt_error (#36305)
  • nuxt: skip scanning page meta if the scanner cannot parse (#36297)
  • nitro: prerender /index.html for client-only apps with islands (#36299)
  • nuxt: keep page transition mounted for nested route with no children (#36304)
  • nuxt: respect image prefetching as preload to respect Accept hea… (#36261)
  • nuxt: listen to link:prefetch hook before onNuxtReady (#36271)
  • vite: let the app build serve a server build that is not its own pass (dc160687a)
  • vite: let a server build that is not its own pass reach the app entry (bf7a83e31)
  • nitro: load nitropack in any program that augments it (5a8519004)
  • kit,nitro,schema: derive the fallback server runtime from the host nitro major (85f372478)
  • nitro: do not pass unhandled error data to error page (38a40cfc0)
  • kit: declare @nuxt/schema as an optional peer dependency (#36246)
  • kit,nuxt,schema,vite-server: let vite plugins own the deploy target (#36233)
  • nuxt: avoid app config declaration conflicts (#36053)
  • nuxt: rescan changed auto-import sources before their consumers (#33671)
  • rspack,webpack: do not serve server bundle from dev server (7e07e3050)
  • vite: extract css of island descendants when inlining is off (#36260)
  • kit: explicitly include .vue and other extensions tsconfigs (#36253)
  • nuxt: resolve layout hydration guard when unmounted early (#36252)
  • nuxt: bound island v-for on nuxt-client elements without selectiveClient (0b7a3c61a)
  • nuxt: only rewrite island uid marker in attribute position (40ea3de58)
  • nuxt: serialize numeric v-for island slot scopes 1-based (#36230)
  • nuxt: support definePageMeta at the top level of setup() (#36245)
  • nuxt: make target optional if calling navigateTo w/ open (#36196)
  • vite: exclude stable entry chunk from preload dependencies (#36198)
  • nuxt: apply baseURL when calling navigateTo with open (#36197)
  • nuxt: expose shallow async data ref (#36075)
  • nuxt: ignore grouping folders when collapsing repeated name segments (#36195)
  • nuxt: register namespace binding alongside default import (#36194)
  • nuxt: keep extracted __proto__ page meta keys as own properties (#36193)
  • nuxt: disable early 404 for page paths that cannot be decoded (#36191)
  • nitro: resolve aliases and rootDir-relative asset dirs (#36209)
  • nuxt: key dynamic meta by file path + nuxt instance (#36188)
  • schema: keep nuxt/schema augmentation bridge out of bundled types (#36186)
  • kit: forward configFile and rcFile to config loader (#36185)
  • nuxt: validate component export name before code generation (#36181)
  • nuxt: allow modules to set experimental.asyncContext (#36175)
  • schema: type import.meta.env as ImportMetaEnv (fd17d697e)
  • kit,nitro,schema: ensure tsconfigs exist before build (#34646)
  • schema,nuxt: accept partial app config input + stop merging functions (#36158)
  • ui-templates: mark the loading page's poll as a document request (8d6240a99)
  • ui-templates: back off the loading page's poll (#36147)
  • vite: rewrite every public asset url() in CSS (#36143)
  • vite: apply baseURL to public assets in inlined styles (#36137)
  • nuxt: resolve layout name override in layout isCurrent check (#36132)
  • nuxt: bridge AppConfigInput augmentations into nuxt/schema (#36128)
  • nuxt: don't resolve awaited useAsyncData with unfetched data on hydration (#36124)
  • nuxt: preserve percent-encoding in server navigateTo redirects (#36112)
  • nuxt: preserve regexp and function values when cloning import presets (c099af61e)
  • nitro: match exact nonce attribute for streaming CSP nonce (22682d782)
  • nuxt: pass absolute paths to build cache ignore check (625d9f50a)
  • nitro: preserve overlapping dynamic payload rules (#34717)
  • kit: retry CJS-global and alias load failures through jiti (#36082)
  • rspack,webpack: respect inlineStyles predicate for global css (d1d245bee)
  • rspack,webpack: do not search filesystem for postcss config (1ff282846)
  • rspack,webpack: keep url() wrapper when rewriting inlined styles (09fd9a117)
  • nuxt: hide internal dynamic page meta key behind a symbol (#36081)
  • nuxt: keep page bundle restrictions out of the pages array (#36080)
  • nuxt: avoid duplicate island asset requests (#36048)
  • kit: reorder diagnostics by code (540c9e772)
  • kit: retry nested load failures through jiti (#36072)
  • nuxt: keep <NuxtTime> locale prop reactive after hydration (#35923)
  • nuxt: validate scopeId prop passed to <NuxtIsland> (#36064)
  • vite,nitro: keep css links for unrendered components (#36060)
  • nuxt: apply scoped styles to server component slots (#36047)
  • kit,nitro: ignore baseUrl with compatibilityVersion 5 (#36040)
  • nitro: in dev, only add css for islands actually rendered (#36057)
  • vite: drop duplicate CSS links for fully inlined shared chunks (#36056)
  • nuxt: match vue-router path encoding in navigateTo (#36055)
  • nuxt: avoid blank lazy hydration remounts (#36051)
  • nuxt: don't defer hydration route for trailing-slash-only diffs (#36050)
  • kit: add vite plugins at top level instead of wrapping them (#36037)
  • nuxt: keep ref-initialised useState connected to payload state (#36038)
  • nuxt: only compute distURL in development (#36032)
  • nuxt: export useLayout, useLoadingIndicator and useRequestHeader (#36033)
  • vite: recover throttled watcher changes in dev servers (3d1087088)
  • nuxt: only map test components for webpack and rspack (63f8ce22e)
  • nuxt,nitro: unwrap route rule matches when resolving rules (67e1b8d94)
  • nuxt: stub client-only components + map test components in server build (#36019)
  • nuxt: do not write readonly cookies on client (#36014)
  • nuxt: skip cookie watcher entirely when readonly (#35997)
  • nitro,nuxt: hoist route matcher to prevent temporal dead zone (#36012)
  • nuxt: resolve ufo from nuxt dependencies (#36010)
  • nitro: resolve paths pointing at bare module specifiers (#36011)
  • nuxt: preserve error causes in development (#35632)
  • nuxt: improve js type-checking (5a003806e)

💅 Refactors

  • nuxt,nitro: drop toNuxtRequestEvent from nuxt/server (cf00e7b9e)
  • nuxt,nitro,vite-server: share error handling between the renderer and server builders (#36398)
  • nuxt: drop setResponseHeader(s) from nuxt/server (d4b0330f9)
  • nuxt: own more of the public api for nuxt/app (#36368)
  • vite-server: return meta-refresh body for redirect route rules (0f069152c)
  • schema,nuxt,nitro: move server type declarations into schema (#36293)
  • nuxt,nitro: let a server builder name the event the app sees (14c7b50df)
  • nuxt,nitro,schema: collect prerender hints in nuxt context (#36277)
  • nuxt,kit,nitro,vite,vite-server: add server runtime record + vite ssr (#36274)
  • nuxt,nitro,nuxt,schema,vite: extract ssr renderer (#36272)
  • kit,nitro: pass the asset dir resolution order into NUXT_B7023 (0e032202c)
  • kit,nuxt,schema,vite: decouple core from @nuxt/nitro-server (#36223)
  • nuxt,schema: own typed $fetch types in nuxt (#36214)
  • nitro,nuxt,schema: decouple #app from h3 types and runtime (#36212)
  • kit,schema,nitro: resolve nitro types from server builder (#36171)
  • kit,nitro,nuxt,schema: migrate more build-time warnings -> nostics (#36138)
  • kit: inline minimal nitro v2/v3 types and drop nitro deps (#36125)
  • kit,schema: explicitly define kit public api (#36074)
  • nuxt: iterate over fragment children (#36041)
  • nuxt: remove reverse trace indexing (#36044)
  • webpack: replace pify with node promisify (#36042)
  • remove mlly from dependencies (#35946)
  • kit: inline c12 and untyped, make jiti/giget optional peers (#35936)
  • vite: share dependency-install prompt via kit (#34554)
  • nuxt: remove config.cjs file in require export (#35805)
  • nuxt: use native vue pausable watcher for useCookie (#36006)

📖 Documentation

  • complete nuxt/server migration + module guides (27a1d9d28)
  • return streams directly (#36449)
  • document typing runtime config and events in modules (776773f1c)
  • document declared routes in createUseFetch (a624e4e47)
  • adjust spacing (#36262)
  • add a guide for moving server code to nuxt/server (9730d7c0a)
  • document the new nuxt/server helpers and what stays on nitro (5b51b07d6)
  • document typesDir (4a0780dfe)
  • list remaining compatibilityVersion: 5 defaults in the 4.x upgrade guide (e9d5767b8)
  • use @since 4.6.0 for surfaces shipping in 4.x (e6fee2f42)
  • link the 5.x upgrade guide by full url (fc8387a1a)
  • clarify Nuxt collects prerender hints and route rules (e5e472743)
  • reserve app-prefixed runtime config keys for nuxt (5ea634670)
  • link to the 5.x upgrade guide rather than carrying it (c8f2d4b26)
  • document useRequestEvent return type (1212aa788)
  • document nuxt/server and module server compatibility (94e2040fa)
  • document $Fetch type export (e69ab1b89)
  • document island prefetching for server-only pages (9c154b6da)
  • document kit dependency helpers (09c9af7a2)
  • document loadNuxtConfig options and diffNuxtConfig (2d32d994a)
  • change <NuxtTime> prop from 'date' to 'datetime' (#36341)
  • strip version prefixes (897977f33)
  • explain ssrStreaming.botRegex in more detail (d810367b9)
  • update testing guide to test-utils v4.2.0 (#36234)
  • move CLI command reference to nuxt/cli (#36145)
  • update mcp tools and mention X-MCP-Tools header (#36065)
  • remove nitro/h3 import from server types example (86c957f79)
  • document reverse proxy path handling (#36069)
  • fix typos and grammar issues (#36061)
  • mention Valibot for server-side validation (#36045)
  • add test/ in directory structure (#35991)

📦 Build

  • ui-templates: don't inline the modulepreload polyfill (#36247)

🏡 Chore

  • update test engines.node (20069e45b)
  • ignore local build output in knip (a925055b5)
  • prepare root types before linting (e093be119)
  • ui-templates: share generated output paths (83ef10ac9)
  • ignore generated output in knip (d26c50aad)
  • ui-templates: preview templates in a grid (#36257)
  • update ui templates in precommit hook (#36383)
  • force lf line endings for pnpm patch files (5380cbe37)
  • kit,nitro,vite,vite-server: move tests out of src (337fa63c0)
  • allow reviews (#36215)
  • update link to vue policy (9e3f5f6b6)
  • update security policy (#36248)
  • bump @flakiness/vitest to 1.9.2 (#36176)
  • migrate release pipeline to uppt (#36167)
  • send test results to Flakiness.io dashboard (#36159)
  • enable minimumReleaseAgeExcludePrune & catalogPrune (#36140)
  • tweak guidance (86c3994ec)
  • add guidance for agents (84b495a64)
  • exempt first-party packages from pnpm minimumReleaseAge (#36001)
  • don't update nitro group until approved explicitly (1f0f3030a)

✅ Tests

  • allow main-only nitro diagnostic (6c7f9fd47)
  • allow arbitrary component names in preload type test (a8716b9b2)
  • wait for the error page to reload itself after a compile fix (5828109bc)
  • wait for ladder payloads before promoting prefetch work (5d9d66216)
  • order forwarded hint payloads before asserting recency (a24dfe308)
  • wait for restored catch-all page before asserting (3271893e8)
  • cover nuxt/server sessions end to end (ddde51e2e)
  • require every main diagnostic code to exist on 4.x (c66f1a5e7)
  • tolerate rewording when comparing diagnostic codes across branches (9d862ea97)
  • cover foreign HTTPError in dev error handler (f2ddcb0ba)
  • guard diagnostic codes against drift from 4.x (4150664f1)
  • cover import.meta.test guard in dev error handler (51e8a676d)
  • assert the nitro 2 parsing of the appSecret environment override (0da748765)
  • fail fast with vite error overlay contents in e2e navigation (14ad6961d)
  • give builder watcher suite room for cold start (43e1e64a3)
  • wait for async state in watcher and middleware abort tests (ca21185ee)
  • add names for runtime config tests (7c68ff3db)
  • add regression test for inline style order (#33041)
  • guard the cost of resolving a typed $fetch call (#36254)
  • isolate dev fixtures by worker (#35937)
  • add tests for head option of defineNuxtComponent (#36251)
  • add property tests for pure utilities (#36190)
  • drop console logs from retried navigations and report their text (39e55ee68)
  • nest the island depth-guard body in json structure, not a string (9b1bcb522)
  • dispatch rapid suspense navigation clicks in a single task (fc2f6b27b)
  • dedupe test names (#36166)
  • assert inlined styles keep url() wrappers (#36146)
  • don't orphan e2e dev servers on fixture setup timeout (#36126)
  • loosen unprotected import assertion for impound (107990d39)
  • settle page:loading:end before asserting in router options (7d59e9f9a)
  • assert each diagnostics catalog is sorted by code (21725176b)
  • report which diagnostic code and catalogs collide (70034f67b)
  • disable type checking in bundle-size fixes... (68490ceb7)
  • give each payload variant its own build directory (421571000)
  • run ui-templates tests serially (38faf1901)
  • avoid island prefetch prefix collision (ff9a20788)

🤖 CI

🎉 New Contributors

❤️ Contributors

Don't miss a new nuxt release

NewReleases is sending notifications on new releases.