v3.21.9
nuxt
View on GitHubView PackagePublished: Jul 18, 2026

Release Notes

3.21.9 is the next patch release.

👉 Changelog

compare changes

🩹 Fixes

  • vite: Use spa entry for vite-node fallback (3.x) (c8410a16a)
  • kit,nuxt: Pass error as cause when we re-throw (#35387)
  • vite: Inline CSS for lazy components imported from #components (#35215)
  • nuxt: Validate <ClientOnly> fallback tag name (#35325)
  • vite: Extract server page CSS when inlineStyles is disabled (#35209)
  • nitro: Include nested layers in nitro transforms (#35327)
  • nitro: Export empty styles object with ssr: false (#35330)
  • nuxt: Emit auto-import paths as files, not directories (#35333)
  • nuxt: Suppress spurious slot warning in NuxtPage during nav (#35335)
  • vite: Preserve backslash separators in windows named pipe path (#35336)
  • nuxt: Detach in-flight promise on useAsyncData teardown (#35328)
  • nuxt: Respect per-page keepalive set via definePageMeta (#34526)
  • nuxt: Align useFetch error type with runtime (#35346)
  • nuxt: Unwrap getter body in useFetch (#35343)
  • rspack,webpack: Strip invalid webpack PURE annotations (#35386)
  • nuxt: Guard against -1 when unregistering a router hook (#35391)
  • nuxt: Clean up load/error listeners in preloadPayload (#35392)
  • nuxt: Avoid idle wait when refreshing data after hydration (#35358)
  • nuxt: Ensure page:start finishes before page:finish starts (#35408)
  • nuxt: Preserve plugin navigation during app boot (#35344)
  • vite: Add extension to vite-node-runner virtual import (e81a0c484)
  • nuxt: Make virtual module IDs stable across hosts (#35317)
  • nuxt: Hash serialized island props (#35356)
  • vite: Avoid emitted ssr styles file name collisions (#35432)
  • nuxt: Avoid syncing route too early when reused page remounts (#35440)
  • nuxt: Keep nested layout on deferred route during suspended layout switch (#35443)
  • vite: Set define for NODE_ENV and __VUE_PROD_DEVTOOLS__ (#35444)
  • nuxt: Restore deferred query route before page is mounted (#35442)
  • nuxt: Make islands hash backwards-compatible (#35452)
  • nuxt: Pass nuxt rootDir to typed-router context (#35565)
  • nitro: Only reload nitro after initial nitro build (6ba8e26a5)
  • schema: Enable HMR for defineNuxtComponent in JSX (#35620)
  • schema: Resolve Vite cache directory from workspace (#35626)
  • nitro: Write prerender cache files atomically (#35619)
  • nuxt: Apply latest navigation on concurrent navigateTo in built-in router (#35631)

📖 Documentation

  • Improving testing documentation for better understanding (#35526)
  • Add tip about prerendering registration for pages (#35635)
  • Clarify useFetch custom data error (#35647)
  • Drop reference to non-existent section (bd1943d04)
  • Update link to /3.x slug (71bdb972d)

🏡 Chore

  • Allow node version updates (#35297)

✅ Tests

  • Assert dev css delivery transport for server pages (9851e993b)
  • Count only render-blocking stylesheet links for page styles (b0e895a7f)
  • Await expectNoClientErrors (afffe7f09)

🤖 CI

  • Handle missing base branch (for stacked prs) (13a933f8a)
  • Unlink issues from autoclosed PRs (#35615)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • Florian Heuberger (@Flo0806)
  • Mateleo (@Mateleo)
  • Luke Nelson (@luc122c)
  • Darlan José Batista do Prado (@DarlanPrado)
  • Julien Huang (@huang-julien)
  • skoenfaelt (@skoenfaelt)
  • Anoesj Sadraee (@Anoesj)
  • raminjafary (@raminjafary)
  • Kurt Medley (@HeavyMedl)
  • isksss (@isksss)
  • Alexander Lichter (@TheAlexLichter)
  • Damian Głowala (@DamianGlowala)
  • Sami El Achi (@samiashi)