Nuxt v3.21.3

nuxt/nuxt
Share
Summary
Nuxt v3.21.3 introduces performance improvements with batch-resolved TypeScript paths and VFS for manifest handling. It also includes multiple bug fixes, such as handling negative zero in user trace slices, improving loading indicator cleanup, and ensuring proper response status checks before payload parsing.

Full release notes

3.21.3 is the next patch release. v3.21.4 was published with no changes due to an issue running the release script for v3.21.3.

👉 Changelog

compare changes

🔥 Performance

  • nuxt: Batch-resolve typescript hoist paths with cached base roots (#34862)
  • vite,webpack: Use vfs for manifest + vite node server (#34666)

🩹 Fixes

  • nuxt: Handle negative zero in getUserTrace slice boundary (#34524)
  • nuxt: Signal error state and clear timers in loading indicator cleanup (#34523)
  • nuxt: Fix broken hook cleanup in route announcer (#34525)
  • nuxt: Filter clearNuxtState key enumeration by useState prefix (#34541)
  • nuxt: Correct useFetch cache options type (#34551)
  • nuxt: Prevent in-flight requests from overwriting cleared async data (#34553)
  • nuxt: Check response status before parsing payload (#34555)
  • nuxt: Handle TS type assertions on member expression callees in keyed functions parser (#34558)
  • nitro: Resolve h3 export path in nitro vfs (#34566)
  • nitro: Use hash-based cache for dev payloads (#34569)
  • nuxt: Await parcel watcher subscription before registering close hook (#34573)
  • nuxt: Self-remove hydration error guards after first navigation (#34572)
  • nuxt: Mark portal properties as configurable (#34574)
  • nuxt: Retry manifest fetch after transient failure (#34570)
  • kit: Add PackagePreset type to addImportsSources (#34582)
  • nuxt: Avoid any return type from callHookWith in vue:setup (#34584)
  • nuxt: Strip DevOnly components with attributes in production builds (#34585)
  • nuxt: Move parcel watcher debug timer outside subscription loop (#34590)
  • nuxt: Preserve falsy prop values in NuxtTime data attribute serialization (#34600)
  • nuxt: Clear cached rejected promise in callOnce (#34614)
  • nitro: Set __buildAssetsURL before server entry import (#34607)
  • nuxt: Use consistent [nuxt] prefix in console warnings (#34668)
  • nitro: Do not add import condition for ssr resolve conditions (#34739)
  • rspack,webpack: Emit styles.mjs when inline styles off (#34697)
  • nuxt: Fix FormData body hashing in useFetch deduplication key (#34546)
  • nuxt,nitro: Add Symbol serialization for dev server logs (#34575)
  • vite: Ensure leading slash in /@fs URLs for Windows (#34810)
  • vite: Preserve server-origin errors and surface them via Youch (#34820)
  • nuxt: Fix callOnce navigation mode alternating execution (#34718)
  • schema,rspack,webpack: Respect configured test option (#34827)
  • nitro: Restore 'import' condition for ssr resolve (247254652)
  • nuxt: Propagate unexpected errors from isDirectorySync (#34900)
  • nitro: Re-encode ssrContext.url to match vue-router (#34902)
  • vite: Remove obsolete writeDevServer + handle vite-node precomputed (c45b45b9c)
  • nitro: Avoid double-decoding of url (93e731ba3)
  • nuxt: Sync _route when navigating up the route tree (#34918)
  • nuxt: Skip <NuxtPage> cached vnode when its suspense is unmounted (#34899)
  • nitro: Only recommend payload extraction when ssr is enabled (#34924)
  • nuxt: Flatten buffer before filtering promises and fix rendering of content (#34863)
  • nuxt: Avoid transforming NuxtTeleportIslandComponent with nuxt-client directive (#34817)
  • nuxt: Resolve layer aliases in css files (#34940)
  • nuxt: Invoke user-supplied error handler when suppressing render errors (#34938)

📖 Documentation

  • Document that component props are sent in query string (1bf4fa87c)
  • Fix page:loading:start description to match implementation (#34617)
  • Add missing jsdoc strings (30a9a49aa)
  • Work around upstream bun bug (#34792)
  • Use new object boolean syntax when prefetchOn interaction (#34825)
  • Remove @nuxt/scripts from core modules roadmap (#34835)
  • Remove @nuxt/hints from core modules roadmap (#34867)
  • Correct URL (#34907)
  • Set NODE_ENV to production in deployment examples (#34937)

🏡 Chore

  • Do not ship devDependencies when publishing (07f05c1a2)
  • Remove unused field 🤦 (5644951b5)
  • Remove explicit copilot instructions (240721d38)
  • Use single renovate PR for 3.x and 4.x branches (8193a6025)
  • Use top level vulnerabilityAlerts config (1975bf748)
  • Dedupe security update prs after update (df17b0aec)
  • Throttle per host to reduce rate limits in link checking (#34488)
  • Drop redundant as const (#34909)
  • Pin typescript (e94ed7ac5)

✅ Tests

  • Use toThrow instead of toThrowError (60d5c8d21)
  • Reduce matrices in ci (#34704)
  • Add scroll behavior tests for fixed page key with scrollToTop (#34761)
  • Update deprecated error assertions (9ba7ca7b6)

🤖 CI

  • Ensure latest tag is published first + manual oidc exchange for dist-tag (7339257f8)
  • Add bot workflow (#34677)
  • Fix bot label (a222917b2)
  • Don't run ossf workflow on 4.x branch (c183f341b)
  • Add agent-scan workflow (#34681)
  • Correct renovate bot name in workflow (#34708)
  • Correct dependabot bot name in workflow (#34709)
  • Drop stackblitz link issue commenter (884ab3757)
  • Inline actions triggered by labels into triage actions (124f65c5f)
  • Update workflows to use renamed type labels (#34933)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • Sébastien Chopin (@atinux)
  • John (@zecar)
  • Eduardo San Martin Morote (@posva)
  • Florian Heuberger (@Flo0806)
  • abeer0 (@iiio2)
  • karl (@krlctrl)
  • Ori (@oritwoen)
  • Kilisei (@kilisei)
  • Anthony Fu (@antfu)
  • Matej Černý (@cernymatej)
  • Bochkarev Ivan (@Ibochkarev)
  • Matteo Gabriele (@MatteoGabriele)
  • Julien Huang (@huang-julien)
  • Yoshihiro Yamaguchi (@yamachi4416)
  • antlis (@antlis)
  • Om Mishra (@howwohmm)
  • Louis Ramos (@wJoenn)
  • xjccc (@xjccc)

Latest Nuxt releases

All releases

Latest articles about Nuxt

Oops! I gave Nuxt permissions to delete files

Oops! I gave Nuxt permissions to delete files

Program With Erik

Nuxt 3 hits End Of Life

Nuxt 3 hits End Of Life

Certificates.dev

Nuxt 4.5 SSR Streaming Is Kind of a Big Deal

Nuxt 4.5 SSR Streaming Is Kind of a Big Deal

Program With Erik

How to Set Up an MCP Server for an Existing Nuxt App

How to Set Up an MCP Server for an Existing Nuxt App

Michael Hoffmann