# Nuxt changelog > The intuitive Vue framework. - Vendor: Nuxt - Category: Frameworks & Libraries - Official site: https://nuxt.com - Tracked by: What's New (https://whatsnew.fyi/product/nuxt) - Harvested from: GitHub (nuxt/nuxt) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. ## Releases ### v3.21.11 - Date: 2026-08-05 - Version: v3.21.11 - Original notes: https://github.com/nuxt/nuxt/releases/tag/v3.21.11 - Permalink: https://whatsnew.fyi/product/nuxt/releases/v3.21.11 - **fixed** — Serialize island payloads for components with underscores in keys - **fixed** — Dedupe island renders when prerendering - **fixed** — Reject non-object island props - **fixed** — Re-check for preview mode after prerendered page hydration - **fixed** — Settle asyncData status when bailing - **fixed** — Clone resolved config with klona rather than klona/full - **fixed** — Use client-side navigation for links inside islands - **fixed** — Match route rules against decoded paths > 3.21.11 is a patch release. > [!IMPORTANT] > Nuxt v3 is now end-of-life. Please upgrade to Nuxt v4, or you may wish to check out [our partner HeroDevs](https://www.herodevs.com/support/nuxt-nes?utm_source=nuxtjs&utm_medium=affiliate&utm_campaign=nuxt3eol&utm_content=link) who provide never-ending support for end-of-life releases ##### 👉 Changelog [compare changes](https://github.com/nuxt/nuxt/compare/v3.21.10...v3.21.11) ###### 🩹 Fixes - **nuxt:** Serialize island payloads for components with underscores in keys ([#35807](https://github.com/nuxt/nuxt/pull/35807)) - **nitro:** Dedupe island renders when prerendering ([#35835](https://github.com/nuxt/nuxt/pull/35835)) - **nitro:** Reject non-object island props ([#35867](https://github.com/nuxt/nuxt/pull/35867)) - **nuxt:** Re-check for preview mode after prerendered page hydration ([#35886](https://github.com/nuxt/nuxt/pull/35886)) - **nuxt:** Settle asyncData status when bailing ([#35908](https://github.com/nuxt/nuxt/pull/35908)) - **kit:** Clone resolved config with klona rather than klona/full ([#35914](https://github.com/nuxt/nuxt/pull/35914)) - **nuxt:** Use client-side navigation for links inside islands ([#35806](https://github.com/nuxt/nuxt/pull/35806)) - **nuxt:** Match route rules against decoded paths ([81f86ac5e](https://github.com/nuxt/nuxt/commit/81f86ac5e)) ###### 🏡 Chore - Unpin `oxc-walker` ([a6c9dc6d3](https://github.com/nuxt/nuxt/commit/a6c9dc6d3)) ###### ❤️ Contributors - Daniel Roe (@danielroe) - Samuel Burkhard (@samydoesit) - Alexander Lichter (@TheAlexLichter) ### v4.5.2 - Date: 2026-08-05 - Version: v4.5.2 - Original notes: https://github.com/nuxt/nuxt/releases/tag/v4.5.2 - Permalink: https://whatsnew.fyi/product/nuxt/releases/v4.5.2 - **changed** — Skip rewriting unchanged generated files - **changed** — Use lazy imports to improve parsing speed - **changed** — Skip html entry probes in bare-import resolver - **changed** — Reuse app and component scans for unchanged structures - **fixed** — Resolve client manifest path from resolved config - **fixed** — Use client-side navigation for links inside islands - **fixed** — Generate types for route params defined with definePageMeta - **fixed** — Serialize island payloads for components with underscores in keys - **fixed** — Dedupe island renders when prerendering - **fixed** — Drop prefetch hints for never-hydrated chunks - **fixed** — Use same asset filenames for worker builds - **fixed** — Reject non-object island props - **fixed** — Support options api in v-for islands transform - **fixed** — Improve page meta extraction and performance - **fixed** — Set build outputs when restoring vue cache - **fixed** — Honour nested apply and applyToEnvironment in vite wrapper - **fixed** — Re-check for preview mode after prerendered page hydration - **fixed** — Handle missed chokidar watch events - **fixed** — Settle asyncData status when bailing - **fixed** — Clone resolved config with klona rather than klona/full > 4.5.2 is the next patch release. ##### 👉 Changelog [compare changes](https://github.com/nuxt/nuxt/compare/v4.5.1...v4.5.2) ###### 🔥 Performance - **nuxt,kit:** Skip rewriting unchanged generated files ([#35902](https://github.com/nuxt/nuxt/pull/35902)) - **kit,nuxt:** Use lazy imports to improve parsing speed ([#35901](https://github.com/nuxt/nuxt/pull/35901)) - **vite:** Skip html entry probes in bare-import resolver ([#35907](https://github.com/nuxt/nuxt/pull/35907)) - **nuxt:** Reuse app and component scans for unchanged structures ([#35912](https://github.com/nuxt/nuxt/pull/35912)) ###### 🩹 Fixes - **vite:** Resolve client manifest path from resolved config ([#35883](https://github.com/nuxt/nuxt/pull/35883)) - **nuxt:** Use client-side navigation for links inside islands ([#35806](https://github.com/nuxt/nuxt/pull/35806)) - **nuxt:** Generate types for route params defined with definePageMeta ([#35857](https://github.com/nuxt/nuxt/pull/35857)) - **nuxt:** Serialize island payloads for components with underscores in keys ([#35807](https://github.com/nuxt/nuxt/pull/35807)) - **nitro:** Dedupe island renders when prerendering ([#35835](https://github.com/nuxt/nuxt/pull/35835)) - **nuxt:** Drop prefetch hints for never-hydrated chunks ([#35812](https://github.com/nuxt/nuxt/pull/35812)) - **vite:** Use same asset filenames for worker builds ([#35866](https://github.com/nuxt/nuxt/pull/35866)) - **nitro:** Reject non-object island props ([#35867](https://github.com/nuxt/nuxt/pull/35867)) - **nuxt:** Support options api in `v-for` islands transform ([#35877](https://github.com/nuxt/nuxt/pull/35877)) - **nuxt:** Improve page meta extraction + performance ([#35869](https://github.com/nuxt/nuxt/pull/35869)) - **nuxt:** Set build outputs when restoring vue cache ([#35895](https://github.com/nuxt/nuxt/pull/35895)) - **kit:** Honour nested `apply` and `applyToEnvironment` in vite wrapper ([#35899](https://github.com/nuxt/nuxt/pull/35899)) - **nuxt:** Re-check for preview mode after prerendered page hydration ([#35886](https://github.com/nuxt/nuxt/pull/35886)) - **kit,nuxt,vite:** Handle missed chokidar watch events ([#35887](https://github.com/nuxt/nuxt/pull/35887)) - **nuxt:** Settle asyncData status when bailing ([#35908](https://github.com/nuxt/nuxt/pull/35908)) - **kit:** Clone resolved config with klona rather than klona/full ([#35914](https://github.com/nuxt/nuxt/pull/35914)) - **kit:** Honour nested plugins' `enforce` in vite wrapper ([#35916](https://github.com/nuxt/nuxt/pull/35916)) - **nuxt:** Collect build cache once build outputs are final ([#35929](https://github.com/nuxt/nuxt/pull/35929)) - **vite:** Resolve vite env api sourcemaps in `vite-node` ([#35758](https://github.com/nuxt/nuxt/pull/35758)) - **nuxt:** Don't warn about missing `` on nav + with slot ([#35948](https://github.com/nuxt/nuxt/pull/35948)) - **kit:** Prepend vite environment wrapper plugin when `prepend` is set ([#35942](https://github.com/nuxt/nuxt/pull/35942)) - **nuxt:** Depend on rolldown as a peer to reuse vite's copy ([3fda97f60](https://github.com/nuxt/nuxt/commit/3fda97f60)) - **nitro:** Define `import.meta.test` for server code ([#35987](https://github.com/nuxt/nuxt/pull/35987)) - **nuxt:** Match route rules against decoded paths ([9123ed850](https://github.com/nuxt/nuxt/commit/9123ed850)) ###### 💅 Refactors - **nuxt:** Use `vue-component-type-helpers` instead of locally maintained helpers ([#35840](https://github.com/nuxt/nuxt/pull/35840)) - **nuxt:** Use `isReferenceIdentifier` in page-meta plugin ([#35882](https://github.com/nuxt/nuxt/pull/35882)) ###### 📖 Documentation - Sync mcp server page with live tools and providers ([#35856](https://github.com/nuxt/nuxt/pull/35856)) - Add server components guide and mostly-static site recipe ([#35778](https://github.com/nuxt/nuxt/pull/35778)) - Minor changes ([#33479](https://github.com/nuxt/nuxt/pull/33479)) - Add accessible routing guide ([#3 _[Truncated at 4000 characters — full notes: https://github.com/nuxt/nuxt/releases/tag/v4.5.2]_ ### v3.21.10 - Date: 2026-07-27 - Version: v3.21.10 - Original notes: https://github.com/nuxt/nuxt/releases/tag/v3.21.10 - Permalink: https://whatsnew.fyi/product/nuxt/releases/v3.21.10 - **security** — Fix server-side RCE and unauthorized component instantiation via server island props - **security** — Fix route rule authorization bypass - **security** — Fix server component DoS vulnerability - **security** — Fix dev server path disclosure - **security** — Bound island props and v-for to prevent unauthenticated DoS - **security** — Reject reserved template island prop under runtime compiler - **security** — Reject top-level as prop for islands - **security** — Require loopback peer for chrome devtools workspace endpoint - **fixed** — Clear hide/reset timeouts in set() - **fixed** — Preserve trailing slash in NuxtLink href when unset - **fixed** — Resolve SSR inlined CSS module class name mismatch - **fixed** — Sync layout meta during middleware on SSR - **fixed** — Update client URL to match SSR on fatal middleware error - **fixed** — Watch external component directories in development - **fixed** — Don't cross-pollute useAsyncData cache on reactive key change - **fixed** — Return global route for useRoute in detached effect scope - **fixed** — Ignore custom name or path when reusing an existing page in pages:extend - **fixed** — Preserve explicit useFetch method inference - **fixed** — Correct default export detection in plugin metadata - **fixed** — Reload real page module on HMR of JSX render-function pages > ⚠️ **This is a security release.** We recommend upgrading as soon as possible with `npx nuxt upgrade --dedupe`. It fixes server-side RCE and unauthorized component instantiation via server island props, a route rule authorization bypass, server component DoS, and dev server path disclosure. Refreshing your lockfile also pulls in `@nuxt/devtools@3.3.1`, which fixes a separate critical development-only RCE. If you already upgraded for the earlier route rule advisory ([CVE-2026-53721](https://github.com/nuxt/nuxt/security/advisories/GHSA-mm7m-92g8-7m47)), you still need this release: one of the fixes addresses a regression introduced by that fix. Full details: [Nuxt Security Patch Releases](https://nuxt.com/blog/v4-5-security) and [GitHub Security Advisories](https://github.com/nuxt/nuxt/security/advisories). ##### 👉 Changelog [compare changes](https://github.com/nuxt/nuxt/compare/v3.21.9...v3.21.10) ###### 🩹 Fixes - **nuxt:** Clear hide/reset timeouts in set() ([#35534](https://github.com/nuxt/nuxt/pull/35534)) - **nuxt:** Preserve trailing slash in NuxtLink href when unset ([#35501](https://github.com/nuxt/nuxt/pull/35501)) - **vite:** Resolve SSR inlined CSS module class name mismatch ([#35610](https://github.com/nuxt/nuxt/pull/35610)) - **nuxt:** Sync layout meta during middleware on SSR ([#35633](https://github.com/nuxt/nuxt/pull/35633)) - **nuxt:** Update client URL to match SSR on fatal middleware error ([#35637](https://github.com/nuxt/nuxt/pull/35637)) - **nuxt:** Watch external component directories in development ([#35652](https://github.com/nuxt/nuxt/pull/35652)) - **nuxt:** Don't cross-pollute useAsyncData cache on reactive key change ([#35656](https://github.com/nuxt/nuxt/pull/35656)) - **nuxt:** Return global route for `useRoute` in detached effect scope ([#35659](https://github.com/nuxt/nuxt/pull/35659)) - **nuxt:** Ignore custom `name` or `path` when reusing an existing page in `pages:extend` ([#35661](https://github.com/nuxt/nuxt/pull/35661)) - **nuxt:** Preserve explicit `useFetch` method inference ([#35671](https://github.com/nuxt/nuxt/pull/35671)) - **nuxt:** Correct default export detection in plugin metadata ([#35676](https://github.com/nuxt/nuxt/pull/35676)) - **nuxt:** Reload real page module on HMR of JSX render-function pages ([#35678](https://github.com/nuxt/nuxt/pull/35678)) - **vite:** Ensure server sourcemap-preserver plugin actually runs ([#35680](https://github.com/nuxt/nuxt/pull/35680)) - **nuxt:** Resolve `@unhead/vue/*` from nuxt's dependency tree ([#35690](https://github.com/nuxt/nuxt/pull/35690)) - **nuxt:** Don't apply scroll behaviour after a subsequent nav ([#35719](https://github.com/nuxt/nuxt/pull/35719)) - **vite:** Preserve css suffix when extracting ssr inline styles ([#35714](https://github.com/nuxt/nuxt/pull/35714)) - **nuxt:** Don't exclude client entry module from style extraction ([#35720](https://github.com/nuxt/nuxt/pull/35720)) - **kit:** Avoid mutating layer configs when resolving options ([#35729](https://github.com/nuxt/nuxt/pull/35729)) - **nuxt:** Generate layout types even when pages module is disabled ([#35717](https://github.com/nuxt/nuxt/pull/35717)) - **nitro:** Skip resource hints for stylesheets already rendered as blocking links ([#35691](https://github.com/nuxt/nuxt/pull/35691)) - **nuxt:** Revalidate cached route payloads instead of using `force-cache` ([#35672](https://github.com/nuxt/nuxt/pull/35672)) - **nuxt:** Preserve query params in cached payload extraction ([#35696](https://github.com/nuxt/nuxt/pull/35696)) - **rspack,webpack:** Resolve loaders and runtime deps from nuxt dirs ([#35568](https://github.com/nuxt/nuxt/pull/35568)) - **nuxt:** Render client components in nested server components ([#35669](https://github.com/nuxt/nuxt/pull/35669)) - **nuxt:** Remove dev error overlay when error is cleared ([#35821](https://github.com/nuxt/nuxt/pull/35821)) - **rspack,webpack:** Resolve bundled postcss defaults fro _[Truncated at 4000 characters — full notes: https://github.com/nuxt/nuxt/releases/tag/v3.21.10]_ ### v4.5.1 - Date: 2026-07-27 - Version: v4.5.1 - Original notes: https://github.com/nuxt/nuxt/releases/tag/v4.5.1 - Permalink: https://whatsnew.fyi/product/nuxt/releases/v4.5.1 - **security** — Fix server-side RCE and unauthorized component instantiation via server island props - **security** — Fix route rule authorization bypass - **security** — Fix server component DoS - **security** — Fix cross-user payload disclosure on cached pages - **security** — Fix dev server path disclosure - **security** — Update @nuxt/devtools to 3.3.1 which fixes a critical development-only RCE - **changed** — Replace island teleports in a single html pass - **added** — Add vue.optionsApi configuration option and disable it for v5+ - **changed** — Skip client plugins that require routing when pages are not configured - **changed** — Skip payload revival plugin when ssr is false - **fixed** — Read rspack dev output fs lazily for server entry - **fixed** — Resolve loaders and runtime deps from nuxt dirs in rspack and webpack - **fixed** — Return global route for useRoute in detached effect scope - **fixed** — Ignore custom name or path when reusing an existing page in pages:extend - **fixed** — Render client components in nested server components - **fixed** — Preserve explicit useFetch method inference - **fixed** — Revalidate cached route payloads instead of using force-cache - **fixed** — Correct default export detection in plugin metadata - **fixed** — Add .mts file extension in resolver - **fixed** — Preserve trailing slash in NuxtLink href when unset > ⚠️ **This is a security release.** We recommend upgrading as soon as possible with `npx nuxt upgrade --dedupe`. It fixes server-side RCE and unauthorized component instantiation via server island props, a route rule authorization bypass, server component DoS, cross-user payload disclosure on cached pages, and dev server path disclosure. Refreshing your lockfile also pulls in `@nuxt/devtools@3.3.1`, which fixes a separate critical development-only RCE. If you already upgraded for the earlier route rule advisory ([CVE-2026-53721](https://github.com/nuxt/nuxt/security/advisories/GHSA-mm7m-92g8-7m47)), you still need this release: one of the fixes addresses a regression introduced by that fix. If you use the `cache`, `swr` or `isr` route rules, purge any CDN or edge cache after upgrading; a leaked `_payload.json` may already be cached upstream. Full details: [Nuxt Security Patch Releases](https://nuxt.com/blog/v4-5-security) and [GitHub Security Advisories](https://github.com/nuxt/nuxt/security/advisories). ##### 👉 Changelog [compare changes](https://github.com/nuxt/nuxt/compare/v4.5.0...v4.5.1) ###### 🔥 Performance - **nitro:** Replace island teleports in a single html pass ([#35515](https://github.com/nuxt/nuxt/pull/35515)) - **nuxt:** Add `vue.optionsApi` and disable it for v5+ ([#35791](https://github.com/nuxt/nuxt/pull/35791)) - **nuxt:** Without pages, skip client plugins that require routing ([#35794](https://github.com/nuxt/nuxt/pull/35794)) - **nuxt:** Skip payload revival plugin when `ssr: false` ([#35782](https://github.com/nuxt/nuxt/pull/35782)) ###### 🩹 Fixes - **nitro:** Read rspack dev output fs lazily for server entry ([#35740](https://github.com/nuxt/nuxt/pull/35740)) - **rspack,webpack:** Resolve loaders and runtime deps from nuxt dirs ([#35568](https://github.com/nuxt/nuxt/pull/35568)) - **nuxt:** Return global route for `useRoute` in detached effect scope ([#35659](https://github.com/nuxt/nuxt/pull/35659)) - **nuxt:** Ignore custom `name` or `path` when reusing an existing page in `pages:extend` ([#35661](https://github.com/nuxt/nuxt/pull/35661)) - **nuxt:** Render client components in nested server components ([#35669](https://github.com/nuxt/nuxt/pull/35669)) - **nuxt:** Preserve explicit `useFetch` method inference ([#35671](https://github.com/nuxt/nuxt/pull/35671)) - **nuxt:** Revalidate cached route payloads instead of using `force-cache` ([#35672](https://github.com/nuxt/nuxt/pull/35672)) - **nuxt:** Correct default export detection in plugin metadata ([#35676](https://github.com/nuxt/nuxt/pull/35676)) - **nuxt:** Clear hide/reset timeouts in set() ([#35534](https://github.com/nuxt/nuxt/pull/35534)) - **kit,nuxt,rspack,schema,webpack:** Add `.mts` file extension in resolver ([#33845](https://github.com/nuxt/nuxt/pull/33845)) - **nuxt:** Preserve trailing slash in NuxtLink href when unset ([#35501](https://github.com/nuxt/nuxt/pull/35501)) - **nuxt:** Don't cross-pollute useAsyncData cache on reactive key change ([#35656](https://github.com/nuxt/nuxt/pull/35656)) - **nuxt:** Filter plugin dependencies by build target ([#35682](https://github.com/nuxt/nuxt/pull/35682)) - **nuxt:** Reload real page module on HMR of JSX render-function pages ([#35678](https://github.com/nuxt/nuxt/pull/35678)) - **nuxt:** Resolve `@unhead/vue/*` from nuxt's dependency tree ([#35690](https://github.com/nuxt/nuxt/pull/35690)) - **kit:** Surface module load errors instead of masking as missing ([#35497](https://github.com/nuxt/nuxt/pull/35497)) - **nuxt:** Type auto-imported `$fetch` with nitro's `$Fetch` ([#35704](https://github.com/nuxt/nuxt/pull/35704)) - **nuxt:** Don't reference app config sources in shared and node tsconfigs ([#35673](https://github.com/nuxt/nuxt/pull/35673)) - **vite:** Resolve SSR inlined CSS module class name mismatch ([#35610](https://github.com/nuxt/nuxt/pull/35610)) - **nuxt:** Generate layout types even when pages module is disabled ([#35717](https://g _[Truncated at 4000 characters — full notes: https://github.com/nuxt/nuxt/releases/tag/v4.5.1]_ ### v4.5.0 - Date: 2026-07-18 - Version: v4.5.0 - Original notes: https://github.com/nuxt/nuxt/releases/tag/v4.5.0 - Permalink: https://whatsnew.fyi/product/nuxt/releases/v4.5.0 - **changed** — Upgrade to Vite 8 with faster cold starts and Rolldown-powered internals - **changed** — Upgrade to Rspack 2 with improved performance and lighter build output - **changed** — Rebuild Rspack builder on top of @rsbuild/core with dev server running in middleware mode - **changed** — Use Rspack-specific Vue loader for correct SSR scoped-style ids and stricter ESM resolution - **changed** — Upgrade to unhead v3, unctx v3, and switch framework build to tsdown - **added** — Introduce experimental SSR streaming mode to improve Time to First Byte by flushing HTML shell immediately and streaming body as Vue renders - **added** — Support configurable bot regex for SSR streaming and per-route streaming control via route rules - **added** — Introduce stable nuxt/* build output contract with dev exports for type-checking without build step - **added** — Add future.compatibilityVersion: 5 option to opt in to Nuxt v5 breaking changes > 4.5.0 is the next minor release. ##### 📣 Some News ###### Preparing for Nuxt 5 A good chunk of this release is (hopefully) invisible plumbing for Nuxt 5. We've moved onto the latest major versions of several core dependencies (`unhead` v3, `unctx` v3, and Vite 8), switched the framework's own build over to [`tsdown`](https://github.com/nuxt/nuxt/pull/35179), and introduced a stable `nuxt/*` build output contract with dev exports so that type-checking in the Nuxt monorepo works without a build step (#35463, #35605). Much of this is working to shrink the gap between v4 and v5 internally, so that the migration will be as boring as possible. > [!TIP] > If you want to test some of the breaking changes of Nuxt v5, you can already opt in with `future.compatibilityVersion: 5`. Keep an eye on the [Upgrade Guide](https://nuxt.com/docs/getting-started/upgrade) for details as they land. With the release of Nuxt v4.5, our focus as a team will turn to stabilising Nuxt v5 and creating compatibility utilities to make the upgrade as smooth as possible. ###### Nuxt 3 End-of-Life Nuxt 3 reaches end-of-life on **July 31, 2026**, so this is one of the last few 3.x releases we'll ship. If you're still on v3, now is a great time to move across. Most people told us the v3 to v4 upgrade was smooth, and we've kept the [upgrade guide](https://nuxt.com/docs/getting-started/upgrade) up to date. Alongside v4.5.0 we're publishing a maintenance patch for the 3.x line (**v3.21.9**) with the compatible bug fixes and smaller improvements from this release backported. The headline items here (Vite 8, Rspack 2, `unhead` v3, `unctx` v3) are major upgrades and stay v4-only, so 3.x remains stable as it approaches end-of-life. ##### 👀 Highlights Nuxt 4.5 is a big one. This release ships three major upgrades to the build layer (Vite 8, Rspack 2, and a brand new Rsbuild-powered pipeline for the Rspack builder), an experimental SSR streaming mode, a handful of new composables and conventions, and a lot of groundwork that brings us closer to Nuxt 5. There's a lot here, so grab a coffee. ☕️ ###### ⚡️ Vite 8 Nuxt now runs on [Vite 8](https://vite.dev) (#34256). This brings faster cold starts, the latest Rolldown-powered internals, and many upstream improvements from the Vite team. For most apps this is a transparent upgrade. If you have custom Vite plugins or config, it's worth skimming the [Vite migration guide](https://vite.dev/guide/migration) to check for anything that affects you. > [!WARNING] > Vite 8 is a major version bump. If you depend on Vite directly (custom plugins, `vite.config` tweaks, or ecosystem plugins that pin a Vite version), make sure those are compatible before upgrading in production. ###### 🦀 Rspack 2 and Rsbuild If you use the Rspack builder, this release is a substantial upgrade. We've moved to [Rspack 2](https://www.rspack.dev/blog/announcing-2-0) (#34929), which is faster and lighter, and rebuilt the builder on top of [`@rsbuild/core`](https://rsbuild.dev) (#35489). The public surface stays the same. You still opt in with `builder: 'rspack'` and the existing `rspack:*` hooks continue to work: ```ts // nuxt.config.ts export default defineNuxtConfig({ builder: 'rspack', }) ``` Under the hood, though, a lot has changed for the better: - The dev server now runs in middleware mode via Rsbuild, replacing `webpack-dev-middleware` and `webpack-hot-middleware` (#35575). - We use an Rspack-specific Vue loader for correct SSR scoped-style ids and stricter ESM resolution (#35566). > [!NOTE] > This is the foundation for first-class Rsbuild support. We kept the builder named `rspack` for now so nothing breaks, but the internals are now Rsbuild all the way down. ###### 🌊 Experimental SSR Streaming This is one I'm particularly excited about. You can now enable **SSR streaming** to dramatically improve Time to First Byte (#34411). Instead of buffering the whole rendered _[Truncated at 4000 characters — full notes: https://github.com/nuxt/nuxt/releases/tag/v4.5.0]_ ### v3.21.9 - Date: 2026-07-18 - Version: v3.21.9 - Original notes: https://github.com/nuxt/nuxt/releases/tag/v3.21.9 - Permalink: https://whatsnew.fyi/product/nuxt/releases/v3.21.9 - **fixed** — Use spa entry for vite-node fallback - **fixed** — Pass error as `cause` when re-throwing - **fixed** — Inline CSS for lazy components imported from `#components` - **fixed** — Validate `` fallback tag name - **fixed** — Extract server page CSS when `inlineStyles` is disabled - **fixed** — Include nested layers in nitro transforms - **fixed** — Export empty styles object with `ssr: false` - **fixed** — Emit auto-import paths as files, not directories - **fixed** — Suppress spurious slot warning in `NuxtPage` during navigation - **fixed** — Preserve backslash separators in windows named pipe path - **fixed** — Detach in-flight promise on `useAsyncData` teardown - **fixed** — Respect per-page keepalive set via `definePageMeta` - **fixed** — Align useFetch error type with runtime - **fixed** — Unwrap getter `body` in `useFetch` - **fixed** — Strip invalid webpack PURE annotations - **fixed** — Guard against -1 when unregistering a router hook - **fixed** — Clean up load/error listeners in preloadPayload - **fixed** — Avoid idle wait when refreshing data after hydration - **fixed** — Ensure `page:start` finishes before `page:finish` starts - **fixed** — Preserve plugin navigation during app boot > 3.21.9 is the next patch release. ##### 👉 Changelog [compare changes](https://github.com/nuxt/nuxt/compare/v3.21.8...v3.21.9) ###### 🩹 Fixes - **vite:** Use spa entry for vite-node fallback (3.x) ([c8410a16a](https://github.com/nuxt/nuxt/commit/c8410a16a)) - **kit,nuxt:** Pass error as `cause` when we re-throw ([#35387](https://github.com/nuxt/nuxt/pull/35387)) - **vite:** Inline CSS for lazy components imported from `#components` ([#35215](https://github.com/nuxt/nuxt/pull/35215)) - **nuxt:** Validate `` fallback tag name ([#35325](https://github.com/nuxt/nuxt/pull/35325)) - **vite:** Extract server page CSS when `inlineStyles` is disabled ([#35209](https://github.com/nuxt/nuxt/pull/35209)) - **nitro:** Include nested layers in nitro transforms ([#35327](https://github.com/nuxt/nuxt/pull/35327)) - **nitro:** Export empty styles object with `ssr: false` ([#35330](https://github.com/nuxt/nuxt/pull/35330)) - **nuxt:** Emit auto-import paths as files, not directories ([#35333](https://github.com/nuxt/nuxt/pull/35333)) - **nuxt:** Suppress spurious slot warning in `NuxtPage` during nav ([#35335](https://github.com/nuxt/nuxt/pull/35335)) - **vite:** Preserve backslash separators in windows named pipe path ([#35336](https://github.com/nuxt/nuxt/pull/35336)) - **nuxt:** Detach in-flight promise on `useAsyncData` teardown ([#35328](https://github.com/nuxt/nuxt/pull/35328)) - **nuxt:** Respect per-page keepalive set via `definePageMeta` ([#34526](https://github.com/nuxt/nuxt/pull/34526)) - **nuxt:** Align useFetch error type with runtime ([#35346](https://github.com/nuxt/nuxt/pull/35346)) - **nuxt:** Unwrap getter `body` in `useFetch` ([#35343](https://github.com/nuxt/nuxt/pull/35343)) - **rspack,webpack:** Strip invalid webpack PURE annotations ([#35386](https://github.com/nuxt/nuxt/pull/35386)) - **nuxt:** Guard against -1 when unregistering a router hook ([#35391](https://github.com/nuxt/nuxt/pull/35391)) - **nuxt:** Clean up load/error listeners in preloadPayload ([#35392](https://github.com/nuxt/nuxt/pull/35392)) - **nuxt:** Avoid idle wait when refreshing data after hydration ([#35358](https://github.com/nuxt/nuxt/pull/35358)) - **nuxt:** Ensure `page:start` finishes before `page:finish` starts ([#35408](https://github.com/nuxt/nuxt/pull/35408)) - **nuxt:** Preserve plugin navigation during app boot ([#35344](https://github.com/nuxt/nuxt/pull/35344)) - **vite:** Add extension to vite-node-runner virtual import ([e81a0c484](https://github.com/nuxt/nuxt/commit/e81a0c484)) - **nuxt:** Make virtual module IDs stable across hosts ([#35317](https://github.com/nuxt/nuxt/pull/35317)) - **nuxt:** Hash serialized island props ([#35356](https://github.com/nuxt/nuxt/pull/35356)) - **vite:** Avoid emitted ssr styles file name collisions ([#35432](https://github.com/nuxt/nuxt/pull/35432)) - **nuxt:** Avoid syncing route too early when reused page remounts ([#35440](https://github.com/nuxt/nuxt/pull/35440)) - **nuxt:** Keep nested layout on deferred route during suspended layout switch ([#35443](https://github.com/nuxt/nuxt/pull/35443)) - **vite:** Set define for `NODE_ENV` and `__VUE_PROD_DEVTOOLS__` ([#35444](https://github.com/nuxt/nuxt/pull/35444)) - **nuxt:** Restore deferred query route before page is mounted ([#35442](https://github.com/nuxt/nuxt/pull/35442)) - **nuxt:** Make islands hash backwards-compatible ([#35452](https://github.com/nuxt/nuxt/pull/35452)) - **nuxt:** Pass nuxt `rootDir` to typed-router context ([#35565](https://github.com/nuxt/nuxt/pull/35565)) - **nitro:** Only reload nitro after initial nitro build ([6ba8e26a5](https://github.com/nuxt/nuxt/commit/6ba8e26a5)) - **schema:** Enable HMR for defineNuxtComponent in JSX ([#35620](https://github.com/nuxt/nuxt/pull/35620)) - **schema:** Resolve Vite cache directory from workspace ([#35626](https://github.com/nuxt/nuxt/pull/35626)) - **nitro:** Write prerender cache files atomically ([#35619](https://github.com/nuxt/n _[Truncated at 4000 characters — full notes: https://github.com/nuxt/nuxt/releases/tag/v3.21.9]_ ### v4.4.8 - Date: 2026-06-08 - Version: v4.4.8 - Original notes: https://github.com/nuxt/nuxt/releases/tag/v4.4.8 - Permalink: https://whatsnew.fyi/product/nuxt/releases/v4.4.8 - **fixed** — Use shorter socket name for macOS with tmp fallback in vite - **fixed** — Respect type option in findPath - **fixed** — Update nuxt/scripts presets - **fixed** — Revert unhead dependency back to v2 > 4.4.8 is a hotfix release to address an issue running the dev server on MacOS. ##### 👉 Changelog [compare changes](https://github.com/nuxt/nuxt/compare/v4.4.7...v4.4.8) ###### 🩹 Fixes - **vite:** Shorter socket name for macOs with tmp fallback ([#35265](https://github.com/nuxt/nuxt/pull/35265)) - **kit:** Respect `type` option in `findPath` ([#35272](https://github.com/nuxt/nuxt/pull/35272)) - **deps:** Update nuxt/scripts presets ([905621594](https://github.com/nuxt/nuxt/commit/905621594)) - **nuxt:** Revert unhead dependency back to v2 ([e6d578fea](https://github.com/nuxt/nuxt/commit/e6d578fea)) ###### 📖 Documentation - Fix many typos ([#35266](https://github.com/nuxt/nuxt/pull/35266)) - Explain static fallback pages ([#35277](https://github.com/nuxt/nuxt/pull/35277)) - Change `null` to `undefined` in data-fetching docs to match actual types ([#35301](https://github.com/nuxt/nuxt/pull/35301)) - Fix broken internal links, useAsyncData watch type, and NuxtError type ([#35303](https://github.com/nuxt/nuxt/pull/35303)) ###### ❤️ Contributors - Daniel Roe (@danielroe) - Ali Mahmmoud (@AliMahmoudDev) - Quentin Macq (@quentinmcq) - Pranav Rajeshirke (@Pranav188) - Eduardo San Martin Morote (@posva) ### v3.21.8 - Date: 2026-06-08 - Version: v3.21.8 - Original notes: https://github.com/nuxt/nuxt/releases/tag/v3.21.8 - Permalink: https://whatsnew.fyi/product/nuxt/releases/v3.21.8 - **fixed** — Use shorter socket name for macOS with tmp fallback in Vite - **fixed** — Respect type option in findPath - **fixed** — Update nuxt/scripts presets in dependencies > 3.21.8 is a hotfix release to address an issue running the dev server on MacOS. ##### 👉 Changelog [compare changes](https://github.com/nuxt/nuxt/compare/v3.21.7...v3.21.8) ###### 🩹 Fixes - **vite:** Shorter socket name for macOs with tmp fallback ([#35265](https://github.com/nuxt/nuxt/pull/35265)) - **kit:** Respect `type` option in `findPath` ([#35272](https://github.com/nuxt/nuxt/pull/35272)) - **deps:** Update nuxt/scripts presets ([ff6b060dd](https://github.com/nuxt/nuxt/commit/ff6b060dd)) ###### 📖 Documentation - Change `null` to `undefined` in data-fetching docs to match actual types ([#35301](https://github.com/nuxt/nuxt/pull/35301)) ###### ❤️ Contributors - Daniel Roe (@danielroe) - Ali Mahmmoud (@AliMahmoudDev) - Quentin Macq (@quentinmcq) - Eduardo San Martin Morote (@posva) ### v4.4.7 - Date: 2026-06-02 - Version: v4.4.7 - Original notes: https://github.com/nuxt/nuxt/releases/tag/v4.4.7 - Permalink: https://whatsnew.fyi/product/nuxt/releases/v4.4.7 - **security** — Assign `noSSR` before deciding payload extraction in nitro - **security** — Avoid filtering out dirs with shared prefix from `allowDirs` in vite - **security** — Use resolve from `pathe` for buildCache path boundary check in nuxt - **security** — Prevent sibling-directory traversal in test component wrapper in nuxt - **security** — Pass event data to `isValid` in dev clipboard-copy listener in nitro - **security** — Validate protocols in `reloadNuxtApp` path before reload in nuxt - **security** — Prefix public asset virtuals with null byte in vite - **fixed** — Re-run `getCachedData` after initial fetch in nuxt - **fixed** — Propagate `useFetch`/`useAsyncData` factory types in nuxt - **fixed** — Close vite dev server on nuxt close in vite - **fixed** — Handle cancelling prompts to install packages in kit and nuxt - **fixed** — Avoid excluding node-context files in legacy tsconfig in kit - **fixed** — Handle missing payload in chunkError listener in nuxt - **fixed** — Await in-flight template generation when closing nuxt in nuxt - **fixed** — Clarify page and layout usage warnings in nuxt - **fixed** — Surface compilation errors when stats.toString is empty in webpack - **security** — Reject prototype-chain keys in the island registry in nuxt - **security** — Apply `isScriptProtocol` guard to `navigateTo` open option in nuxt - **security** — Prevent server-only page island from recursing via `` in nuxt > 4.4.7 is a security hotfix release. 👉 make sure to check https://github.com/nuxt/nuxt/security/advisories to view open advisories resolved by this release. ##### 👉 Changelog [compare changes](https://github.com/nuxt/nuxt/compare/v4.4.6...v4.4.7) ###### 🩹 Fixes - **nitro:** Assign `noSSR` before deciding payload extraction ([#35108](https://github.com/nuxt/nuxt/pull/35108)) - **vite:** Avoid filtering out dirs with shared prefix from `allowDirs` ([#35112](https://github.com/nuxt/nuxt/pull/35112)) - **nuxt:** Use resolve from `pathe` for buildCache path boundary check ([#35111](https://github.com/nuxt/nuxt/pull/35111)) - **nuxt:** Prevent sibling-directory traversal in test component wrapper ([#35110](https://github.com/nuxt/nuxt/pull/35110)) - **nitro:** Pass event data to `isValid` in dev clipboard-copy listener ([#35109](https://github.com/nuxt/nuxt/pull/35109)) - **nuxt:** Validate protocols in `reloadNuxtApp` path before reload ([#35115](https://github.com/nuxt/nuxt/pull/35115)) - **vite:** Prefix public asset virtuals with null byte ([9e303b438](https://github.com/nuxt/nuxt/commit/9e303b438)) - **nuxt:** Re-run `getCachedData` after initial fetch ([#35122](https://github.com/nuxt/nuxt/pull/35122)) - **nuxt:** Propagate `useFetch`/`useAsyncData` factory types ([#35133](https://github.com/nuxt/nuxt/pull/35133)) - **vite:** Close vite dev server on nuxt close ([a10a68abc](https://github.com/nuxt/nuxt/commit/a10a68abc)) - **kit,nuxt:** Handle cancelling prompts to install packages ([e84813229](https://github.com/nuxt/nuxt/commit/e84813229)) - **kit:** Avoid excluding node-context files in legacy tsconfig ([#35152](https://github.com/nuxt/nuxt/pull/35152)) - **nuxt:** Handle missing payload in chunkError listener ([#35155](https://github.com/nuxt/nuxt/pull/35155)) - **nuxt:** Await in-lifght template generation when closing nuxt ([#35181](https://github.com/nuxt/nuxt/pull/35181)) - **nuxt:** Clarify page and layout usage warnings ([#35184](https://github.com/nuxt/nuxt/pull/35184)) - **webpack:** Surface compilation errors when stats.toString is empty ([073b07851](https://github.com/nuxt/nuxt/commit/073b07851)) - **nuxt:** Reject prototype-chain keys in the island registry ([#35205](https://github.com/nuxt/nuxt/pull/35205)) - **nuxt:** Apply `isScriptProtocol` guard to `navigateTo` open option ([#35206](https://github.com/nuxt/nuxt/pull/35206)) - **nuxt:** Prevent server-only page island from recursing via `` ([#35198](https://github.com/nuxt/nuxt/pull/35198)) - **rspack,webpack:** Require loopback host when missing same-origin signals ([#35200](https://github.com/nuxt/nuxt/pull/35200)) - **nitro:** Gate chrome devtools workspace endpoint to local requests ([#35201](https://github.com/nuxt/nuxt/pull/35201)) - **nuxt:** Escape props in `` ssr output ([#35199](https://github.com/nuxt/nuxt/pull/35199)) - **kit:** Improve TS extension stripping/substitutions ([#35233](https://github.com/nuxt/nuxt/pull/35233)) - **nuxt:** Preserve `.d.mts`/`.d.cts` in `resolveTypePaths` ([#35235](https://github.com/nuxt/nuxt/pull/35235)) - **nuxt:** Escape `