Zum Inhalt springen
verdict:

Nuxt 4.5.0

notable

note: die Zusammenfassung und die Release Notes sind auf Englisch

warning: Eingriff nötig

2 Breaking Changes4 Kernpunkte

Nuxt 4.5.0 brings Vite 8, experimental SSR streaming and stable error codes, but unhead v3 may cause type errors.

Zusammenfassung · nur aus den Release Notes · claude-haiku-5-5 · prompt v7

breaking changesalle zitiert, jeder mit einer Lösung

breaking[1]: unhead v3 tightens the types of useHead, so code relying on the looser v2 types can get type errors.

> unhead v3 introduces type-narrowing for useHead, which can be a **breaking type change** if you were relying on the looser v2 types. The runtime behaviour is compatible for the vast majority of apps, and promise input (deprecated in v2) is no longer supported. If you hit type errors after upgrading, they're almost always genuine tightening rather than regressions.

help: After upgrading, fix any type errors reported for useHead; the notes say these are almost always genuine tightening rather than regressions.

breaking[2]: Promise input to useHead, deprecated in v2, is no longer supported.

> unhead v3 introduces type-narrowing for useHead, which can be a **breaking type change** if you were relying on the looser v2 types. The runtime behaviour is compatible for the vast majority of apps, and promise input (deprecated in v2) is no longer supported. If you hit type errors after upgrading, they're almost always genuine tightening rather than regressions.

help: The notes give no migration. Check your useHead calls for promise input and pass resolved values instead.

Kernpunkte

release-notesgithub.com/nuxt/nuxt · 604 Zeilen
  1. > 4.5.0 is the next minor release.
  2. ## 📣 Some News
  3. #### Preparing for Nuxt 5
  4. 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).
  5. Much of this is working to shrink the gap between v4 and v5 internally, so that the migration will be as boring as possible.
  6. > [!TIP]
  7. > 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.
  8. 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.
  9. #### Nuxt 3 End-of-Life
  10. 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.
  11. 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.
  12. ## 👀 Highlights
  13. 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.
  14. There's a lot here, so grab a coffee. ☕️
  15. ### ⚡️ Vite 8
  16. 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.
  17. 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.
  18. > [!WARNING]
  19. > 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.
  20. ### 🦀 Rspack 2 and Rsbuild
  21. 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).
  22. The public surface stays the same. You still opt in with `builder: 'rspack'` and the existing `rspack:*` hooks continue to work:
  23. ```ts
  24. // nuxt.config.ts
  25. export default defineNuxtConfig({
  26. builder: 'rspack',
  27. })
  28. ```
  29. Under the hood, though, a lot has changed for the better:
  30. - The dev server now runs in middleware mode via Rsbuild, replacing `webpack-dev-middleware` and `webpack-hot-middleware` (#35575).
  31. - We use an Rspack-specific Vue loader for correct SSR scoped-style ids and stricter ESM resolution (#35566).
  32. > [!NOTE]
  33. > 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.
  34. ### 🌊 Experimental SSR Streaming
  35. 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 page and sending it in one go, Nuxt flushes the HTML shell (your `<head>`, styles, preload hints, and entry scripts) immediately, then streams the body as Vue renders it.
  36. ```ts
  37. // nuxt.config.ts
  38. export default defineNuxtConfig({
  39. experimental: {
  40. ssrStreaming: true,
  41. },
  42. })
  43. ```
  44. Streaming is automatically disabled for bots and crawlers so search engines still receive fully-rendered HTML. You can tune which user agents count as crawlers, and you can opt individual routes out:
  45. ```ts
  46. // nuxt.config.ts
  47. export default defineNuxtConfig({
  48. experimental: {
  49. ssrStreaming: {
  50. botRegex: /googlebot|bingbot|my-internal-crawler/i,
  51. },
  52. },
  53. routeRules: {
  54. '/no-stream/**': { streaming: false },
  55. },
  56. })
  57. ```
  58. There's one thing worth understanding before you turn it on. Because streaming commits the HTTP status and headers with the very first byte, anything that mutates the response *after* rendering has begun (a `setResponseStatus()` in a `<script setup>`, a cookie write during middleware, and so on) can't reach the client. Nuxt handles the common cases for you: routes with `redirect`, `cache`, `isr`, `swr`, `noScripts`, or `ssr: false` rules automatically fall back to the buffered renderer, and in development we log a warning naming any dropped mutations so nothing fails silently.
  59. > [!WARNING]
  60. > SSR streaming is experimental and off by default. It could be great for content-heavy routes where TTFB matters, but test it against your app's response-mutating logic (status codes, headers, cookies) before shipping it widely. The [experimental features docs](https://nuxt.com/docs/guide/going-further/experimental-features#ssrstreaming) cover the fallback rules and caveats in detail.
  61. 📖 [SSR streaming documentation](https://nuxt.com/docs/guide/going-further/experimental-features#ssrstreaming)
  62. ### 🩺 Stable Error Codes
  63. This one I'm really happy about. Nuxt now has a **stable error code system** (#35429). Warnings and errors raised during build and at runtime now carry a stable code (like `NUXT_E1001` or `NUXT_B5001`), a short explanation of **why** it happened, and a concrete **fix** to try.
  64. Every code is greppable and bookmarkable, and the ones that need more than a one-line fix link straight to a dedicated docs page. For example, the classic "a composable was called outside a Nuxt context" now surfaces as `NUXT_E1001` with the why/fix inline and a [docs page](https://nuxt.com/docs/errors/e1001) explaining the context rules and how to use `runWithContext()`.
  65. To keep production output lean, the verbose why/fix text is stripped from production builds, leaving just the stable code.
  66. This is the foundation for much better error messages across Nuxt, and we'll keep migrating existing warnings and errors onto it over the coming releases. If you've ever squinted at a cryptic Nuxt message, this is for you.
  67. ### 🎨 `useLayout` Composable
  68. There's a new `useLayout` composable for reading the layout that's been resolved for the current route (#35623). Previously there was no clean, reactive way to ask "which layout is this page using?" from within a component.
  69. ```vue
  70. <!-- app/components/LayoutBadge.vue -->
  71. <script setup lang="ts">
  72. const layout = useLayout()
  73. </script>
  74. <template>
  75. <span>Current layout: {{ layout }}</span>
  76. </template>
  77. ```
  78. It returns a read-only computed ref, so it stays in sync as you navigate or as route rules and `definePageMeta` change the resolved layout.
  79. 📖 [`useLayout` documentation](https://nuxt.com/docs/api/composables/use-layout)
  80. ### 🪟 Named Views
  81. Nuxt now supports **named views** through a filename convention (#35123). If a parent page renders more than one `<NuxtPage>` outlet, you can give each outlet a name and provide a sibling page file for it using the `name@view.vue` convention:
  82. ```bash
  83. # Directory Structure
  84. -| pages/
  85. ---| parent/
  86. -----| child.vue
  87. -----| child@sidebar.vue
  88. ---| parent.vue
  89. ```
  90. ```vue
  91. <!-- pages/parent.vue -->
  92. <template>
  93. <div>
  94. <NuxtPage />
  95. <aside>
  96. <NuxtPage name="sidebar" />
  97. </aside>
  98. </div>
  99. </template>
  100. ```
  101. Navigating to `/parent/child` renders `child.vue` into the default outlet and `child@sidebar.vue` into the `sidebar` outlet. This has actually been possible in Vue Router for a long time; this release wires it up to Nuxt's file-based routing.
  102. > [!NOTE]
  103. > `definePageMeta` is read from the default route file only, and per-view rendering modes aren't supported (the parent page's mode applies to the default view).
  104. 📖 [Named views documentation](https://nuxt.com/docs/guide/directory-structure/app/pages#named-views)
  105. ### 🚦 `enabled` Option for `useFetch` and `useAsyncData`
  106. You can now gate data fetching with a reactive `enabled` option ([#33260](https://github.com/nuxt/nuxt/pull/33260)). While `enabled` is `false`, every execution is blocked (the initial fetch, `execute`/`refresh`, and watch triggers), and if you flip it from `true` to `false` mid-flight, the in-flight request is cancelled without clearing your existing `data`.
  107. ```vue [app/pages/search.vue]
  108. <script setup lang="ts">
  109. const query = ref('')
  110. const { data } = await useFetch('/api/search', {
  111. query: { q: query },
  112. // Only fetch once the user has typed something
  113. enabled: () => query.value.length > 2,
  114. })
  115. </script>
  116. ```
  117. This is perfect for dependent or conditional queries, where you don't want to fire a request until some precondition is met. It pairs naturally with a getter or a ref, so it stays reactive.
  118. 📖 [`useAsyncData` documentation](https://nuxt.com/docs/api/composables/use-async-data)
  119. ### 🔗 `NuxtLink` Prefetch Control for Custom Slots
  120. When you use `<NuxtLink>` with the `custom` prop, Nuxt no longer attaches prefetch handlers for you, because it can't know how you've structured your markup. To make that ergonomic, the slot now exposes everything you need to wire prefetching up yourself (#34539):
  121. ```vue
  122. <template>
  123. <NuxtLink
  124. v-slot="{ href, navigate, prefetch, prefetched, shouldPrefetch }"
  125. to="/about"
  126. custom
  127. >
  128. <a
  129. :href="href"
  130. :class="{ 'is-prefetched': prefetched }"
  131. @click="navigate"
  132. @pointerenter="shouldPrefetch('interaction') && prefetch()"
  133. @focus="shouldPrefetch('interaction') && prefetch()"
  134. >
  135. About page
  136. </a>
  137. </NuxtLink>
  138. </template>
  139. ```
  140. You get `prefetch` to trigger it, `prefetched` to know whether it's already happened (great for a prefetched class), and `shouldPrefetch` to respect the user's connection and config.
  141. 📖 [`NuxtLink` documentation](https://nuxt.com/docs/api/components/nuxt-link)
  142. ### ⚡️ Forwarded Preload Hints on Prefetch
  143. Here's another one we'd love you to try. When you prefetch a link to a route with payload extraction, Nuxt already primes the destination's data and chunks. With the new opt-in `experimental.prefetchPreloadTags` (#35144), it also forwards the destination's `<link rel="preload">` and `modulepreload` hints (whatever the page sets via `useHead`, or via modules like `@nuxt/image`'s `<NuxtImg preload>`) into the *current* document, downgraded to `rel="prefetch"` so they don't compete with the resources the user is looking at right now.
  144. ```ts
  145. // nuxt.config.ts
  146. export default defineNuxtConfig({
  147. experimental: {
  148. prefetchPreloadTags: true,
  149. },
  150. })
  151. ```
  152. The practical effect is that heavy above-the-fold assets on the *next* page (a hero image, a critical script) start downloading while the user is still on the current one, so the navigation feels instant. It's off by default while we gather feedback, so please give it a spin and tell us how it behaves on your app.
  153. ### 🌐 `import.meta.envName`
  154. The resolved Nuxt environment name is now available at runtime as `import.meta.envName` for both Vite and webpack/Rspack builds (#34844). This is the value set by `--envName` (or the resolved default), so you can branch on it in your app code:
  155. ```ts
  156. if (import.meta.envName === 'staging') {
  157. // enable staging-only behaviour
  158. }
  159. ```
  160. 📖 [`import.meta` documentation](https://nuxt.com/docs/api/advanced/import-meta)
  161. ### 🔭 Tracing Channels for SSR Events
  162. Nuxt now publishes [diagnostics-channel](https://nodejs.org/api/diagnostics_channel.html) traces for its server-side subsystems (#35191). It's unopinionated: we emit `nuxt.render`, `nuxt.island`, `nuxt.data`, and `nuxt.plugin` channels following the [untracing](https://github.com/unjs/untracing) naming convention, and you can build OpenTelemetry (or anything else) on top. It works in Node, Deno, Bun, and Cloudflare Workers.
  163. ```ts
  164. // nuxt.config.ts
  165. export default defineNuxtConfig({
  166. // Turn on Nuxt's own channels
  167. tracingChannel: true,
  168. })
  169. ```
  170. You can also enable it granularly. In Nuxt v5, there will be additional Nitro-level channels:
  171. ```ts
  172. // nuxt.config.ts
  173. export default defineNuxtConfig({
  174. tracingChannel: {
  175. nuxt: true,
  176. },
  177. })
  178. ```
  179. > [!NOTE]
  180. > Channel names, payload shapes, and option keys may still change while the [untracing](https://github.com/unjs/untracing) registry settles.
  181. ### 📦 Dependency Upgrades
  182. #### `unhead` v3
  183. Nuxt's head management now runs on [`unhead` v3](https://unhead.unjs.io/docs/releases/v3) (#34793). It's smaller, uses a synchronous engine internally, and ships better type-safety for `useHead` out of the box. This also unblocks SSR streaming.
  184. > [!WARNING]
  185. > `unhead` v3 introduces type-narrowing for `useHead`, which can be a **breaking type change** if you were relying on the looser v2 types. The runtime behaviour is compatible for the vast majority of apps, and promise input (deprecated in v2) is no longer supported. If you hit type errors after upgrading, they're almost always genuine tightening rather than regressions.
  186. #### `unctx` v3
  187. We've moved to [`unctx` v3](https://github.com/unjs/unctx) (#35541), which resolves a class of long-standing async context issues (#33644). This is part of the composable-context reliability work that continues into v5.
  188. #### And more
  189. We've also updated `magic-string` to v1, Babel to v8, and pulled in the latest Rolldown across the board. Running `nuxt upgrade --dedupe` (see below) is the easiest way to pull these through cleanly.
  190. ### 🛠️ Nuxt CLI
  191. This release bundles some improvements from `@nuxt/cli` v3.36 and v3.37:
  192. - **`nuxt module remove`** to uninstall a module and clean up its config ([nuxt/cli#1306](https://github.com/nuxt/cli/pull/1306)), the natural companion to `nuxt module add`.
  193. - **Non-interactive `nuxt init`** for scripting and CI ([nuxt/cli#1341](https://github.com/nuxt/cli/pull/1341)), plus it now respects the template's own package manager instead of prompting ([nuxt/cli#1330](https://github.com/nuxt/cli/pull/1330)).
  194. - **Type-check onboarding**: `nuxt typecheck` now offers to install `vue-tsc` and `typescript` for you if they're missing ([nuxt/cli#1316](https://github.com/nuxt/cli/pull/1316)).
  195. - **Golar support for type-checking**: `nuxt typecheck` can now use [Golar](https://golar.dev) as an alternative to `vue-tsc` ([nuxt/cli#1362](https://github.com/nuxt/cli/pull/1362)). It's picked up automatically if it's installed (or a `golar.config.*` file exists), and you can force a checker with `--checker=vue-tsc` or `--checker=golar`:
  196. ```sh
  197. nuxt typecheck --checker=golar
  198. ```
  199. - **Layer-aware dev server**: the dev server now reloads on changes to local layer `nuxt.config` files ([nuxt/cli#1345](https://github.com/nuxt/cli/pull/1345)).
  200. ### 🧩 TypeScript Plugin and Named Layout Slots
  201. Nuxt's experimental TypeScript plugin is powered by [`@dxup/nuxt`](https://github.com/KazariEX/dxup), and this release bundles a newer version of it. If you haven't tried it, turning on `experimental.typescriptPlugin` gives you a set of editor niceties: renaming an auto-imported component updates every usage, plus go-to-definition for glob imports, Nitro routes, `definePageMeta`, `runtimeConfig`, and typed route names.
  202. New in the bundled version is an opt-in **runtime** feature: named layout slots ([KazariEX/dxup#20](https://github.com/KazariEX/dxup/pull/20)). You can write a top-level named-slot template in a page and have it forwarded into the matching named slot of the active layout. That lets a page inject content into its layout's slots, which file-based layouts don't otherwise allow.
  203. Enable it alongside the plugin:
  204. ```ts
  205. // nuxt.config.ts
  206. export default defineNuxtConfig({
  207. experimental: {
  208. typescriptPlugin: true,
  209. },
  210. dxup: {
  211. features: {
  212. namedLayoutSlots: true,
  213. },
  214. },
  215. })
  216. ```
  217. Then a layout can expose named slots:
  218. ```vue
  219. <!-- layouts/center.vue -->
  220. <template>
  221. <slot />
  222. <slot name="side" one="one" />
  223. </template>
  224. ```
  225. And any page using that layout can fill them:
  226. ```vue
  227. <!-- pages/about.vue -->
  228. <script setup lang="ts">
  229. definePageMeta({ layout: 'center' })
  230. </script>
  231. <template>
  232. <template #side="{ one }">
  233. This "{{ one }}" comes from the layout slot.
  234. </template>
  235. <div>About page</div>
  236. </template>
  237. ```
  238. 📖 [`typescriptPlugin` documentation](https://nuxt.com/docs/guide/going-further/experimental-features#typescriptplugin)
  239. ### 🔥 Performance and Reliability
  240. As always, a lot of work has gone into making Nuxt faster and steadier.
  241. One you can opt into today is the **shared file watcher** (#35143). Vite already runs a chokidar-based watcher, so Nuxt can piggy-back on it instead of spinning up a second one, using less memory and fewer file handles. This becomes the default with `compatibilityVersion: 5`, but you can turn it on now and let us know how it goes:
  242. ```ts
  243. // nuxt.config.ts
  244. export default defineNuxtConfig({
  245. experimental: {
  246. watcher: 'builder',
  247. },
  248. })
  249. ```
  250. There are also some other good performance improvements that don't need to be opted into:
  251. - **Faster dev startup**: dev-only Nitro and pages work is now deferred and streamlined (#35381, #35383).
  252. - **Leaner production builds**: the island-renderer chunk is skipped entirely when you use no islands (#35456), and plugin handling is tree-shaken out of prod builds (#35278).
  253. - **Improved island hashing**: more stable island and key hashing, with `getIslandHash` and `hashKey` now exposed (#35583).
  254. - **Concurrency and I/O wins** across Kit path resolution and Nitro inline styles (#35511, #35514).
  255. A couple of other nice quality-of-life fixes:
  256. - `$fetch` is now auto-imported in user code, which fixes edge cases with top-level `$fetch.create` under Rolldown's output format (#35581).
  257. - Nuxt now honours system `HTTP_PROXY` / `HTTPS_PROXY` environment variables in the builder environment (#35183).
  258. - HMR now works for `defineNuxtComponent` in JSX (#35620).
  259. ### ⚠️ Heads-Up Before Upgrading
  260. As mentioned above, this release includes three major dependency bumps. For most apps they're transparent, but they're worth a moment of attention:
  261. - **Vite 8**: check custom Vite plugins and config against the [Vite migration guide](https://vite.dev/guide/migration).
  262. - **Rspack 2**: if you use `builder: 'rspack'`, the internals are now Rsbuild-based, so custom Rspack config may need review.
  263. - **`unhead` v3**: possible breaking *type* changes from stricter `useHead` typing.
  264. ### ⬆️ Upgrading
  265. Our recommendation for upgrading is to run:
  266. ```sh
  267. npx nuxt upgrade --dedupe
  268. # or, if you are staying on the 3.x line
  269. npx nuxt@latest upgrade --dedupe --channel=v3
  270. ```
  271. This will deduplicate your lockfile and help ensure you pull in updates from the other dependencies Nuxt relies on, particularly across the unjs ecosystem (which matters more than usual this release, given the major bumps).
  272. > [!TIP]
  273. > Check out our [upgrade guide](https://nuxt.com/docs/getting-started/upgrade) if you're upgrading from an older version.
  274. Thank you to all of the many contributors to this release. This was a big one, and it wouldn't happen without you. 💚
  275. ## 👉 Changelog
  276. [compare changes](https://github.com/nuxt/nuxt/compare/v4.4.8...v4.5.0)
  277. ### 🚀 Enhancements
  278. - **rspack:** Upgrade to rspack v2 ([#34929](https://github.com/nuxt/nuxt/pull/34929))
  279. - **nuxt:** Migrate to unhead v3 ([#34793](https://github.com/nuxt/nuxt/pull/34793))
  280. - **nuxt:** Support named views via filename convention ([#35123](https://github.com/nuxt/nuxt/pull/35123))
  281. - **nuxt:** Expose environment name on `import.meta` ([#34844](https://github.com/nuxt/nuxt/pull/34844))
  282. - **nuxt:** Forward destination preload hints on link prefetch ([#35144](https://github.com/nuxt/nuxt/pull/35144))
  283. - **nuxt:** Honour http proxy env vars in builder environment ([#35183](https://github.com/nuxt/nuxt/pull/35183))
  284. - **kit:** Support `allowImportingTsExtensions` ([87c214b34](https://github.com/nuxt/nuxt/commit/87c214b34))
  285. - **nitro,nuxt,schema:** Add experimental SSR streaming ([5f4efe5a5](https://github.com/nuxt/nuxt/commit/5f4efe5a5))
  286. - **vite:** Migrate to Vite 8 ([#34256](https://github.com/nuxt/nuxt/pull/34256))
  287. - **nitro,nuxt:** Add support for tracing channels for ssr events ([#35191](https://github.com/nuxt/nuxt/pull/35191))
  288. - **kit,nitro,nuxt,schema,vite,webpack:** `nuxt/*` build output contract ([#35463](https://github.com/nuxt/nuxt/pull/35463))
  289. - **nuxt:** Expose `NuxtLink` prefetch props for custom slot ([#34539](https://github.com/nuxt/nuxt/pull/34539))
  290. - **rspack:** Use rspack-specific Vue loader ([a085e8e34](https://github.com/nuxt/nuxt/commit/a085e8e34))
  291. - **rspack:** Use rspack-specific Vue loader ([#35566](https://github.com/nuxt/nuxt/pull/35566))
  292. - **nuxt,vite:** Attach vite HMR to the shared dev server listener ([a8ea0c7e2](https://github.com/nuxt/nuxt/commit/a8ea0c7e2))
  293. - **nuxt:** Add `enabled` option to AsyncData ([#33260](https://github.com/nuxt/nuxt/pull/33260))
  294. - **rspack:** Use rsbuild dev server in middleware mode ([#35575](https://github.com/nuxt/nuxt/pull/35575))
  295. - **nuxt:** Expose `getIslandHash` + `hashKey` + improve hash for keys ([#35583](https://github.com/nuxt/nuxt/pull/35583))
  296. - **nuxt:** Add `useLayout` composable for accessing the resolved route layout ([#35623](https://github.com/nuxt/nuxt/pull/35623))
  297. - **nuxt:** Support `enabled` option in `useFetch` ([#35627](https://github.com/nuxt/nuxt/pull/35627))
  298. - Error code system ([#35429](https://github.com/nuxt/nuxt/pull/35429))
  299. - **nuxt:** Require keyed function 'source' with compatibilityVersion 5 ([d56662647](https://github.com/nuxt/nuxt/commit/d56662647))
  300. - **kit:** Order layer aliases before generic root aliases (`~`, `@`) ([#35641](https://github.com/nuxt/nuxt/pull/35641))
  301. - **kit:** Add `updateAppConfig` util for module authors ([#35651](https://github.com/nuxt/nuxt/pull/35651))
  302. - **nuxt:** Warn when parent page lacks NuxtPage ([#35639](https://github.com/nuxt/nuxt/pull/35639))
  303. ### 🔥 Performance
  304. - **nuxt,vite:** Reuse vite watcher via `experimental.watcher` ([#35143](https://github.com/nuxt/nuxt/pull/35143))
  305. - **nuxt:** Tree-shake unneeded plugin handling from prod builds ([#35278](https://github.com/nuxt/nuxt/pull/35278))
  306. - **nuxt:** Defer dev-only nitro startup work ([#35381](https://github.com/nuxt/nuxt/pull/35381))
  307. - **nuxt:** Reduce dev pages startup work ([#35383](https://github.com/nuxt/nuxt/pull/35383))
  308. - **vite:** Skip unnecessary decorator transforms ([#35395](https://github.com/nuxt/nuxt/pull/35395))
  309. - **nuxt,rspack,vite,webpack:** Migrate to `rolldown-string` ([#35058](https://github.com/nuxt/nuxt/pull/35058))
  310. - **nitro,nuxt,vite:** Remove unused dependencies ([#34861](https://github.com/nuxt/nuxt/pull/34861))
  311. - **nuxt:** Re-parse transformed file once in tree-shake plugin ([#35509](https://github.com/nuxt/nuxt/pull/35509))
  312. - **nuxt:** Index scanned components by name to avoid quadratic lookup ([#35510](https://github.com/nuxt/nuxt/pull/35510))
  313. - **kit:** Stat paths directly and probe extensions in parallel ([#35511](https://github.com/nuxt/nuxt/pull/35511))
  314. - **nitro:** Load inline style chunks concurrently ([#35514](https://github.com/nuxt/nuxt/pull/35514))
  315. - **nuxt:** Skip island-renderer chunk when no islands used ([#35456](https://github.com/nuxt/nuxt/pull/35456))
  316. ### 🩹 Fixes
  317. - **nuxt:** Fix explicit return types of factory types ([40a80ec7d](https://github.com/nuxt/nuxt/commit/40a80ec7d))
  318. - **vite:** Do not await `ready` event for vite watcher ([6fe539f52](https://github.com/nuxt/nuxt/commit/6fe539f52))
  319. - **vite:** Invalidate modules for legacy vite server ([#35315](https://github.com/nuxt/nuxt/pull/35315))
  320. - **kit,nuxt:** Pass error as `cause` when we re-throw ([#35387](https://github.com/nuxt/nuxt/pull/35387))
  321. - **nuxt:** Make virtual module IDs stable across hosts ([#35317](https://github.com/nuxt/nuxt/pull/35317))
  322. - **vite:** Inline CSS for lazy components imported from `#components` ([#35215](https://github.com/nuxt/nuxt/pull/35215))
  323. - **nuxt:** Validate `<ClientOnly>` fallback tag name ([#35325](https://github.com/nuxt/nuxt/pull/35325))
  324. - **vite:** Extract server page CSS when `inlineStyles` is disabled ([#35209](https://github.com/nuxt/nuxt/pull/35209))
  325. - **nitro:** Include nested layers in nitro transforms ([#35327](https://github.com/nuxt/nuxt/pull/35327))
  326. - **kit:** Don't exclude layer module runtime files from app tsconfig ([#35326](https://github.com/nuxt/nuxt/pull/35326))
  327. - **nitro:** Export empty styles object with `ssr: false` ([#35330](https://github.com/nuxt/nuxt/pull/35330))
  328. - **nuxt:** Emit auto-import paths as files, not directories ([#35333](https://github.com/nuxt/nuxt/pull/35333))
  329. - **nuxt:** Suppress spurious slot warning in `NuxtPage` during nav ([#35335](https://github.com/nuxt/nuxt/pull/35335))
  330. - **vite:** Preserve backslash separators in windows named pipe path ([#35336](https://github.com/nuxt/nuxt/pull/35336))
  331. - **nuxt:** Detach in-flight promise on `useAsyncData` teardown ([#35328](https://github.com/nuxt/nuxt/pull/35328))
  332. - **nuxt:** Respect per-page keepalive set via `definePageMeta` ([#34526](https://github.com/nuxt/nuxt/pull/34526))
  333. - **nuxt:** Align useFetch error type with runtime ([#35346](https://github.com/nuxt/nuxt/pull/35346))
  334. - **nuxt:** Unwrap getter `body` in `useFetch` ([#35343](https://github.com/nuxt/nuxt/pull/35343))
  335. - **rspack,webpack:** Strip invalid webpack PURE annotations ([#35386](https://github.com/nuxt/nuxt/pull/35386))
  336. - **nuxt:** Guard against -1 when unregistering a router hook ([#35391](https://github.com/nuxt/nuxt/pull/35391))
  337. - **nuxt:** Clean up load/error listeners in preloadPayload ([#35392](https://github.com/nuxt/nuxt/pull/35392))
  338. - **nuxt:** Avoid idle wait when refreshing data after hydration ([#35358](https://github.com/nuxt/nuxt/pull/35358))
  339. - **nuxt:** Hash serialized island props ([#35356](https://github.com/nuxt/nuxt/pull/35356))
  340. - **nuxt:** Ensure `page:start` finishes before `page:finish` starts ([#35408](https://github.com/nuxt/nuxt/pull/35408))
  341. - **vite:** Invalidate lazily-created SSR modules on render ([#35410](https://github.com/nuxt/nuxt/pull/35410))
  342. - **nuxt:** Preserve plugin navigation during app boot ([#35344](https://github.com/nuxt/nuxt/pull/35344))
  343. - **vite:** Invalidate stale SSR virtual modules on render ([#35413](https://github.com/nuxt/nuxt/pull/35413))
  344. - **nitro:** Don't preload JS for lazy-hydrated components ([#35342](https://github.com/nuxt/nuxt/pull/35342))
  345. - **vite:** Add extension to vite-node-runner virtual specifier ([0bf3f1d5d](https://github.com/nuxt/nuxt/commit/0bf3f1d5d))
  346. - **vite:** Invalidate ssr copy of regenerated templates ([33a581ce7](https://github.com/nuxt/nuxt/commit/33a581ce7))
  347. - **vite:** Set define for `NODE_ENV` and `__VUE_PROD_DEVTOOLS__` ([#35444](https://github.com/nuxt/nuxt/pull/35444))
  348. - **vite:** Avoid emitted ssr styles file name collisions ([#35432](https://github.com/nuxt/nuxt/pull/35432))
  349. - **nuxt:** Avoid syncing route too early when reused page remounts ([#35440](https://github.com/nuxt/nuxt/pull/35440))
  350. - **nuxt:** Skip showing route errors for crawlers ([#35411](https://github.com/nuxt/nuxt/pull/35411))
  351. - **nuxt:** Keep nested layout on deferred route during suspended layout switch ([#35443](https://github.com/nuxt/nuxt/pull/35443))
  352. - **nuxt:** Restore deferred query route before page is mounted ([#35442](https://github.com/nuxt/nuxt/pull/35442))
  353. - **kit,nuxt:** Resolve auto-import type paths through shared resolver ([#35451](https://github.com/nuxt/nuxt/pull/35451))
  354. - **nuxt:** Make islands hash backwards-compatible ([#35452](https://github.com/nuxt/nuxt/pull/35452))
  355. - **vite:** Give ssr its own hmr websocket port on vite 8.1 ([#35458](https://github.com/nuxt/nuxt/pull/35458))
  356. - **nuxt:** Auto-import `$fetch` where possible ([#35581](https://github.com/nuxt/nuxt/pull/35581))
  357. - **nuxt:** Update unctx to v3 ([#35541](https://github.com/nuxt/nuxt/pull/35541))
  358. - **nitro:** Point cache driver at `.mjs` runtime output ([#35263](https://github.com/nuxt/nuxt/pull/35263))
  359. - **nuxt:** Add `head.push` for client side ([#35498](https://github.com/nuxt/nuxt/pull/35498))
  360. - **nitro:** Only reload nitro after initial nitro build ([30a573733](https://github.com/nuxt/nuxt/commit/30a573733))
  361. - **nuxt:** Pass nuxt `rootDir` to typed-router context ([#35565](https://github.com/nuxt/nuxt/pull/35565))
  362. - **nuxt:** Type `__nuxt_error` marker on `NuxtError` ([06e976d2e](https://github.com/nuxt/nuxt/commit/06e976d2e))
  363. - **kit:** `noUncheckedSideEffectImports` (v5) + disable `libReplacement` ([#35548](https://github.com/nuxt/nuxt/pull/35548))
  364. - **nuxt:** Node10 compatible subpath exports ([a216d732d](https://github.com/nuxt/nuxt/commit/a216d732d))
  365. - **nuxt:** Unwrap module mutation trackers from options after installing ([#35574](https://github.com/nuxt/nuxt/pull/35574))
  366. - **nuxt:** Entity-encode redirect body to preserve query separators ([#35486](https://github.com/nuxt/nuxt/pull/35486))
  367. - **rspack,webpack:** Use async entry in dev to avoid circular import ([#35586](https://github.com/nuxt/nuxt/pull/35586))
  368. - **nuxt:** Tolerate missing dirs in parcel watcher ([#35585](https://github.com/nuxt/nuxt/pull/35585))
  369. - **nuxt:** Respect saved scroll position on same-page back navigation from hash ([#35608](https://github.com/nuxt/nuxt/pull/35608))
  370. - **nuxt:** Resolve unctx helper to an absolute path for server bundling ([#35602](https://github.com/nuxt/nuxt/pull/35602))
  371. - **nuxt:** Apply `unctx` transform marker through `magic-string` ([#35618](https://github.com/nuxt/nuxt/pull/35618))
  372. - **schema:** Enable HMR for defineNuxtComponent in JSX ([#35620](https://github.com/nuxt/nuxt/pull/35620))
  373. - **nuxt:** Evict stale forwarded prefetch hints and fix key mismatch ([#35621](https://github.com/nuxt/nuxt/pull/35621))
  374. - **nuxt:** Re-add computeIslandHash for backwards compatibility ([353164bb5](https://github.com/nuxt/nuxt/commit/353164bb5))
  375. - **nitro:** Correct nitro runtime config type key ([bc3b53add](https://github.com/nuxt/nuxt/commit/bc3b53add))
  376. - **schema:** Resolve Vite cache directory from workspace ([#35626](https://github.com/nuxt/nuxt/pull/35626))
  377. - **nitro:** Externalise dev SSR entry to avoid slow rollup re-parse ([ff42c54a7](https://github.com/nuxt/nuxt/commit/ff42c54a7))
  378. - **nuxt:** Drop extension on diagnostics import ([c699cc0de](https://github.com/nuxt/nuxt/commit/c699cc0de))
  379. - **nitro:** Write prerender cache files atomically ([#35619](https://github.com/nuxt/nuxt/pull/35619))
  380. - **nitro:** Don't import `node:process` in diagnostics ([d73b5df6d](https://github.com/nuxt/nuxt/commit/d73b5df6d))
  381. - **nuxt:** Apply latest navigation on concurrent `navigateTo` in built-in router ([#35631](https://github.com/nuxt/nuxt/pull/35631))
  382. - **nuxt:** Update client URL to match SSR on fatal middleware error ([#35637](https://github.com/nuxt/nuxt/pull/35637))
  383. ### 💅 Refactors
  384. - **nitro,nuxt:** Add explicit return types to runtime files ([#35139](https://github.com/nuxt/nuxt/pull/35139))
  385. - **nuxt:** Resolve builder earlier + skip watcher for `nuxt prepare` ([#35141](https://github.com/nuxt/nuxt/pull/35141))
  386. - **nuxt:** Delete cleared keys in `clearNuxtData` & `clearNuxtState` ([#35142](https://github.com/nuxt/nuxt/pull/35142))
  387. - **nuxt:** Use jiti `fsCache` instead of deprecated `cache` ([#35268](https://github.com/nuxt/nuxt/pull/35268))
  388. - **nitro:** Use walkResolver instead of deprecated resolveUnrefHeadInput ([#35267](https://github.com/nuxt/nuxt/pull/35267))
  389. - **nuxt:** Add type predicates ([#35208](https://github.com/nuxt/nuxt/pull/35208))
  390. - **vite:** Type vite-node-runner error data and resolve `#vite-node` types from source ([#35334](https://github.com/nuxt/nuxt/pull/35334))
  391. - **nuxt:** Split head runtime plugin by environment ([#35389](https://github.com/nuxt/nuxt/pull/35389))
  392. - **nuxt:** Use `rolldown/utils` instead of oxc-* dependencies ([#34983](https://github.com/nuxt/nuxt/pull/34983))
  393. - **kit,vite,webpack,nitro,schema:** `ssrStyles` build output => lazy code provider ([#35601](https://github.com/nuxt/nuxt/pull/35601))
  394. - **nuxt,nitro:** Use dev exports for no-build type-checking ([#35605](https://github.com/nuxt/nuxt/pull/35605))
  395. - **rspack:** Use `rsbuild` to power rspack builder ([#35489](https://github.com/nuxt/nuxt/pull/35489))
  396. - **vite:** Extract TemplateHMRPlugin from DevServerPlugin ([#35579](https://github.com/nuxt/nuxt/pull/35579))
  397. ### 📖 Documentation
  398. - Add builder guide ([#35576](https://github.com/nuxt/nuxt/pull/35576))
  399. - Correct and improve `useAsyncData` and `useFetch` ([#35528](https://github.com/nuxt/nuxt/pull/35528))
  400. - Improving testing documentation for better understanding ([#35526](https://github.com/nuxt/nuxt/pull/35526))
  401. - Fix incorrect transform signature in useAsyncData/useFetch type docs ([#35403](https://github.com/nuxt/nuxt/pull/35403))
  402. - Add minimal version badges to API documentation ([#34485](https://github.com/nuxt/nuxt/pull/34485))
  403. - Clarify usage of await with useFetch ([#33745](https://github.com/nuxt/nuxt/pull/33745))
  404. - Add badges for new features ([1839fe01d](https://github.com/nuxt/nuxt/commit/1839fe01d))
  405. - Remove `enabled` from `useFetch` docs ([bf7810600](https://github.com/nuxt/nuxt/commit/bf7810600))
  406. - Add tip about prerendering registration for pages ([#35635](https://github.com/nuxt/nuxt/pull/35635))
  407. - Clarify that `useFetch` keys are unique per call site ([#35645](https://github.com/nuxt/nuxt/pull/35645))
  408. - Clarify useFetch custom data error ([#35647](https://github.com/nuxt/nuxt/pull/35647))
  409. ### 📦 Build
  410. - Use `tsdown` to build project ([#35179](https://github.com/nuxt/nuxt/pull/35179))
  411. ### 🏡 Chore
  412. - Update lockfile ([92087005f](https://github.com/nuxt/nuxt/commit/92087005f))
  413. - Handle cleaning nuxt build dist manually ([aaafe9879](https://github.com/nuxt/nuxt/commit/aaafe9879))
  414. - Upgrade oxc/tsdown/rolldown deps together ([28173926d](https://github.com/nuxt/nuxt/commit/28173926d))
  415. - Use `vp` in nightly release script ([97b56d98d](https://github.com/nuxt/nuxt/commit/97b56d98d))
  416. - Update lockfile for tsdown build and dev exports ([5d9cd2d67](https://github.com/nuxt/nuxt/commit/5d9cd2d67))
  417. - Update bundle size snapshots ([b9d353516](https://github.com/nuxt/nuxt/commit/b9d353516))
  418. - Allow node version updates ([#35297](https://github.com/nuxt/nuxt/pull/35297))
  419. - Update bundle size ([d37b13b60](https://github.com/nuxt/nuxt/commit/d37b13b60))
  420. ### ✅ Tests
  421. - Strip host path from server bundle before measuring size ([#35316](https://github.com/nuxt/nuxt/pull/35316))
  422. - Run playwright tests in dev mode too ([#35329](https://github.com/nuxt/nuxt/pull/35329))
  423. - **nuxt:** Benchmark dev `loadNuxt` startup ([#35382](https://github.com/nuxt/nuxt/pull/35382))
  424. - Update bundle size snapshot ([64a834281](https://github.com/nuxt/nuxt/commit/64a834281))
  425. - Use h3 v1 syntax in test ([1ea2eec07](https://github.com/nuxt/nuxt/commit/1ea2eec07))
  426. - Use `experimental.attachDebugInfo` ([7c2397ae6](https://github.com/nuxt/nuxt/commit/7c2397ae6))
  427. - Update assertions ([55f7ea025](https://github.com/nuxt/nuxt/commit/55f7ea025))
  428. - Pack with pnpm before running attw to honour publishConfig ([e2f0dd69d](https://github.com/nuxt/nuxt/commit/e2f0dd69d))
  429. - Reduce flakiness on hydration tests ([#35457](https://github.com/nuxt/nuxt/pull/35457))
  430. - Improve test stability on macos ([#35462](https://github.com/nuxt/nuxt/pull/35462))
  431. - Force disable `test` mode for bundle size tests ([#35558](https://github.com/nuxt/nuxt/pull/35558))
  432. - Pin typescript in basic-types fixture to dedupe vue ([a3b824918](https://github.com/nuxt/nuxt/commit/a3b824918))
  433. - **webpack:** Cover Vue loader scope hashes ([824daffa0](https://github.com/nuxt/nuxt/commit/824daffa0))
  434. - **builders:** Clean up Vue loader fixtures ([ca18affc3](https://github.com/nuxt/nuxt/commit/ca18affc3))
  435. - Reenable webpack/rspack dev tests ([#35571](https://github.com/nuxt/nuxt/pull/35571))
  436. - Await `expectNoClientErrors` ([9f3123f60](https://github.com/nuxt/nuxt/commit/9f3123f60))
  437. - Mark tests as succeeding for rspack/webpack ([513ad306e](https://github.com/nuxt/nuxt/commit/513ad306e))
  438. - Add support for non-ascii filenames in public assets ([#35636](https://github.com/nuxt/nuxt/pull/35636))
  439. - Minify server bundles in bundle size snapshot ([#35638](https://github.com/nuxt/nuxt/pull/35638))
  440. - Run matrix-independent suites once across the fixture matrix ([#35646](https://github.com/nuxt/nuxt/pull/35646))
  441. - Mark webpack/rspack tests as passing on 4.x ([3ae095b29](https://github.com/nuxt/nuxt/commit/3ae095b29))
  442. ### 🤖 CI
  443. - Reenable bundle size tests 😱 ([#35279](https://github.com/nuxt/nuxt/pull/35279))
  444. - Only run workflow in nuxt org ([#35377](https://github.com/nuxt/nuxt/pull/35377))
  445. - Skip entire job, not just step ([#35378](https://github.com/nuxt/nuxt/pull/35378))
  446. - Error handling for webhook triggers ([#35379](https://github.com/nuxt/nuxt/pull/35379))
  447. - Update agentscan ([#35397](https://github.com/nuxt/nuxt/pull/35397))
  448. - Only run benchmark tests in Nuxt org ([#35414](https://github.com/nuxt/nuxt/pull/35414))
  449. - Don't auto-close team prs 🫣 ([cd965f569](https://github.com/nuxt/nuxt/commit/cd965f569))
  450. - Use vite-plus to manage pnpm ([#35570](https://github.com/nuxt/nuxt/pull/35570))
  451. - Use parallel keyword for concurrent workflow steps ([#35448](https://github.com/nuxt/nuxt/pull/35448))
  452. - Handle missing base branch (for stacked prs) ([8d3daa34e](https://github.com/nuxt/nuxt/commit/8d3daa34e))
  453. - Unlink issues from autoclosed PRs ([#35615](https://github.com/nuxt/nuxt/pull/35615))
  454. ### ❤️ Contributors
  455. - Jordan Labrosse (@Jorgagu)
  456. - Luke Nelson (@luc122c)
  457. - Florian Heuberger (@Flo0806)
  458. - Daniel Roe (@danielroe)
  459. - Yannik Schröder (@yschroe)
  460. - Mateleo (@Mateleo)
  461. - Matej Černý (@cernymatej)
  462. - Eduardo San Martin Morote (@posva)
  463. - Darlan José Batista do Prado (@DarlanPrado)
  464. - Ulrich-Matthias Schäfer (@Fuzzyma)
  465. - Bochkarev Ivan (@Ibochkarev)
  466. - Julien Huang (@huang-julien)
  467. - Damian Głowala (@DamianGlowala)
  468. - KazariAI (@KazariAI)
  469. - Fahad Khan (@oniChan1226)
  470. - skoenfaelt (@skoenfaelt)
  471. - Cynthia Rey (@cyyynthia)
  472. - meomking (@CaptainWang98)
  473. - antlis (@antlis)
  474. - Néstor (@Nsttt)
  475. - Issayah (@VividLemon)
  476. - Alexander Lichter (@TheAlexLichter)
  477. - Anoesj Sadraee (@Anoesj)
  478. - Quentin Macq (@quentinmcq)
  479. - raminjafary (@raminjafary)
  480. - Kurt Medley (@HeavyMedl)
  481. - isksss (@isksss)
  482. - Matteo Gabriele (@MatteoGabriele)
  483. - Max (@onmax)
  484. - Harlan Wilton (@harlan-zw)

auf github ansehenimported 2026-09-28 über npm