Skip to content

fix(init): use template's package manager instead of prompting - #1330

Merged
danielroe merged 7 commits into
mainfrom
fix/init-package-manager-mismatch
Jun 17, 2026
Merged

danielroe merged 7 commits into
mainfrom
fix/init-package-manager-mismatch

Conversation

@benjamincanac

@benjamincanac benjamincanac commented Jun 3, 2026

Copy link
Copy Markdown
Member

Summary

Closes #1187.

Some starter templates (e.g. the Nuxt UI starter) ship pinned to a package manager — a packageManager field in package.json (like pnpm@x), a lockfile (pnpm-lock.yaml) and/or workspace/config markers (pnpm-workspace.yaml, .yarnrc.yml). The nuxi init package manager prompt is seeded from npm_config_user_agent, not the template, so picking a different one leaves the project in a broken state: a stale lockfile, a mismatched packageManager field, and workspace config that no longer applies.

Rather than cloning the template and stripping those files after the fact (which can silently break a template that relies on its workspace config), this respects the template's choice:

  • detects the template's package manager via nypm's detectPackageManager, scoped to the template dir (includeParentDirs: false, ignoreArgv: true)
  • when the template pins one, uses it and skips the package manager prompt — the template is left untouched
  • an explicit --packageManager still takes precedence, with a warning when it conflicts with the template's pin (its lockfile/config may no longer match)
  • when the template pins nothing, behaves as before (prompt, or use --packageManager)

This makes shipping a template that works across package managers a choice for the template author (ship it without a lockfile), as discussed in the PR thread.

Test plan

  • reworked packages/nuxi/test/unit/commands/init.spec.ts to cover detection from a lockfile, from the packageManager field, and the no-pin case
  • pnpm test

@benjamincanac
benjamincanac requested a review from danielroe as a code owner June 3, 2026 10:58
@pkg-pr-new

pkg-pr-new Bot commented Jun 3, 2026

Copy link
Copy Markdown
  • nuxt-cli-playground

    npm i https://pkg.pr.new/create-nuxt@1330
    
    npm i https://pkg.pr.new/nuxi@1330
    
    npm i https://pkg.pr.new/@nuxt/cli@1330
    

commit: aa340fe

@atinux atinux left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving as I was involved in pair-programming on this one 😊

@coderabbitai

coderabbitai Bot commented Jun 3, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR detects and respects a downloaded template's pinned package manager during project initialization. A new exported detectTemplatePackageManager helper scopes nypm's detection to the template directory, returning the pinned package manager name or undefined. The init command now calls this helper before resolving the user's package manager choice: if the user explicitly provides --packageManager, it is used with a warning if it differs from the template; if no explicit choice is provided and the template pins a package manager, that choice is auto-selected and logged; otherwise the user is prompted as before. Unit tests verify detection of pnpm via lockfile, yarn via package.json field, and undefined when no package manager is pinned.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: detecting and using the template's package manager instead of prompting the user.
Linked Issues check ✅ Passed The PR detects the template's package manager via nypm and auto-selects it when pinned, directly addressing issue #1187's core requirement to prevent template package manager configurations from conflicting with the init process.
Out of Scope Changes check ✅ Passed All changes are scoped to the init command logic and its unit tests; no unrelated files or functionality have been modified.
Description check ✅ Passed The PR description is directly related to the changeset, explaining the motivation, implementation, and testing for auto-detecting and respecting template package managers in the init command.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/init-package-manager-mismatch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codspeed

codspeed Bot commented Jun 3, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 2 untouched benchmarks


Comparing fix/init-package-manager-mismatch (aa340fe) with main (1c7c55c)

Open in CodSpeed

@danielroe

Copy link
Copy Markdown
Member

is there a reason you don't want to remove the lockfile from the template?

if it is because it contains workspace config

@benjamincanac

Copy link
Copy Markdown
Member Author

Templates may ship with a hardcoded `packageManager` field (e.g. `pnpm@x`),
a lockfile and marker files (`pnpm-workspace.yaml`) that don't match the
package manager the user picks during `nuxi init`. Detect the template's
package manager and, on mismatch, drop its lockfile, marker files and the
`packageManager` field so the install generates a fresh, correct lockfile.

Co-Authored-By: Sébastien Chopin <atinux@gmail.com>
@benjamincanac
benjamincanac force-pushed the fix/init-package-manager-mismatch branch from 5b51db0 to e44e97e Compare June 3, 2026 12:59
@danielroe

Copy link
Copy Markdown
Member

I mean, in the repository which is the template, rather than in nuxt/cli.

@benjamincanac

benjamincanac commented Jun 3, 2026

Copy link
Copy Markdown
Member Author

Well yes all Nuxt UI templates are deployed on Vercel: https://github.com/nuxt-ui-templates/dashboard. I use renovate to keep the deps up-to-date on a weekly basis to make sure they continue working. It wouldn't be possible without a lockfile.

@danielroe

Copy link
Copy Markdown
Member

it feels like the right fix is to ship a template without a lockfile in the first place, rather than remove it after the fact when nuxt/cli clones it.

I understand you deploy it, and that's great, but how about deploying it without a lockfile? (that way you're always on the latest versions?) or you could have a separate branch or folder which didn't contain the lockfile.

but it's about more than the lockfile. for example, if your pnpm-workspace.yaml contains workspaces configuration, the template would be silently broken after install when this is gone. properly speaking we would need to adapt this configuration to npm workspaces or bun workspaces.

the same might be true for other things and makes me wonder if we're approaching this the wrong way round by 'fixing' it in nuxt/cli. even if we make it work for that particular nuxt/ui template, I'm not sure it would be desired behaviour in general

@benjamincanac

benjamincanac commented Jun 3, 2026

Copy link
Copy Markdown
Member Author

I don't think it's a good idea to ship a template without a lockfile, first of all it's not practical in development and since any release can break it is not a good experience for the user. It is fine for a starter with a nuxt dependency but not for real world applications like https://chat-template.nuxt.dev/ for example.

This PR only removes the lockfile when the user chooses a different package manager than the one defined in the template.

Should I close this then?

@atinux

atinux commented Jun 3, 2026

Copy link
Copy Markdown
Member

Actually, most of the templates listed on https://nuxt.com/templates or https://hub.nuxt.com/templates also have lock files as this is the most convenient for any developers building a template.

The case of a very specific workspace is very rare IMO, but we could display a (recommended) if we detect the lock file in the template but let the user chose a different package manager, would that work @danielroe ?

@danielroe
danielroe requested a review from pi0 June 5, 2026 08:44
@danielroe

danielroe commented Jun 10, 2026

Copy link
Copy Markdown
Member

I think the right solution is to ship templates without lockfiles, rather than normalising it after the fact at clone time ...

if you want to deploy or test them with lockfiles, I recommend having templates located in subfolders of a repo, with the lockfile outside the template folders.

alternatively, we could simply avoid asking the user what package manager they want if one is already configured in the template they are cloning.

@atinux

atinux commented Jun 11, 2026

Copy link
Copy Markdown
Member

I think the right solution is to ship templates without lockfiles, rather than normalising it after the fact at clone time ...

There may be a gap in understanding around our ecosystem, how demos are built, and how quickly we want the community to be able to use the template/demo.

Some of our demos/templates have lockfiles: nuxt/hackernews, nuxt/movies

If the issue is about deleting the files, in that case I think the potential solutions are:

  1. avoid asking the user the package manager, let hir deal with it after the installation
  2. have the possibility to clone repos and filter out the lock files (idea from @pi0)

@danielroe

Copy link
Copy Markdown
Member

I think the right approach for now is to avoid prompting for package manager choice if lock files are present in the template.

then it is a choice on the provider of the template whether they want to provide a template that works in different package managers - or not.

When a template pins a package manager (via a lockfile, marker file or
`packageManager` field), use it instead of prompting the user. Switching
package managers would leave a stale lockfile or workspace config behind
and silently break the project, so respecting the template's choice is
left to its author. An explicit `--packageManager` still wins, with a
warning when it conflicts with the template.
@benjamincanac benjamincanac changed the title fix(init): align template package manager with user selection fix(init): use template's package manager instead of prompting Jun 17, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/nuxi/src/commands/init.ts (1)

150-157: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Non-interactive validation blocks the new template auto-selection path

Line 152 requires --packageManager before template detection runs, so the new fallback on Line 384-Line 387 is unreachable in no-TTY flows. This breaks the intended behavior for CI/agents when the template already pins a package manager.

Suggested fix
-const nonInteractiveRequiredArgs = ['dir', 'template', 'packageManager', 'gitInit'] as const
+const nonInteractiveRequiredArgs = ['dir', 'template', 'gitInit'] as const

Then, after templatePackageManager is resolved:

+    if (isNonInteractive && !packageManagerOptions.includes(packageManagerArg) && !templatePackageManager) {
+      await showUsage(ctx.cmd)
+      logger.error(`Non-interactive terminal detected. Missing required arguments: ${colors.cyan('--packageManager')}`)
+      process.exit(2)
+    }

Also applies to: 367-387

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/nuxi/src/commands/init.ts` around lines 150 - 157, The
non-interactive validation in the isNonInteractive block checks for
packageManager in nonInteractiveRequiredArgs before the template detection logic
runs, making the packageManager auto-selection fallback at lines 384-387
unreachable in no-TTY flows. Move the packageManager validation check to occur
after templatePackageManager is resolved so that when a template pins a package
manager, that resolved value can be used as a fallback instead of failing the
validation upfront.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@packages/nuxi/src/commands/init.ts`:
- Around line 150-157: The non-interactive validation in the isNonInteractive
block checks for packageManager in nonInteractiveRequiredArgs before the
template detection logic runs, making the packageManager auto-selection fallback
at lines 384-387 unreachable in no-TTY flows. Move the packageManager validation
check to occur after templatePackageManager is resolved so that when a template
pins a package manager, that resolved value can be used as a fallback instead of
failing the validation upfront.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a2529ed6-dca8-4926-ace6-5a19aa0b8970

📥 Commits

Reviewing files that changed from the base of the PR and between 2d240b0 and dab8fd5.

📒 Files selected for processing (2)
  • packages/nuxi/src/commands/init.ts
  • packages/nuxi/test/unit/commands/init.spec.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/nuxi/test/unit/commands/init.spec.ts

In non-interactive mode, only require `--packageManager` upfront when no
template is given. When a template is provided, defer the check until
after its package manager is resolved so a template that pins one can be
used as the fallback. If neither an explicit flag nor a template pin is
available, error after detection instead of failing upfront.
Validate an explicitly provided `--packageManager` up front so a typo
errors with a clear message instead of being silently ignored once the
template's own package manager is detected.
@benjamincanac
benjamincanac requested a review from atinux June 17, 2026 14:55
@benjamincanac

Copy link
Copy Markdown
Member Author

@danielroe I've applied your suggestions!

@danielroe danielroe left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❤️

@danielroe
danielroe merged commit df3d042 into main Jun 17, 2026
19 checks passed
@danielroe
danielroe deleted the fix/init-package-manager-mismatch branch June 17, 2026 16:22
This was referenced Jun 17, 2026
@danielroe danielroe mentioned this pull request Jul 18, 2026
antoinezanardi added a commit to antoinezanardi/goat-it-web-admin that referenced this pull request Jul 27, 2026
> ℹ️ **Note**
>
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [nuxt](https://nuxt.com)
([source](https://redirect.github.com/nuxt/nuxt/tree/HEAD/packages/nuxt))
| [`^4.4.8` →
`^4.5.1`](https://renovatebot.com/diffs/npm/nuxt/4.4.8/4.5.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/nuxt/4.5.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/nuxt/4.4.8/4.5.1?slim=true)
|

---

### Release Notes

<details>
<summary>nuxt/nuxt (nuxt)</summary>

###
[`v4.5.1`](https://redirect.github.com/nuxt/nuxt/releases/tag/v4.5.1)

> ⚠️ **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://redirect.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://redirect.github.com/nuxt/nuxt/security/advisories).

##### 👉 Changelog

[compare
changes](https://redirect.github.com/nuxt/nuxt/compare/v4.5.0...v4.5.1)

##### 🔥 Performance

- **nitro:** Replace island teleports in a single html pass
([#&#8203;35515](https://redirect.github.com/nuxt/nuxt/pull/35515))
- **nuxt:** Add `vue.optionsApi` and disable it for v5+
([#&#8203;35791](https://redirect.github.com/nuxt/nuxt/pull/35791))
- **nuxt:** Without pages, skip client plugins that require routing
([#&#8203;35794](https://redirect.github.com/nuxt/nuxt/pull/35794))
- **nuxt:** Skip payload revival plugin when `ssr: false`
([#&#8203;35782](https://redirect.github.com/nuxt/nuxt/pull/35782))

##### 🩹 Fixes

- **nitro:** Read rspack dev output fs lazily for server entry
([#&#8203;35740](https://redirect.github.com/nuxt/nuxt/pull/35740))
- **rspack,webpack:** Resolve loaders and runtime deps from nuxt dirs
([#&#8203;35568](https://redirect.github.com/nuxt/nuxt/pull/35568))
- **nuxt:** Return global route for `useRoute` in detached effect scope
([#&#8203;35659](https://redirect.github.com/nuxt/nuxt/pull/35659))
- **nuxt:** Ignore custom `name` or `path` when reusing an existing page
in `pages:extend`
([#&#8203;35661](https://redirect.github.com/nuxt/nuxt/pull/35661))
- **nuxt:** Render client components in nested server components
([#&#8203;35669](https://redirect.github.com/nuxt/nuxt/pull/35669))
- **nuxt:** Preserve explicit `useFetch` method inference
([#&#8203;35671](https://redirect.github.com/nuxt/nuxt/pull/35671))
- **nuxt:** Revalidate cached route payloads instead of using
`force-cache`
([#&#8203;35672](https://redirect.github.com/nuxt/nuxt/pull/35672))
- **nuxt:** Correct default export detection in plugin metadata
([#&#8203;35676](https://redirect.github.com/nuxt/nuxt/pull/35676))
- **nuxt:** Clear hide/reset timeouts in set()
([#&#8203;35534](https://redirect.github.com/nuxt/nuxt/pull/35534))
- **kit,nuxt,rspack,schema,webpack:** Add `.mts` file extension in
resolver
([#&#8203;33845](https://redirect.github.com/nuxt/nuxt/pull/33845))
- **nuxt:** Preserve trailing slash in NuxtLink href when unset
([#&#8203;35501](https://redirect.github.com/nuxt/nuxt/pull/35501))
- **nuxt:** Don't cross-pollute useAsyncData cache on reactive key
change
([#&#8203;35656](https://redirect.github.com/nuxt/nuxt/pull/35656))
- **nuxt:** Filter plugin dependencies by build target
([#&#8203;35682](https://redirect.github.com/nuxt/nuxt/pull/35682))
- **nuxt:** Reload real page module on HMR of JSX render-function pages
([#&#8203;35678](https://redirect.github.com/nuxt/nuxt/pull/35678))
- **nuxt:** Resolve `@unhead/vue/*` from nuxt's dependency tree
([#&#8203;35690](https://redirect.github.com/nuxt/nuxt/pull/35690))
- **kit:** Surface module load errors instead of masking as missing
([#&#8203;35497](https://redirect.github.com/nuxt/nuxt/pull/35497))
- **nuxt:** Type auto-imported `$fetch` with nitro's `$Fetch`
([#&#8203;35704](https://redirect.github.com/nuxt/nuxt/pull/35704))
- **nuxt:** Don't reference app config sources in shared and node
tsconfigs
([#&#8203;35673](https://redirect.github.com/nuxt/nuxt/pull/35673))
- **vite:** Resolve SSR inlined CSS module class name mismatch
([#&#8203;35610](https://redirect.github.com/nuxt/nuxt/pull/35610))
- **nuxt:** Generate layout types even when pages module is disabled
([#&#8203;35717](https://redirect.github.com/nuxt/nuxt/pull/35717))
- **nitro:** Skip resource hints for stylesheets already rendered as
blocking links
([#&#8203;35691](https://redirect.github.com/nuxt/nuxt/pull/35691))
- **kit:** Dedupe layers that are both auto-scanned and explicitly
extended
([#&#8203;35712](https://redirect.github.com/nuxt/nuxt/pull/35712))
- **nuxt:** Don't apply scroll behaviour after a subsequent nav
([#&#8203;35719](https://redirect.github.com/nuxt/nuxt/pull/35719))
- **vite:** Ensure server sourcemap-preserver plugin actually runs
([#&#8203;35680](https://redirect.github.com/nuxt/nuxt/pull/35680))
- **vite:** Preserve css suffix when extracting ssr inline styles
([#&#8203;35714](https://redirect.github.com/nuxt/nuxt/pull/35714))
- **nuxt:** Watch external component directories in development
([#&#8203;35652](https://redirect.github.com/nuxt/nuxt/pull/35652))
- **nuxt:** Don't exclude client entry module from style extraction
([#&#8203;35720](https://redirect.github.com/nuxt/nuxt/pull/35720))
- **nuxt:** Amend cleanup command in NUXT\_B7014 error message
([#&#8203;35735](https://redirect.github.com/nuxt/nuxt/pull/35735))
- **nuxt:** Only pull in `vue-router` when there are island pages
([#&#8203;35739](https://redirect.github.com/nuxt/nuxt/pull/35739))
- **vite:** Suppress external warnings for internal vite-node paths
([#&#8203;35744](https://redirect.github.com/nuxt/nuxt/pull/35744))
- **nuxt:** Use scope-aware oxc parser for auto-imports
([#&#8203;35743](https://redirect.github.com/nuxt/nuxt/pull/35743))
- **nuxt:** Sync layout meta during middleware on SSR
([#&#8203;35633](https://redirect.github.com/nuxt/nuxt/pull/35633))
- **nitro:** Add alias for `h3` that pins it to the version nuxt depends
on ([#&#8203;35774](https://redirect.github.com/nuxt/nuxt/pull/35774))
- **nuxt:** Preserve query params in cached payload extraction
([#&#8203;35696](https://redirect.github.com/nuxt/nuxt/pull/35696))
- **nuxt:** Mirror runtime route tree in generated typed-router types
([#&#8203;35788](https://redirect.github.com/nuxt/nuxt/pull/35788))
- **nuxt:** Warn when an imports preset `from` cannot be resolved
([#&#8203;35799](https://redirect.github.com/nuxt/nuxt/pull/35799))
- **kit:** Avoid mutating layer configs when resolving options
([#&#8203;35729](https://redirect.github.com/nuxt/nuxt/pull/35729))
- **nuxt:** Convert inline route rules exactly or drop with a warning
([#&#8203;35455](https://redirect.github.com/nuxt/nuxt/pull/35455))
- **nitro,nuxt,vite:** Dedupe and normalise global css links in dev
([#&#8203;35834](https://redirect.github.com/nuxt/nuxt/pull/35834))
- **vite:** Register template HMR plugin on dev servers
([929c6c138](https://redirect.github.com/nuxt/nuxt/commit/929c6c138))
- **nuxt:** Remove dev error overlay when error is cleared
([#&#8203;35821](https://redirect.github.com/nuxt/nuxt/pull/35821))
- **rspack,webpack:** Resolve bundled postcss defaults from builder
([#&#8203;35823](https://redirect.github.com/nuxt/nuxt/pull/35823))
- **schema:** Normalise slashes in `app.buildAssetsDir`
([#&#8203;35833](https://redirect.github.com/nuxt/nuxt/pull/35833))
- **nitro:** Bound island props and v-for to prevent unauthenticated DoS
([4e35ae9ba](https://redirect.github.com/nuxt/nuxt/commit/4e35ae9ba))
- **nitro:** Confine runtime payload cache to prerendering
([ac9b41a36](https://redirect.github.com/nuxt/nuxt/commit/ac9b41a36))
- **nuxt:** Case-fold route rule keys to match folded lookups
([ad624a75a](https://redirect.github.com/nuxt/nuxt/commit/ad624a75a))
- **nitro:** Require loopback peer for chrome devtools workspace
endpoint
([0769c4f9b](https://redirect.github.com/nuxt/nuxt/commit/0769c4f9b))
- **nuxt:** Reject reserved `template` island prop under runtime
compiler
([ee6c84633](https://redirect.github.com/nuxt/nuxt/commit/ee6c84633))
- **nuxt:** Reject top-level `as` prop for islands
([581651ff3](https://redirect.github.com/nuxt/nuxt/commit/581651ff3))

##### 💅 Refactors

- **nuxt:** Use tick based debounce for asyncData executes
([#&#8203;34151](https://redirect.github.com/nuxt/nuxt/pull/34151))
- **kit,nuxt:** Replace `semver` with `verkit`
([#&#8203;35713](https://redirect.github.com/nuxt/nuxt/pull/35713))
- **rspack,webpack:** Use DI model to split builders
([#&#8203;35751](https://redirect.github.com/nuxt/nuxt/pull/35751))

##### 📖 Documentation

- Add dev container setup guide
([#&#8203;35665](https://redirect.github.com/nuxt/nuxt/pull/35665))
- Fix dev container setup guide
([#&#8203;35666](https://redirect.github.com/nuxt/nuxt/pull/35666))
- Add explanation of 200.html and 404.html SPA fallbacks
([#&#8203;34483](https://redirect.github.com/nuxt/nuxt/pull/34483))
- Expand payload extraction documentation
([#&#8203;35648](https://redirect.github.com/nuxt/nuxt/pull/35648))
- Clarify NuxtLink componentName is the internal (devtools) name
([#&#8203;35658](https://redirect.github.com/nuxt/nuxt/pull/35658))
- Add example for components dir pattern option
([#&#8203;35663](https://redirect.github.com/nuxt/nuxt/pull/35663))
- Require a single root element
([#&#8203;35677](https://redirect.github.com/nuxt/nuxt/pull/35677))
- Add reason for why you should never import Vue app code in nitro code
([#&#8203;34481](https://redirect.github.com/nuxt/nuxt/pull/34481))
- Document disabling code-splitting with `codeSplitting: false`
([#&#8203;35683](https://redirect.github.com/nuxt/nuxt/pull/35683))
- Document nuxt-client caveat for non-SFC components
([#&#8203;35654](https://redirect.github.com/nuxt/nuxt/pull/35654))
- Clarify favicon does not use cdnURL by default
([#&#8203;35681](https://redirect.github.com/nuxt/nuxt/pull/35681))
- Standardize section order and headings across docs
([#&#8203;35685](https://redirect.github.com/nuxt/nuxt/pull/35685))
- Clarify `onPrehydrate` example comment
([#&#8203;35684](https://redirect.github.com/nuxt/nuxt/pull/35684))
- Add useId as a known limitation of nuxt island
([#&#8203;35693](https://redirect.github.com/nuxt/nuxt/pull/35693))
- Recommend status over pending in data fetching
([#&#8203;35694](https://redirect.github.com/nuxt/nuxt/pull/35694))
- Fill gaps in API minimalVersion badges after
[#&#8203;34485](https://redirect.github.com/nuxt/nuxt/issues/34485)
([#&#8203;35708](https://redirect.github.com/nuxt/nuxt/pull/35708),
[#&#8203;34485](https://redirect.github.com/nuxt/nuxt/issues/34485))
- Explain dynamic asset paths
([#&#8203;35695](https://redirect.github.com/nuxt/nuxt/pull/35695))
- Document `runtimeConfig` env var casting edge cases
([#&#8203;35709](https://redirect.github.com/nuxt/nuxt/pull/35709))
- Clarify module dependency resolution
([#&#8203;35718](https://redirect.github.com/nuxt/nuxt/pull/35718))
- Add more writing guidelines
([#&#8203;35662](https://redirect.github.com/nuxt/nuxt/pull/35662))
- Add note with alternatives to using remote layers
([#&#8203;35721](https://redirect.github.com/nuxt/nuxt/pull/35721))
- Use `nuxt` rather than `nuxi`
([8891e179c](https://redirect.github.com/nuxt/nuxt/commit/8891e179c))
- Document relative baseURL workarounds
([#&#8203;34004](https://redirect.github.com/nuxt/nuxt/pull/34004))
- Warn about `runtimeCompiler` security best practices
([449b63ab1](https://redirect.github.com/nuxt/nuxt/commit/449b63ab1))
- Warn about validating server component props
([2c981cb07](https://redirect.github.com/nuxt/nuxt/commit/2c981cb07))

##### 📦 Build

- **nitro:** Re-export type from augments to preserve module
([dac937675](https://redirect.github.com/nuxt/nuxt/commit/dac937675))
- **nuxt:** Remove `.ts` file extension from `runtime/` imports
([#&#8203;35689](https://redirect.github.com/nuxt/nuxt/pull/35689))
- **ui-templates:** Commit generated ui template files
([#&#8203;35770](https://redirect.github.com/nuxt/nuxt/pull/35770))

##### 🏡 Chore

- Add extension 🤦
([d595fb3d4](https://redirect.github.com/nuxt/nuxt/commit/d595fb3d4))
- Move to pnpm catalogs
([#&#8203;35748](https://redirect.github.com/nuxt/nuxt/pull/35748))
- Update knip config, resolve issues, and run in ci
([#&#8203;35742](https://redirect.github.com/nuxt/nuxt/pull/35742))
- Ignore `@nuxt/telemetry` in knip
([9824d4f10](https://redirect.github.com/nuxt/nuxt/commit/9824d4f10))
- **ui-templates:** Pass config file path to unocss
([34e7a810d](https://redirect.github.com/nuxt/nuxt/commit/34e7a810d))
- Allow regenerating lockfile in release script
([c31389df3](https://redirect.github.com/nuxt/nuxt/commit/c31389df3))
- **nuxt:** Bump `@nuxt/devtools` to v3.3.1
([#&#8203;35815](https://redirect.github.com/nuxt/nuxt/pull/35815))
- Ensure types are setup before unit tests
([784d8f700](https://redirect.github.com/nuxt/nuxt/commit/784d8f700))
- Simplify knip configuration
([#&#8203;35827](https://redirect.github.com/nuxt/nuxt/pull/35827))

##### ✅ Tests

- Reproduce duplicate CSS in shared chunks
([#&#8203;35649](https://redirect.github.com/nuxt/nuxt/pull/35649))
- Prepare fixtures automatically before fixture and e2e runs
([e8b3e6411](https://redirect.github.com/nuxt/nuxt/commit/e8b3e6411))
- Improve and refactor basic fixture
([#&#8203;35687](https://redirect.github.com/nuxt/nuxt/pull/35687))
- Slim down client-only, chunk-error and axis-independent suites
([#&#8203;35706](https://redirect.github.com/nuxt/nuxt/pull/35706))
- Do not run type checking when benchmarking nuxt build
([6355f3bc9](https://redirect.github.com/nuxt/nuxt/commit/6355f3bc9))
- **kit:** Scope loadNuxt temp dir so it doesn't delete sibling fixtures
([37301dd51](https://redirect.github.com/nuxt/nuxt/commit/37301dd51))
- Guard against transient undefined `_route` in gotoPath
([ca92d082b](https://redirect.github.com/nuxt/nuxt/commit/ca92d082b))
- Retry fixture prepare on transient ENOTEMPTY
([3a6b59f96](https://redirect.github.com/nuxt/nuxt/commit/3a6b59f96))
- Raise route-HMR polling timeout to reduce e2e flakiness
([01dc27b7e](https://redirect.github.com/nuxt/nuxt/commit/01dc27b7e))
- Update bundle size snapshot
([30d24817c](https://redirect.github.com/nuxt/nuxt/commit/30d24817c))

##### 🤖 CI

- Rebalance shards and drop non-vite windows fixtures
([#&#8203;35700](https://redirect.github.com/nuxt/nuxt/pull/35700))
- Warm windows dependency cache on main
([#&#8203;35730](https://redirect.github.com/nuxt/nuxt/pull/35730))
- Run knip in default and production modes
([#&#8203;35745](https://redirect.github.com/nuxt/nuxt/pull/35745))
- Run knip on pull requests
([d620aa972](https://redirect.github.com/nuxt/nuxt/commit/d620aa972))
- Prepare tests
([c7bf7f738](https://redirect.github.com/nuxt/nuxt/commit/c7bf7f738))
- Also prepare tests in `knip` job
([58f68bd64](https://redirect.github.com/nuxt/nuxt/commit/58f68bd64))
- Check internal docs links on pull requests and all links weekly
([#&#8203;35767](https://redirect.github.com/nuxt/nuxt/pull/35767))

##### ❤️ Contributors

- Daniel Roe
([@&#8203;danielroe](https://redirect.github.com/danielroe))
- Lars Kappert ([@&#8203;webpro](https://redirect.github.com/webpro))
- Matej Černý
([@&#8203;cernymatej](https://redirect.github.com/cernymatej))
- Anthony Fu ([@&#8203;antfu](https://redirect.github.com/antfu))
- Harlan Wilton
([@&#8203;harlan-zw](https://redirect.github.com/harlan-zw))
- Florian Heuberger
([@&#8203;Flo0806](https://redirect.github.com/Flo0806))
- Anoesj Sadraee ([@&#8203;Anoesj](https://redirect.github.com/Anoesj))
- Ryota Watanabe
([@&#8203;wattanx](https://redirect.github.com/wattanx))
- Alexander Lichter
([@&#8203;TheAlexLichter](https://redirect.github.com/TheAlexLichter))
- Nestor Vera ([@&#8203;hacknug](https://redirect.github.com/hacknug))
- Mateleo ([@&#8203;Mateleo](https://redirect.github.com/Mateleo))
- Kevin Deng ([@&#8203;sxzz](https://redirect.github.com/sxzz))
- Robin ([@&#8203;OrbisK](https://redirect.github.com/OrbisK))
- Bochkarev Ivan
([@&#8203;Ibochkarev](https://redirect.github.com/Ibochkarev))
- Quentin Macq
([@&#8203;quentinmcq](https://redirect.github.com/quentinmcq))
- Julien Huang
([@&#8203;huang-julien](https://redirect.github.com/huang-julien))
- Max ([@&#8203;onmax](https://redirect.github.com/onmax))
- Luke Nelson ([@&#8203;luc122c](https://redirect.github.com/luc122c))
- Darlan José Batista do Prado
([@&#8203;DarlanPrado](https://redirect.github.com/DarlanPrado))
- kealan ([@&#8203;KealanAU](https://redirect.github.com/KealanAU))
- Sushant
([@&#8203;sushantguri](https://redirect.github.com/sushantguri))
- raminjafary
([@&#8203;raminjafary](https://redirect.github.com/raminjafary))
- Aubakirov Asker
([@&#8203;Askerka00](https://redirect.github.com/Askerka00))
- lutejka ([@&#8203;lutejka](https://redirect.github.com/lutejka))
- Amulet Iris ([@&#8203;KazariAI](https://redirect.github.com/KazariAI))
- bdbch ([@&#8203;bdbch](https://redirect.github.com/bdbch))
- Elecmonkey
([@&#8203;elecmonkey](https://redirect.github.com/elecmonkey))

###
[`v4.5.0`](https://redirect.github.com/nuxt/nuxt/releases/tag/v4.5.0)

[Compare
Source](https://redirect.github.com/nuxt/nuxt/compare/v4.4.8...v4.5.0)

> 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://redirect.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
([#&#8203;35463](https://redirect.github.com/nuxt/nuxt/issues/35463),
[#&#8203;35605](https://redirect.github.com/nuxt/nuxt/issues/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)
([#&#8203;34256](https://redirect.github.com/nuxt/nuxt/issues/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)
([#&#8203;34929](https://redirect.github.com/nuxt/nuxt/issues/34929)),
which is faster and lighter, and rebuilt the builder on top of
[`@rsbuild/core`](https://rsbuild.dev)
([#&#8203;35489](https://redirect.github.com/nuxt/nuxt/issues/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`
([#&#8203;35575](https://redirect.github.com/nuxt/nuxt/issues/35575)).
- We use an Rspack-specific Vue loader for correct SSR scoped-style ids
and stricter ESM resolution
([#&#8203;35566](https://redirect.github.com/nuxt/nuxt/issues/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
([#&#8203;34411](https://redirect.github.com/nuxt/nuxt/issues/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.

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 ssrStreaming: true,
 },
})
```

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:

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 ssrStreaming: {
 botRegex: /googlebot|bingbot|my-internal-crawler/i,
 },
 },
 routeRules: {
 '/no-stream/**': { streaming: false },
 },
})
```

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.

> \[!WARNING]
> 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.

📖 [SSR streaming
documentation](https://nuxt.com/docs/guide/going-further/experimental-features#ssrstreaming)

##### 🩺 Stable Error Codes

This one I'm really happy about. Nuxt now has a **stable error code
system**
([#&#8203;35429](https://redirect.github.com/nuxt/nuxt/issues/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.

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()`.

To keep production output lean, the verbose why/fix text is stripped
from production builds, leaving just the stable code.

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.

##### 🎨 `useLayout` Composable

There's a new `useLayout` composable for reading the layout that's been
resolved for the current route
([#&#8203;35623](https://redirect.github.com/nuxt/nuxt/issues/35623)).
Previously there was no clean, reactive way to ask "which layout is this
page using?" from within a component.

```vue
<!-- app/components/LayoutBadge.vue -->
<script setup lang="ts">
const layout = useLayout()
</script>

<template>
 <span>Current layout: {{ layout }}</span>
</template>
```

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.

📖 [`useLayout`
documentation](https://nuxt.com/docs/api/composables/use-layout)

##### 🪟 Named Views

Nuxt now supports **named views** through a filename convention
([#&#8203;35123](https://redirect.github.com/nuxt/nuxt/issues/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:

```bash

# Directory Structure
-| pages/
---| parent/
-----| child.vue
-----| child@sidebar.vue
---| parent.vue
```

```vue
<!-- pages/parent.vue -->
<template>
 <div>
 <NuxtPage />
 <aside>
 <NuxtPage name="sidebar" />
 </aside>
 </div>
</template>
```

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.

> \[!NOTE]
> `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).

📖 [Named views
documentation](https://nuxt.com/docs/guide/directory-structure/app/pages#named-views)

##### 🚦 `enabled` Option for `useFetch` and `useAsyncData`

You can now gate data fetching with a reactive `enabled` option
([#&#8203;33260](https://redirect.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`.

```vue [app/pages/search.vue]
<script setup lang="ts">
const query = ref('')

const { data } = await useFetch('/api/search', {
 query: { q: query },
 // Only fetch once the user has typed something
 enabled: () => query.value.length > 2,
})
</script>
```

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.

📖 [`useAsyncData`
documentation](https://nuxt.com/docs/api/composables/use-async-data)

##### 🔗 `NuxtLink` Prefetch Control for Custom Slots

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
([#&#8203;34539](https://redirect.github.com/nuxt/nuxt/issues/34539)):

```vue
<template>
 <NuxtLink
 v-slot="{ href, navigate, prefetch, prefetched, shouldPrefetch }"
 to="/about"
 custom
 >
 <a
 :href="href"
 :class="{ 'is-prefetched': prefetched }"
 @&#8203;click="navigate"
 @&#8203;pointerenter="shouldPrefetch('interaction') && prefetch()"
 @&#8203;focus="shouldPrefetch('interaction') && prefetch()"
 >
 About page
 </a>
 </NuxtLink>
</template>
```

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.

📖 [`NuxtLink`
documentation](https://nuxt.com/docs/api/components/nuxt-link)

##### ⚡️ Forwarded Preload Hints on Prefetch

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`
([#&#8203;35144](https://redirect.github.com/nuxt/nuxt/issues/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.

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 prefetchPreloadTags: true,
 },
})
```

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.

##### 🌐 `import.meta.envName`

The resolved Nuxt environment name is now available at runtime as
`import.meta.envName` for both Vite and webpack/Rspack builds
([#&#8203;34844](https://redirect.github.com/nuxt/nuxt/issues/34844)).
This is the value set by `--envName` (or the resolved default), so you
can branch on it in your app code:

```ts
if (import.meta.envName === 'staging') {
 // enable staging-only behaviour
}
```

📖 [`import.meta`
documentation](https://nuxt.com/docs/api/advanced/import-meta)

##### 🔭 Tracing Channels for SSR Events

Nuxt now publishes
[diagnostics-channel](https://nodejs.org/api/diagnostics_channel.html)
traces for its server-side subsystems
([#&#8203;35191](https://redirect.github.com/nuxt/nuxt/issues/35191)).
It's unopinionated: we emit `nuxt.render`, `nuxt.island`, `nuxt.data`,
and `nuxt.plugin` channels following the
[untracing](https://redirect.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.

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 // Turn on Nuxt's own channels
 tracingChannel: true,
})
```

You can also enable it granularly. In Nuxt v5, there will be additional
Nitro-level channels:

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 tracingChannel: {
 nuxt: true,
 },
})
```

> \[!NOTE]
> Channel names, payload shapes, and option keys may still change while
the [untracing](https://redirect.github.com/unjs/untracing) registry
settles.

##### 📦 Dependency Upgrades

##### `unhead` v3

Nuxt's head management now runs on [`unhead`
v3](https://unhead.unjs.io/docs/releases/v3)
([#&#8203;34793](https://redirect.github.com/nuxt/nuxt/issues/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.

> \[!WARNING]
> `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.

##### `unctx` v3

We've moved to [`unctx` v3](https://redirect.github.com/unjs/unctx)
([#&#8203;35541](https://redirect.github.com/nuxt/nuxt/issues/35541)),
which resolves a class of long-standing async context issues
([#&#8203;33644](https://redirect.github.com/nuxt/nuxt/issues/33644)).
This is part of the composable-context reliability work that continues
into v5.

##### And more

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.

##### 🛠️ Nuxt CLI

This release bundles some improvements from `@nuxt/cli` v3.36 and v3.37:

- **`nuxt module remove`** to uninstall a module and clean up its config
([nuxt/cli#1306](https://redirect.github.com/nuxt/cli/pull/1306)), the
natural companion to `nuxt module add`.

- **Non-interactive `nuxt init`** for scripting and CI
([nuxt/cli#1341](https://redirect.github.com/nuxt/cli/pull/1341)), plus
it now respects the template's own package manager instead of prompting
([nuxt/cli#1330](https://redirect.github.com/nuxt/cli/pull/1330)).

- **Type-check onboarding**: `nuxt typecheck` now offers to install
`vue-tsc` and `typescript` for you if they're missing
([nuxt/cli#1316](https://redirect.github.com/nuxt/cli/pull/1316)).

- **Golar support for type-checking**: `nuxt typecheck` can now use
[Golar](https://golar.dev) as an alternative to `vue-tsc`
([nuxt/cli#1362](https://redirect.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`:

 ```sh
 nuxt typecheck --checker=golar
 ```

- **Layer-aware dev server**: the dev server now reloads on changes to
local layer `nuxt.config` files
([nuxt/cli#1345](https://redirect.github.com/nuxt/cli/pull/1345)).

##### 🧩 TypeScript Plugin and Named Layout Slots

Nuxt's experimental TypeScript plugin is powered by
[`@dxup/nuxt`](https://redirect.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.

New in the bundled version is an opt-in **runtime** feature: named
layout slots
([KazariEX/dxup#20](https://redirect.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.

Enable it alongside the plugin:

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 typescriptPlugin: true,
 },
 dxup: {
 features: {
 namedLayoutSlots: true,
 },
 },
})
```

Then a layout can expose named slots:

```vue
<!-- layouts/center.vue -->
<template>
 <slot />
 <slot name="side" one="one" />
</template>
```

And any page using that layout can fill them:

```vue
<!-- pages/about.vue -->
<script setup lang="ts">
definePageMeta({ layout: 'center' })
</script>

<template>
 <template #side="{ one }">
 This "{{ one }}" comes from the layout slot.
 </template>
 <div>About page</div>
</template>
```

📖 [`typescriptPlugin`
documentation](https://nuxt.com/docs/guide/going-further/experimental-features#typescriptplugin)

##### 🔥 Performance and Reliability

As always, a lot of work has gone into making Nuxt faster and steadier.

One you can opt into today is the **shared file watcher**
([#&#8203;35143](https://redirect.github.com/nuxt/nuxt/issues/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:

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 watcher: 'builder',
 },
})
```

There are also some other good performance improvements that don't need
to be opted into:

- **Faster dev startup**: dev-only Nitro and pages work is now deferred
and streamlined
([#&#8203;35381](https://redirect.github.com/nuxt/nuxt/issues/35381),
[#&#8203;35383](https://redirect.github.com/nuxt/nuxt/issues/35383)).
- **Leaner production builds**: the island-renderer chunk is skipped
entirely when you use no islands
([#&#8203;35456](https://redirect.github.com/nuxt/nuxt/issues/35456)),
and plugin handling is tree-shaken out of prod builds
([#&#8203;35278](https://redirect.github.com/nuxt/nuxt/issues/35278)).
- **Improved island hashing**: more stable island and key hashing, with
`getIslandHash` and `hashKey` now exposed
([#&#8203;35583](https://redirect.github.com/nuxt/nuxt/issues/35583)).
- **Concurrency and I/O wins** across Kit path resolution and Nitro
inline styles
([#&#8203;35511](https://redirect.github.com/nuxt/nuxt/issues/35511),
[#&#8203;35514](https://redirect.github.com/nuxt/nuxt/issues/35514)).

A couple of other nice quality-of-life fixes:

- `$fetch` is now auto-imported in user code, which fixes edge cases
with top-level `$fetch.create` under Rolldown's output format
([#&#8203;35581](https://redirect.github.com/nuxt/nuxt/issues/35581)).
- Nuxt now honours system `HTTP_PROXY` / `HTTPS_PROXY` environment
variables in the builder environment
([#&#8203;35183](https://redirect.github.com/nuxt/nuxt/issues/35183)).
- HMR now works for `defineNuxtComponent` in JSX
([#&#8203;35620](https://redirect.github.com/nuxt/nuxt/issues/35620)).

##### ⚠️ Heads-Up Before Upgrading

As mentioned above, this release includes three major dependency bumps.
For most apps they're transparent, but they're worth a moment of
attention:

- **Vite 8**: check custom Vite plugins and config against the [Vite
migration guide](https://vite.dev/guide/migration).
- **Rspack 2**: if you use `builder: 'rspack'`, the internals are now
Rsbuild-based, so custom Rspack config may need review.
- **`unhead` v3**: possible breaking *type* changes from stricter
`useHead` typing.

##### ⬆️ Upgrading

Our recommendation for upgrading is to run:

```sh
npx nuxt upgrade --dedupe

# or, if you are staying on the 3.x line
npx nuxt@latest upgrade --dedupe --channel=v3
```

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).

> \[!TIP]
> Check out our [upgrade
guide](https://nuxt.com/docs/getting-started/upgrade) if you're
upgrading from an older version.

Thank you to all of the many contributors to this release. This was a
big one, and it wouldn't happen without you. 💚

#### 👉 Changelog

[compare
changes](https://redirect.github.com/nuxt/nuxt/compare/v4.4.8...v4.5.0)

##### 🚀 Enhancements

- **rspack:** Upgrade to rspack v2
([#&#8203;34929](https://redirect.github.com/nuxt/nuxt/pull/34929))
- **nuxt:** Migrate to unhead v3
([#&#8203;34793](https://redirect.github.com/nuxt/nuxt/pull/34793))
- **nuxt:** Support named views via filename convention
([#&#8203;35123](https://redirect.github.com/nuxt/nuxt/pull/35123))
- **nuxt:** Expose environment name on `import.meta`
([#&#8203;34844](https://redirect.github.com/nuxt/nuxt/pull/34844))
- **nuxt:** Forward destination preload hints on link prefetch
([#&#8203;35144](https://redirect.github.com/nuxt/nuxt/pull/35144))
- **nuxt:** Honour http proxy env vars in builder environment
([#&#8203;35183](https://redirect.github.com/nuxt/nuxt/pull/35183))
- **kit:** Support `allowImportingTsExtensions`
([87c214b34](https://redirect.github.com/nuxt/nuxt/commit/87c214b34))
- **nitro,nuxt,schema:** Add experimental SSR streaming
([5f4efe5a5](https://redirect.github.com/nuxt/nuxt/commit/5f4efe5a5))
- **vite:** Migrate to Vite 8
([#&#8203;34256](https://redirect.github.com/nuxt/nuxt/pull/34256))
- **nitro,nuxt:** Add support for tracing channels for ssr events
([#&#8203;35191](https://redirect.github.com/nuxt/nuxt/pull/35191))
- **kit,nitro,nuxt,schema,vite,webpack:** `nuxt/*` build output contract
([#&#8203;35463](https://redirect.github.com/nuxt/nuxt/pull/35463))
- **nuxt:** Expose `NuxtLink` prefetch props for custom slot
([#&#8203;34539](https://redirect.github.com/nuxt/nuxt/pull/34539))
- **rspack:** Use rspack-specific Vue loader
([a085e8e34](https://redirect.github.com/nuxt/nuxt/commit/a085e8e34))
- **rspack:** Use rspack-specific Vue loader
([#&#8203;35566](https://redirect.github.com/nuxt/nuxt/pull/35566))
- **nuxt,vite:** Attach vite HMR to the shared dev server listener
([a8ea0c7e2](https://redirect.github.com/nuxt/nuxt/commit/a8ea0c7e2))
- **nuxt:** Add `enabled` option to AsyncData
([#&#8203;33260](https://redirect.github.com/nuxt/nuxt/pull/33260))
- **rspack:** Use rsbuild dev server in middleware mode
([#&#8203;35575](https://redirect.github.com/nuxt/nuxt/pull/35575))
- **nuxt:** Expose `getIslandHash` + `hashKey` + improve hash for keys
([#&#8203;35583](https://redirect.github.com/nuxt/nuxt/pull/35583))
- **nuxt:** Add `useLayout` composable for accessing the resolved route
layout
([#&#8203;35623](https://redirect.github.com/nuxt/nuxt/pull/35623))
- **nuxt:** Support `enabled` option in `useFetch`
([#&#8203;35627](https://redirect.github.com/nuxt/nuxt/pull/35627))
- Error code system
([#&#8203;35429](https://redirect.github.com/nuxt/nuxt/pull/35429))
- **nuxt:** Require keyed function 'source' with compatibilityVersion 5
([d56662647](https://redirect.github.com/nuxt/nuxt/commit/d56662647))
- **kit:** Order layer aliases before generic root aliases (`~`, `@`)
([#&#8203;35641](https://redirect.github.com/nuxt/nuxt/pull/35641))
- **kit:** Add `updateAppConfig` util for module authors
([#&#8203;35651](https://redirect.github.com/nuxt/nuxt/pull/35651))
- **nuxt:** Warn when parent page lacks NuxtPage
([#&#8203;35639](https://redirect.github.com/nuxt/nuxt/pull/35639))

##### 🔥 Performance

- **nuxt,vite:** Reuse vite watcher via `experimental.watcher`
([#&#8203;35143](https://redirect.github.com/nuxt/nuxt/pull/35143))
- **nuxt:** Tree-shake unneeded plugin handling from prod builds
([#&#8203;35278](https://redirect.github.com/nuxt/nuxt/pull/35278))
- **nuxt:** Defer dev-only nitro startup work
([#&#8203;35381](https://redirect.github.com/nuxt/nuxt/pull/35381))
- **nuxt:** Reduce dev pages startup work
([#&#8203;35383](https://redirect.github.com/nuxt/nuxt/pull/35383))
- **vite:** Skip unnecessary decorator transforms
([#&#8203;35395](https://redirect.github.com/nuxt/nuxt/pull/35395))
- **nuxt,rspack,vite,webpack:** Migrate to `rolldown-string`
([#&#8203;35058](https://redirect.github.com/nuxt/nuxt/pull/35058))
- **nitro,nuxt,vite:** Remove unused dependencies
([#&#8203;34861](https://redirect.github.com/nuxt/nuxt/pull/34861))
- **nuxt:** Re-parse transformed file once in tree-shake plugin
([#&#8203;35509](https://redirect.github.com/nuxt/nuxt/pull/35509))
- **nuxt:** Index scanned components by name to avoid quadratic lookup
([#&#8203;35510](https://redirect.github.com/nuxt/nuxt/pull/35510))
- **kit:** Stat paths directly and probe extensions in parallel
([#&#8203;35511](https://redirect.github.com/nuxt/nuxt/pull/35511))
- **nitro:** Load inline style chunks concurrently
([#&#8203;35514](https://redirect.github.com/nuxt/nuxt/pull/35514))
- **nuxt:** Skip island-renderer chunk when no islands used
([#&#8203;35456](https://redirect.github.com/nuxt/nuxt/pull/35456))

##### 🩹 Fixes

- **nuxt:** Fix explicit return types of factory types
([40a80ec7d](https://redirect.github.com/nuxt/nuxt/commit/40a80ec7d))
- **vite:** Do not await `ready` event for vite watcher
([6fe539f52](https://redirect.github.com/nuxt/nuxt/commit/6fe539f52))
- **vite:** Invalidate modules for legacy vite server
([#&#8203;35315](https://redirect.github.com/nuxt/nuxt/pull/35315))
- **kit,nuxt:** Pass error as `cause` when we re-throw
([#&#8203;35387](https://redirect.github.com/nuxt/nuxt/pull/35387))
- **nuxt:** Make virtual module IDs stable across hosts
([#&#8203;35317](https://redirect.github.com/nuxt/nuxt/pull/35317))
- **vite:** Inline CSS for lazy components imported from `#components`
([#&#8203;35215](https://redirect.github.com/nuxt/nuxt/pull/35215))
- **nuxt:** Validate `<ClientOnly>` fallback tag name
([#&#8203;35325](https://redirect.github.com/nuxt/nuxt/pull/35325))
- **vite:** Extract server page CSS when `inlineStyles` is disabled
([#&#8203;35209](https://redirect.github.com/nuxt/nuxt/pull/35209))
- **nitro:** Include nested layers in nitro transforms
([#&#8203;35327](https://redirect.github.com/nuxt/nuxt/pull/35327))
- **kit:** Don't exclude layer module runtime files from app tsconfig
([#&#8203;35326](https://redirect.github.com/nuxt/nuxt/pull/35326))
- **nitro:** Export empty styles object with `ssr: false`
([#&#8203;35330](https://redirect.github.com/nuxt/nuxt/pull/35330))
- **nuxt:** Emit auto-import paths as files, not directories
([#&#8203;35333](https://redirect.github.com/nuxt/nuxt/pull/35333))
- **nuxt:** Suppress spurious slot warning in `NuxtPage` during nav
([#&#8203;35335](https://redirect.github.com/nuxt/nuxt/pull/35335))
- **vite:** Preserve backslash separators in windows named pipe path
([#&#8203;35336](https://redirect.github.com/nuxt/nuxt/pull/35336))
- **nuxt:** Detach in-flight promise on `useAsyncData` teardown
([#&#8203;35328](https://redirect.github.com/nuxt/nuxt/pull/35328))
- **nuxt:** Respect per-page keepalive set via `definePageMeta`
([#&#8203;34526](https://redirect.github.com/nuxt/nuxt/pull/34526))
- **nuxt:** Align useFetch error type with runtime
([#&#8203;35346](https://redirect.github.com/nuxt/nuxt/pull/35346))
- **nuxt:** Unwrap getter `body` in `useFetch`
([#&#8203;35343](https://redirect.github.com/nuxt/nuxt/pull/35343))
- **rspack,webpack:** Strip invalid webpack PURE annotations
([#&#8203;35386](https://redirect.github.com/nuxt/nuxt/pull/35386))
- **nuxt:** Guard against -1 when unregistering a router hook
([#&#8203;35391](https://redirect.github.com/nuxt/nuxt/pull/35391))
- **nuxt:** Clean up load/error listeners in preloadPayload
([#&#8203;35392](https://redirect.github.com/nuxt/nuxt/pull/35392))
- **nuxt:** Avoid idle wait when refreshing data after hydration
([#&#8203;35358](https://redirect.github.com/nuxt/nuxt/pull/35358))
- **nuxt:** Hash serialized island props
([#&#8203;35356](https://redirect.github.com/nuxt/nuxt/pull/35356))
- **nuxt:** Ensure `page:start` finishes before `page:finish` starts
([#&#8203;35408](https://redirect.github.com/nuxt/nuxt/pull/35408))
- **vite:** Invalidate lazily-created SSR modules on render
([#&#8203;35410](https://redirect.github.com/nuxt/nuxt/pull/35410))
- **nuxt:** Preserve plugin navigation during app boot
([#&#8203;35344](https://redirect.github.com/nuxt/nuxt/pull/35344))
- **vite:** Invalidate stale SSR virtual modules on render
([#&#8203;35413](https://redirect.github.com/nuxt/nuxt/pull/35413))
- **nitro:** Don't preload JS for lazy-hydrated components
([#&#8203;35342](https://redirect.github.com/nuxt/nuxt/pull/35342))
- **vite:** Add extension to vite-node-runner virtual specifier
([0bf3f1d5d](https://redirect.github.com/nuxt/nuxt/commit/0bf3f1d5d))
- **vite:** Invalidate ssr copy of regenerated templates
([33a581ce7](https://redirect.github.com/nuxt/nuxt/commit/33a581ce7))
- **vite:** Set define for `NODE_ENV` and `__VUE_PROD_DEVTOOLS__`
([#&#8203;35444](https://redirect.github.com/nuxt/nuxt/pull/35444))
- **vite:** Avoid emitted ssr styles file name collisions
([#&#8203;35432](https://redirect.github.com/nuxt/nuxt/pull/35432))
- **nuxt:** Avoid syncing route too early when reused page remounts
([#&#8203;35440](https://redirect.github.com/nuxt/nuxt/pull/35440))
- **nuxt:** Skip showing route errors for crawlers
([#&#8203;35411](https://redirect.github.com/nuxt/nuxt/pull/35411))
- **nuxt:** Keep nested layout on deferred route during suspended layout
switch
([#&#8203;35443](https://redirect.github.com/nuxt/nuxt/pull/35443))
- **nuxt:** Restore deferred query route before page is mounted
([#&#8203;35442](https://redirect.github.com/nuxt/nuxt/pull/35442))
- **kit,nuxt:** Resolve auto-import type paths through shared resolver
([#&#8203;35451](https://redirect.github.com/nuxt/nuxt/pull/35451))
- **nuxt:** Make islands hash backwards-compatible
([#&#8203;35452](https://redirect.github.com/nuxt/nuxt/pull/35452))
- **vite:** Give ssr its own hmr websocket port on vite 8.1
([#&#8203;35458](https://redirect.github.com/nuxt/nuxt/pull/35458))
- **nuxt:** Auto-import `$fetch` where possible
([#&#8203;35581](https://redirect.github.com/nuxt/nuxt/pull/35581))
- **nuxt:** Update unctx to v3
([#&#8203;35541](https://redirect.github.com/nuxt/nuxt/pull/35541))
- **nitro:** Point cache driver at `.mjs` runtime output
([#&#8203;35263](https://redirect.github.com/nuxt/nuxt/pull/35263))
- **nuxt:** Add `head.push` for client side
([#&#8203;35498](https://redirect.github.com/nuxt/nuxt/pull/35498))
- **nitro:** Only reload nitro after initial nitro build
([30a573733](https://redirect.github.com/nuxt/nuxt/commit/30a573733))
- **nuxt:** Pass nuxt `rootDir` to typed-router context
([#&#8203;35565](https://redirect.github.com/nuxt/nuxt/pull/35565))
- **nuxt:** Type `__nuxt_error` marker on `NuxtError`
([06e976d2e](https://redirect.github.com/nuxt/nuxt/commit/06e976d2e))
- **kit:** `noUncheckedSideEffectImports` (v5) + disable
`libReplacement`
([#&#8203;35548](https://redirect.github.com/nuxt/nuxt/pull/35548))
- **nuxt:** Node10 compatible subpath exports
([a216d732d](https://redirect.github.com/nuxt/nuxt/commit/a216d732d))
- **nuxt:** Unwrap module mutation trackers from options after
installing
([#&#8203;35574](https://redirect.github.com/nuxt/nuxt/pull/35574))
- **nuxt:** Entity-encode redirect body to preserve query separators
([#&#8203;35486](https://redirect.github.com/nuxt/nuxt/pull/35486))
- **rspack,webpack:** Use async entry in dev to avoid circular import
([#&#8203;35586](https://redirect.github.com/nuxt/nuxt/pull/35586))
- **nuxt:** Tolerate missing dirs in parcel watcher
([#&#8203;35585](https://redirect.github.com/nuxt/nuxt/pull/35585))
- **nuxt:** Respect saved scroll position on same-page back navigation
from hash
([#&#8203;35608](https://redirect.github.com/nuxt/nuxt/pull/35608))
- **nuxt:** Resolve unctx helper to an absolute path for server bundling
([#&#8203;35602](https://redirect.github.com/nuxt/nuxt/pull/35602))
- **nuxt:** Apply `unctx` transform marker through `magic-string`
([#&#8203;35618](https://redirect.github.com/nuxt/nuxt/pull/35618))
- **schema:** Enable HMR for defineNuxtComponent in JSX
([#&#8203;35620](https://redirect.github.com/nuxt/nuxt/pull/35620))
- **nuxt:** Evict stale forwarded prefetch hints and fix key mismatch
([#&#8203;35621](https://redirect.github.com/nuxt/nuxt/pull/35621))
- **nuxt:** Re-add computeIslandHash for backwards compatibility
([353164bb5](https://redirect.github.com/nuxt/nuxt/commit/353164bb5))
- **nitro:** Correct nitro runtime config type key
([bc3b53add](https://redirect.github.com/nuxt/nuxt/commit/bc3b53add))
- **schema:** Resolve Vite cache directory from workspace
([#&#8203;35626](https://redirect.github.com/nuxt/nuxt/pull/35626))
- **nitro:** Externalise dev SSR entry to avoid slow rollup re-parse
([ff42c54a7](https://redirect.github.com/nuxt/nuxt/commit/ff42c54a7))
- **nuxt:** Drop extension on diagnostics import
([c699cc0de](https://redirect.github.com/nuxt/nuxt/commit/c699cc0de))
- **nitro:** Write prerender cache files atomically
([#&#8203;35619](https://redirect.github.com/nuxt/nuxt/pull/35619))
- **nitro:** Don't import `node:process` in diagnostics
([d73b5df6d](https://redirect.github.com/nuxt/nuxt/commit/d73b5df6d))
- **nuxt:** Apply latest navigation on concurrent `navigateTo` in
built-in router
([#&#8203;35631](https://redirect.github.com/nuxt/nuxt/pull/35631))
- **nuxt:** Update client URL to match SSR on fatal middleware error
([#&#8203;35637](https://redirect.github.com/nuxt/nuxt/pull/35637))

##### 💅 Refactors

- **nitro,nuxt:** Add explicit return types to runtime files
([#&#8203;35139](https://redirect.github.com/nuxt/nuxt/pull/35139))
- **nuxt:** Resolve builder earlier + skip watcher for `nuxt prepare`
([#&#8203;35141](https://redirect.github.com/nuxt/nuxt/pull/35141))
- **nuxt:** Delete cleared keys in `clearNuxtData` & `clearNuxtState`
([#&#8203;35142](https://redirect.github.com/nuxt/nuxt/pull/35142))
- **nuxt:** Use jiti `fsCache` instead of deprecated `cache`
([#&#8203;35268](https://redirect.github.com/nuxt/nuxt/pull/35268))
- **nitro:** Use walkResolver instead of deprecated
resolveUnrefHeadInput
([#&#8203;35267](https://redirect.github.com/nuxt/nuxt/pull/35267))
- **nuxt:** Add type predicates
([#&#8203;35208](https://redirect.github.com/nuxt/nuxt/pull/35208))
- **vite:** Type vite-node-runner error data and resolve `#vite-node`
types from source
([#&#8203;35334](https://redirect.github.com/nuxt/nuxt/pull/35334))
- **nuxt:** Split head runtime plugin by environment
([#&#8203;35389](https://redirect.github.com/nuxt/nuxt/pull/35389))
- **nuxt:** Use `rolldown/utils` instead of oxc-\* dependencies
([#&#8203;34983](https://redirect.github.com/nuxt/nuxt/pull/34983))
- **kit,vite,webpack,nitro,schema:** `ssrStyles` build output => lazy
code provider
([#&#8203;35601](https://redirect.github.com/nuxt/nuxt/pull/35601))
- **nuxt,nitro:** Use dev exports for no-build type-checking
([#&#8203;35605](https://redirect.github.com/nuxt/nuxt/pull/35605))
- **rspack:** Use `rsbuild` to power rspack builder
([#&#8203;35489](https://redirect.github.com/nuxt/nuxt/pull/35489))
- **vite:** Extract TemplateHMRPlugin from DevServerPlugin
([#&#8203;35579](https://redirect.github.com/nuxt/nuxt/pull/35579))

##### 📖 Documentation

- Add builder guide
([#&#8203;35576](https://redirect.github.com/nuxt/nuxt/pull/35576))
- Correct and improve `useAsyncData` and `useFetch`
([#&#8203;35528](https://redirect.github.com/nuxt/nuxt/pull/35528))
- Improving testing documentation for better understanding
([#&#8203;35526](https://redirect.github.com/nuxt/nuxt/pull/35526))
- Fix incorrect transform signature in useAsyncData/useFetch type docs
([#&#8203;35403](https://redirect.github.com/nuxt/nuxt/pull/35403))
- Add minimal version badges to API documentation
([#&#8203;34485](https://redirect.github.com/nuxt/nuxt/pull/34485))
- Clarify usage of await with useFetch
([#&#8203;33745](https://redirect.github.com/nuxt/nuxt/pull/33745))
- Add badges for new features
([1839fe01d](https://redirect.github.com/nuxt/nuxt/commit/1839fe01d))
- Remove `enabled` from `useFetch` docs
([bf7810600](https://redirect.github.com/nuxt/nuxt/commit/bf7810600))
- Add tip about prerendering registration for pages
([#&#8203;35635](https://redirect.github.com/nuxt/nuxt/pull/35635))
- Clarify that `useFetch` keys are unique per call site
([#&#8203;35645](https://redirect.github.com/nuxt/nuxt/pull/35645))
- Clarify useFetch custom data error
([#&#8203;35647](https://redirect.github.com/nuxt/nuxt/pull/35647))

##### 📦 Build

- Use `tsdown` to build project
([#&#8203;35179](https://redirect.github.com/nuxt/nuxt/pull/35179))

##### 🏡 Chore

- Update lockfile
([92087005f](https://redirect.github.com/nuxt/nuxt/commit/92087005f))
- Handle cleaning nuxt build dist manually
([aaafe9879](https://redirect.github.com/nuxt/nuxt/commit/aaafe9879))
- Upgrade oxc/tsdown/rolldown deps together
([28173926d](https://redirect.github.com/nuxt/nuxt/commit/28173926d))
- Use `vp` in nightly release script
([97b56d98d](https://redirect.github.com/nuxt/nuxt/commit/97b56d98d))
- Update lockfile for tsdown build and dev exports
([5d9cd2d67](https://redirect.github.com/nuxt/nuxt/commit/5d9cd2d67))
- Update bundle size snapshots
([b9d353516](https://redirect.github.com/nuxt/nuxt/commit/b9d353516))
- Allow node version updates
([#&#8203;35297](https://redirect.github.com/nuxt/nuxt/pull/35297))
- Update bundle size
([d37b13b60](https://redirect.github.com/nuxt/nuxt/commit/d37b13b60))

##### ✅ Tests

- Strip host path from server bundle before measuring size
([#&#8203;35316](https://redirect.github.com/nuxt/nuxt/pull/35316))
- Run playwright tests in dev mode too
([#&#8203;35329](https://redirect.github.com/nuxt/nuxt/pull/35329))
- **nuxt:** Benchmark dev `loadNuxt` startup ([#&

> ✂ **Note**
>
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
 - At any time (no schedule defined)
- Automerge
 - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/antoinezanardi/goat-it-web-admin).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODAuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4MC4wIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6W119-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Antoine ZANARDI <antoine.zanardi@epitech.eu>
antoinezanardi added a commit to antoinezanardi/goat-it-web-game that referenced this pull request Jul 27, 2026
> ℹ️ **Note**
>
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [nuxt](https://nuxt.com)
([source](https://redirect.github.com/nuxt/nuxt/tree/HEAD/packages/nuxt))
| [`^4.4.8` →
`^4.5.1`](https://renovatebot.com/diffs/npm/nuxt/4.4.8/4.5.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/nuxt/4.5.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/nuxt/4.4.8/4.5.1?slim=true)
|

---

### Release Notes

<details>
<summary>nuxt/nuxt (nuxt)</summary>

###
[`v4.5.1`](https://redirect.github.com/nuxt/nuxt/releases/tag/v4.5.1)

[Compare
Source](https://redirect.github.com/nuxt/nuxt/compare/v4.5.0...v4.5.1)

> ⚠️ **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://redirect.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://redirect.github.com/nuxt/nuxt/security/advisories).

##### 👉 Changelog

[compare
changes](https://redirect.github.com/nuxt/nuxt/compare/v4.5.0...v4.5.1)

##### 🔥 Performance

- **nitro:** Replace island teleports in a single html pass
([#&#8203;35515](https://redirect.github.com/nuxt/nuxt/pull/35515))
- **nuxt:** Add `vue.optionsApi` and disable it for v5+
([#&#8203;35791](https://redirect.github.com/nuxt/nuxt/pull/35791))
- **nuxt:** Without pages, skip client plugins that require routing
([#&#8203;35794](https://redirect.github.com/nuxt/nuxt/pull/35794))
- **nuxt:** Skip payload revival plugin when `ssr: false`
([#&#8203;35782](https://redirect.github.com/nuxt/nuxt/pull/35782))

##### 🩹 Fixes

- **nitro:** Read rspack dev output fs lazily for server entry
([#&#8203;35740](https://redirect.github.com/nuxt/nuxt/pull/35740))
- **rspack,webpack:** Resolve loaders and runtime deps from nuxt dirs
([#&#8203;35568](https://redirect.github.com/nuxt/nuxt/pull/35568))
- **nuxt:** Return global route for `useRoute` in detached effect scope
([#&#8203;35659](https://redirect.github.com/nuxt/nuxt/pull/35659))
- **nuxt:** Ignore custom `name` or `path` when reusing an existing page
in `pages:extend`
([#&#8203;35661](https://redirect.github.com/nuxt/nuxt/pull/35661))
- **nuxt:** Render client components in nested server components
([#&#8203;35669](https://redirect.github.com/nuxt/nuxt/pull/35669))
- **nuxt:** Preserve explicit `useFetch` method inference
([#&#8203;35671](https://redirect.github.com/nuxt/nuxt/pull/35671))
- **nuxt:** Revalidate cached route payloads instead of using
`force-cache`
([#&#8203;35672](https://redirect.github.com/nuxt/nuxt/pull/35672))
- **nuxt:** Correct default export detection in plugin metadata
([#&#8203;35676](https://redirect.github.com/nuxt/nuxt/pull/35676))
- **nuxt:** Clear hide/reset timeouts in set()
([#&#8203;35534](https://redirect.github.com/nuxt/nuxt/pull/35534))
- **kit,nuxt,rspack,schema,webpack:** Add `.mts` file extension in
resolver
([#&#8203;33845](https://redirect.github.com/nuxt/nuxt/pull/33845))
- **nuxt:** Preserve trailing slash in NuxtLink href when unset
([#&#8203;35501](https://redirect.github.com/nuxt/nuxt/pull/35501))
- **nuxt:** Don't cross-pollute useAsyncData cache on reactive key
change
([#&#8203;35656](https://redirect.github.com/nuxt/nuxt/pull/35656))
- **nuxt:** Filter plugin dependencies by build target
([#&#8203;35682](https://redirect.github.com/nuxt/nuxt/pull/35682))
- **nuxt:** Reload real page module on HMR of JSX render-function pages
([#&#8203;35678](https://redirect.github.com/nuxt/nuxt/pull/35678))
- **nuxt:** Resolve `@unhead/vue/*` from nuxt's dependency tree
([#&#8203;35690](https://redirect.github.com/nuxt/nuxt/pull/35690))
- **kit:** Surface module load errors instead of masking as missing
([#&#8203;35497](https://redirect.github.com/nuxt/nuxt/pull/35497))
- **nuxt:** Type auto-imported `$fetch` with nitro's `$Fetch`
([#&#8203;35704](https://redirect.github.com/nuxt/nuxt/pull/35704))
- **nuxt:** Don't reference app config sources in shared and node
tsconfigs
([#&#8203;35673](https://redirect.github.com/nuxt/nuxt/pull/35673))
- **vite:** Resolve SSR inlined CSS module class name mismatch
([#&#8203;35610](https://redirect.github.com/nuxt/nuxt/pull/35610))
- **nuxt:** Generate layout types even when pages module is disabled
([#&#8203;35717](https://redirect.github.com/nuxt/nuxt/pull/35717))
- **nitro:** Skip resource hints for stylesheets already rendered as
blocking links
([#&#8203;35691](https://redirect.github.com/nuxt/nuxt/pull/35691))
- **kit:** Dedupe layers that are both auto-scanned and explicitly
extended
([#&#8203;35712](https://redirect.github.com/nuxt/nuxt/pull/35712))
- **nuxt:** Don't apply scroll behaviour after a subsequent nav
([#&#8203;35719](https://redirect.github.com/nuxt/nuxt/pull/35719))
- **vite:** Ensure server sourcemap-preserver plugin actually runs
([#&#8203;35680](https://redirect.github.com/nuxt/nuxt/pull/35680))
- **vite:** Preserve css suffix when extracting ssr inline styles
([#&#8203;35714](https://redirect.github.com/nuxt/nuxt/pull/35714))
- **nuxt:** Watch external component directories in development
([#&#8203;35652](https://redirect.github.com/nuxt/nuxt/pull/35652))
- **nuxt:** Don't exclude client entry module from style extraction
([#&#8203;35720](https://redirect.github.com/nuxt/nuxt/pull/35720))
- **nuxt:** Amend cleanup command in NUXT\_B7014 error message
([#&#8203;35735](https://redirect.github.com/nuxt/nuxt/pull/35735))
- **nuxt:** Only pull in `vue-router` when there are island pages
([#&#8203;35739](https://redirect.github.com/nuxt/nuxt/pull/35739))
- **vite:** Suppress external warnings for internal vite-node paths
([#&#8203;35744](https://redirect.github.com/nuxt/nuxt/pull/35744))
- **nuxt:** Use scope-aware oxc parser for auto-imports
([#&#8203;35743](https://redirect.github.com/nuxt/nuxt/pull/35743))
- **nuxt:** Sync layout meta during middleware on SSR
([#&#8203;35633](https://redirect.github.com/nuxt/nuxt/pull/35633))
- **nitro:** Add alias for `h3` that pins it to the version nuxt depends
on ([#&#8203;35774](https://redirect.github.com/nuxt/nuxt/pull/35774))
- **nuxt:** Preserve query params in cached payload extraction
([#&#8203;35696](https://redirect.github.com/nuxt/nuxt/pull/35696))
- **nuxt:** Mirror runtime route tree in generated typed-router types
([#&#8203;35788](https://redirect.github.com/nuxt/nuxt/pull/35788))
- **nuxt:** Warn when an imports preset `from` cannot be resolved
([#&#8203;35799](https://redirect.github.com/nuxt/nuxt/pull/35799))
- **kit:** Avoid mutating layer configs when resolving options
([#&#8203;35729](https://redirect.github.com/nuxt/nuxt/pull/35729))
- **nuxt:** Convert inline route rules exactly or drop with a warning
([#&#8203;35455](https://redirect.github.com/nuxt/nuxt/pull/35455))
- **nitro,nuxt,vite:** Dedupe and normalise global css links in dev
([#&#8203;35834](https://redirect.github.com/nuxt/nuxt/pull/35834))
- **vite:** Register template HMR plugin on dev servers
([929c6c138](https://redirect.github.com/nuxt/nuxt/commit/929c6c138))
- **nuxt:** Remove dev error overlay when error is cleared
([#&#8203;35821](https://redirect.github.com/nuxt/nuxt/pull/35821))
- **rspack,webpack:** Resolve bundled postcss defaults from builder
([#&#8203;35823](https://redirect.github.com/nuxt/nuxt/pull/35823))
- **schema:** Normalise slashes in `app.buildAssetsDir`
([#&#8203;35833](https://redirect.github.com/nuxt/nuxt/pull/35833))
- **nitro:** Bound island props and v-for to prevent unauthenticated DoS
([4e35ae9ba](https://redirect.github.com/nuxt/nuxt/commit/4e35ae9ba))
- **nitro:** Confine runtime payload cache to prerendering
([ac9b41a36](https://redirect.github.com/nuxt/nuxt/commit/ac9b41a36))
- **nuxt:** Case-fold route rule keys to match folded lookups
([ad624a75a](https://redirect.github.com/nuxt/nuxt/commit/ad624a75a))
- **nitro:** Require loopback peer for chrome devtools workspace
endpoint
([0769c4f9b](https://redirect.github.com/nuxt/nuxt/commit/0769c4f9b))
- **nuxt:** Reject reserved `template` island prop under runtime
compiler
([ee6c84633](https://redirect.github.com/nuxt/nuxt/commit/ee6c84633))
- **nuxt:** Reject top-level `as` prop for islands
([581651ff3](https://redirect.github.com/nuxt/nuxt/commit/581651ff3))

##### 💅 Refactors

- **nuxt:** Use tick based debounce for asyncData executes
([#&#8203;34151](https://redirect.github.com/nuxt/nuxt/pull/34151))
- **kit,nuxt:** Replace `semver` with `verkit`
([#&#8203;35713](https://redirect.github.com/nuxt/nuxt/pull/35713))
- **rspack,webpack:** Use DI model to split builders
([#&#8203;35751](https://redirect.github.com/nuxt/nuxt/pull/35751))

##### 📖 Documentation

- Add dev container setup guide
([#&#8203;35665](https://redirect.github.com/nuxt/nuxt/pull/35665))
- Fix dev container setup guide
([#&#8203;35666](https://redirect.github.com/nuxt/nuxt/pull/35666))
- Add explanation of 200.html and 404.html SPA fallbacks
([#&#8203;34483](https://redirect.github.com/nuxt/nuxt/pull/34483))
- Expand payload extraction documentation
([#&#8203;35648](https://redirect.github.com/nuxt/nuxt/pull/35648))
- Clarify NuxtLink componentName is the internal (devtools) name
([#&#8203;35658](https://redirect.github.com/nuxt/nuxt/pull/35658))
- Add example for components dir pattern option
([#&#8203;35663](https://redirect.github.com/nuxt/nuxt/pull/35663))
- Require a single root element
([#&#8203;35677](https://redirect.github.com/nuxt/nuxt/pull/35677))
- Add reason for why you should never import Vue app code in nitro code
([#&#8203;34481](https://redirect.github.com/nuxt/nuxt/pull/34481))
- Document disabling code-splitting with `codeSplitting: false`
([#&#8203;35683](https://redirect.github.com/nuxt/nuxt/pull/35683))
- Document nuxt-client caveat for non-SFC components
([#&#8203;35654](https://redirect.github.com/nuxt/nuxt/pull/35654))
- Clarify favicon does not use cdnURL by default
([#&#8203;35681](https://redirect.github.com/nuxt/nuxt/pull/35681))
- Standardize section order and headings across docs
([#&#8203;35685](https://redirect.github.com/nuxt/nuxt/pull/35685))
- Clarify `onPrehydrate` example comment
([#&#8203;35684](https://redirect.github.com/nuxt/nuxt/pull/35684))
- Add useId as a known limitation of nuxt island
([#&#8203;35693](https://redirect.github.com/nuxt/nuxt/pull/35693))
- Recommend status over pending in data fetching
([#&#8203;35694](https://redirect.github.com/nuxt/nuxt/pull/35694))
- Fill gaps in API minimalVersion badges after
[#&#8203;34485](https://redirect.github.com/nuxt/nuxt/issues/34485)
([#&#8203;35708](https://redirect.github.com/nuxt/nuxt/pull/35708),
[#&#8203;34485](https://redirect.github.com/nuxt/nuxt/issues/34485))
- Explain dynamic asset paths
([#&#8203;35695](https://redirect.github.com/nuxt/nuxt/pull/35695))
- Document `runtimeConfig` env var casting edge cases
([#&#8203;35709](https://redirect.github.com/nuxt/nuxt/pull/35709))
- Clarify module dependency resolution
([#&#8203;35718](https://redirect.github.com/nuxt/nuxt/pull/35718))
- Add more writing guidelines
([#&#8203;35662](https://redirect.github.com/nuxt/nuxt/pull/35662))
- Add note with alternatives to using remote layers
([#&#8203;35721](https://redirect.github.com/nuxt/nuxt/pull/35721))
- Use `nuxt` rather than `nuxi`
([8891e179c](https://redirect.github.com/nuxt/nuxt/commit/8891e179c))
- Document relative baseURL workarounds
([#&#8203;34004](https://redirect.github.com/nuxt/nuxt/pull/34004))
- Warn about `runtimeCompiler` security best practices
([449b63ab1](https://redirect.github.com/nuxt/nuxt/commit/449b63ab1))
- Warn about validating server component props
([2c981cb07](https://redirect.github.com/nuxt/nuxt/commit/2c981cb07))

##### 📦 Build

- **nitro:** Re-export type from augments to preserve module
([dac937675](https://redirect.github.com/nuxt/nuxt/commit/dac937675))
- **nuxt:** Remove `.ts` file extension from `runtime/` imports
([#&#8203;35689](https://redirect.github.com/nuxt/nuxt/pull/35689))
- **ui-templates:** Commit generated ui template files
([#&#8203;35770](https://redirect.github.com/nuxt/nuxt/pull/35770))

##### 🏡 Chore

- Add extension 🤦
([d595fb3d4](https://redirect.github.com/nuxt/nuxt/commit/d595fb3d4))
- Move to pnpm catalogs
([#&#8203;35748](https://redirect.github.com/nuxt/nuxt/pull/35748))
- Update knip config, resolve issues, and run in ci
([#&#8203;35742](https://redirect.github.com/nuxt/nuxt/pull/35742))
- Ignore `@nuxt/telemetry` in knip
([9824d4f10](https://redirect.github.com/nuxt/nuxt/commit/9824d4f10))
- **ui-templates:** Pass config file path to unocss
([34e7a810d](https://redirect.github.com/nuxt/nuxt/commit/34e7a810d))
- Allow regenerating lockfile in release script
([c31389df3](https://redirect.github.com/nuxt/nuxt/commit/c31389df3))
- **nuxt:** Bump `@nuxt/devtools` to v3.3.1
([#&#8203;35815](https://redirect.github.com/nuxt/nuxt/pull/35815))
- Ensure types are setup before unit tests
([784d8f700](https://redirect.github.com/nuxt/nuxt/commit/784d8f700))
- Simplify knip configuration
([#&#8203;35827](https://redirect.github.com/nuxt/nuxt/pull/35827))

##### ✅ Tests

- Reproduce duplicate CSS in shared chunks
([#&#8203;35649](https://redirect.github.com/nuxt/nuxt/pull/35649))
- Prepare fixtures automatically before fixture and e2e runs
([e8b3e6411](https://redirect.github.com/nuxt/nuxt/commit/e8b3e6411))
- Improve and refactor basic fixture
([#&#8203;35687](https://redirect.github.com/nuxt/nuxt/pull/35687))
- Slim down client-only, chunk-error and axis-independent suites
([#&#8203;35706](https://redirect.github.com/nuxt/nuxt/pull/35706))
- Do not run type checking when benchmarking nuxt build
([6355f3bc9](https://redirect.github.com/nuxt/nuxt/commit/6355f3bc9))
- **kit:** Scope loadNuxt temp dir so it doesn't delete sibling fixtures
([37301dd51](https://redirect.github.com/nuxt/nuxt/commit/37301dd51))
- Guard against transient undefined `_route` in gotoPath
([ca92d082b](https://redirect.github.com/nuxt/nuxt/commit/ca92d082b))
- Retry fixture prepare on transient ENOTEMPTY
([3a6b59f96](https://redirect.github.com/nuxt/nuxt/commit/3a6b59f96))
- Raise route-HMR polling timeout to reduce e2e flakiness
([01dc27b7e](https://redirect.github.com/nuxt/nuxt/commit/01dc27b7e))
- Update bundle size snapshot
([30d24817c](https://redirect.github.com/nuxt/nuxt/commit/30d24817c))

##### 🤖 CI

- Rebalance shards and drop non-vite windows fixtures
([#&#8203;35700](https://redirect.github.com/nuxt/nuxt/pull/35700))
- Warm windows dependency cache on main
([#&#8203;35730](https://redirect.github.com/nuxt/nuxt/pull/35730))
- Run knip in default and production modes
([#&#8203;35745](https://redirect.github.com/nuxt/nuxt/pull/35745))
- Run knip on pull requests
([d620aa972](https://redirect.github.com/nuxt/nuxt/commit/d620aa972))
- Prepare tests
([c7bf7f738](https://redirect.github.com/nuxt/nuxt/commit/c7bf7f738))
- Also prepare tests in `knip` job
([58f68bd64](https://redirect.github.com/nuxt/nuxt/commit/58f68bd64))
- Check internal docs links on pull requests and all links weekly
([#&#8203;35767](https://redirect.github.com/nuxt/nuxt/pull/35767))

##### ❤️ Contributors

- Daniel Roe
([@&#8203;danielroe](https://redirect.github.com/danielroe))
- Lars Kappert ([@&#8203;webpro](https://redirect.github.com/webpro))
- Matej Černý
([@&#8203;cernymatej](https://redirect.github.com/cernymatej))
- Anthony Fu ([@&#8203;antfu](https://redirect.github.com/antfu))
- Harlan Wilton
([@&#8203;harlan-zw](https://redirect.github.com/harlan-zw))
- Florian Heuberger
([@&#8203;Flo0806](https://redirect.github.com/Flo0806))
- Anoesj Sadraee ([@&#8203;Anoesj](https://redirect.github.com/Anoesj))
- Ryota Watanabe
([@&#8203;wattanx](https://redirect.github.com/wattanx))
- Alexander Lichter
([@&#8203;TheAlexLichter](https://redirect.github.com/TheAlexLichter))
- Nestor Vera ([@&#8203;hacknug](https://redirect.github.com/hacknug))
- Mateleo ([@&#8203;Mateleo](https://redirect.github.com/Mateleo))
- Kevin Deng ([@&#8203;sxzz](https://redirect.github.com/sxzz))
- Robin ([@&#8203;OrbisK](https://redirect.github.com/OrbisK))
- Bochkarev Ivan
([@&#8203;Ibochkarev](https://redirect.github.com/Ibochkarev))
- Quentin Macq
([@&#8203;quentinmcq](https://redirect.github.com/quentinmcq))
- Julien Huang
([@&#8203;huang-julien](https://redirect.github.com/huang-julien))
- Max ([@&#8203;onmax](https://redirect.github.com/onmax))
- Luke Nelson ([@&#8203;luc122c](https://redirect.github.com/luc122c))
- Darlan José Batista do Prado
([@&#8203;DarlanPrado](https://redirect.github.com/DarlanPrado))
- kealan ([@&#8203;KealanAU](https://redirect.github.com/KealanAU))
- Sushant
([@&#8203;sushantguri](https://redirect.github.com/sushantguri))
- raminjafary
([@&#8203;raminjafary](https://redirect.github.com/raminjafary))
- Aubakirov Asker
([@&#8203;Askerka00](https://redirect.github.com/Askerka00))
- lutejka ([@&#8203;lutejka](https://redirect.github.com/lutejka))
- Amulet Iris ([@&#8203;KazariAI](https://redirect.github.com/KazariAI))
- bdbch ([@&#8203;bdbch](https://redirect.github.com/bdbch))
- Elecmonkey
([@&#8203;elecmonkey](https://redirect.github.com/elecmonkey))

###
[`v4.5.0`](https://redirect.github.com/nuxt/nuxt/releases/tag/v4.5.0)

[Compare
Source](https://redirect.github.com/nuxt/nuxt/compare/v4.4.8...v4.5.0)

> 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://redirect.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
([#&#8203;35463](https://redirect.github.com/nuxt/nuxt/issues/35463),
[#&#8203;35605](https://redirect.github.com/nuxt/nuxt/issues/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)
([#&#8203;34256](https://redirect.github.com/nuxt/nuxt/issues/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)
([#&#8203;34929](https://redirect.github.com/nuxt/nuxt/issues/34929)),
which is faster and lighter, and rebuilt the builder on top of
[`@rsbuild/core`](https://rsbuild.dev)
([#&#8203;35489](https://redirect.github.com/nuxt/nuxt/issues/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`
([#&#8203;35575](https://redirect.github.com/nuxt/nuxt/issues/35575)).
- We use an Rspack-specific Vue loader for correct SSR scoped-style ids
and stricter ESM resolution
([#&#8203;35566](https://redirect.github.com/nuxt/nuxt/issues/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
([#&#8203;34411](https://redirect.github.com/nuxt/nuxt/issues/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.

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 ssrStreaming: true,
 },
})
```

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:

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 ssrStreaming: {
 botRegex: /googlebot|bingbot|my-internal-crawler/i,
 },
 },
 routeRules: {
 '/no-stream/**': { streaming: false },
 },
})
```

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.

> \[!WARNING]
> 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.

📖 [SSR streaming
documentation](https://nuxt.com/docs/guide/going-further/experimental-features#ssrstreaming)

##### 🩺 Stable Error Codes

This one I'm really happy about. Nuxt now has a **stable error code
system**
([#&#8203;35429](https://redirect.github.com/nuxt/nuxt/issues/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.

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()`.

To keep production output lean, the verbose why/fix text is stripped
from production builds, leaving just the stable code.

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.

##### 🎨 `useLayout` Composable

There's a new `useLayout` composable for reading the layout that's been
resolved for the current route
([#&#8203;35623](https://redirect.github.com/nuxt/nuxt/issues/35623)).
Previously there was no clean, reactive way to ask "which layout is this
page using?" from within a component.

```vue
<!-- app/components/LayoutBadge.vue -->
<script setup lang="ts">
const layout = useLayout()
</script>

<template>
 <span>Current layout: {{ layout }}</span>
</template>
```

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.

📖 [`useLayout`
documentation](https://nuxt.com/docs/api/composables/use-layout)

##### 🪟 Named Views

Nuxt now supports **named views** through a filename convention
([#&#8203;35123](https://redirect.github.com/nuxt/nuxt/issues/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:

```bash

# Directory Structure
-| pages/
---| parent/
-----| child.vue
-----| child@sidebar.vue
---| parent.vue
```

```vue
<!-- pages/parent.vue -->
<template>
 <div>
 <NuxtPage />
 <aside>
 <NuxtPage name="sidebar" />
 </aside>
 </div>
</template>
```

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.

> \[!NOTE]
> `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).

📖 [Named views
documentation](https://nuxt.com/docs/guide/directory-structure/app/pages#named-views)

##### 🚦 `enabled` Option for `useFetch` and `useAsyncData`

You can now gate data fetching with a reactive `enabled` option
([#&#8203;33260](https://redirect.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`.

```vue [app/pages/search.vue]
<script setup lang="ts">
const query = ref('')

const { data } = await useFetch('/api/search', {
 query: { q: query },
 // Only fetch once the user has typed something
 enabled: () => query.value.length > 2,
})
</script>
```

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.

📖 [`useAsyncData`
documentation](https://nuxt.com/docs/api/composables/use-async-data)

##### 🔗 `NuxtLink` Prefetch Control for Custom Slots

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
([#&#8203;34539](https://redirect.github.com/nuxt/nuxt/issues/34539)):

```vue
<template>
 <NuxtLink
 v-slot="{ href, navigate, prefetch, prefetched, shouldPrefetch }"
 to="/about"
 custom
 >
 <a
 :href="href"
 :class="{ 'is-prefetched': prefetched }"
 @&#8203;click="navigate"
 @&#8203;pointerenter="shouldPrefetch('interaction') && prefetch()"
 @&#8203;focus="shouldPrefetch('interaction') && prefetch()"
 >
 About page
 </a>
 </NuxtLink>
</template>
```

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.

📖 [`NuxtLink`
documentation](https://nuxt.com/docs/api/components/nuxt-link)

##### ⚡️ Forwarded Preload Hints on Prefetch

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`
([#&#8203;35144](https://redirect.github.com/nuxt/nuxt/issues/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.

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 prefetchPreloadTags: true,
 },
})
```

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.

##### 🌐 `import.meta.envName`

The resolved Nuxt environment name is now available at runtime as
`import.meta.envName` for both Vite and webpack/Rspack builds
([#&#8203;34844](https://redirect.github.com/nuxt/nuxt/issues/34844)).
This is the value set by `--envName` (or the resolved default), so you
can branch on it in your app code:

```ts
if (import.meta.envName === 'staging') {
 // enable staging-only behaviour
}
```

📖 [`import.meta`
documentation](https://nuxt.com/docs/api/advanced/import-meta)

##### 🔭 Tracing Channels for SSR Events

Nuxt now publishes
[diagnostics-channel](https://nodejs.org/api/diagnostics_channel.html)
traces for its server-side subsystems
([#&#8203;35191](https://redirect.github.com/nuxt/nuxt/issues/35191)).
It's unopinionated: we emit `nuxt.render`, `nuxt.island`, `nuxt.data`,
and `nuxt.plugin` channels following the
[untracing](https://redirect.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.

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 // Turn on Nuxt's own channels
 tracingChannel: true,
})
```

You can also enable it granularly. In Nuxt v5, there will be additional
Nitro-level channels:

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 tracingChannel: {
 nuxt: true,
 },
})
```

> \[!NOTE]
> Channel names, payload shapes, and option keys may still change while
the [untracing](https://redirect.github.com/unjs/untracing) registry
settles.

##### 📦 Dependency Upgrades

##### `unhead` v3

Nuxt's head management now runs on [`unhead`
v3](https://unhead.unjs.io/docs/releases/v3)
([#&#8203;34793](https://redirect.github.com/nuxt/nuxt/issues/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.

> \[!WARNING]
> `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.

##### `unctx` v3

We've moved to [`unctx` v3](https://redirect.github.com/unjs/unctx)
([#&#8203;35541](https://redirect.github.com/nuxt/nuxt/issues/35541)),
which resolves a class of long-standing async context issues
([#&#8203;33644](https://redirect.github.com/nuxt/nuxt/issues/33644)).
This is part of the composable-context reliability work that continues
into v5.

##### And more

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.

##### 🛠️ Nuxt CLI

This release bundles some improvements from `@nuxt/cli` v3.36 and v3.37:

- **`nuxt module remove`** to uninstall a module and clean up its config
([nuxt/cli#1306](https://redirect.github.com/nuxt/cli/pull/1306)), the
natural companion to `nuxt module add`.

- **Non-interactive `nuxt init`** for scripting and CI
([nuxt/cli#1341](https://redirect.github.com/nuxt/cli/pull/1341)), plus
it now respects the template's own package manager instead of prompting
([nuxt/cli#1330](https://redirect.github.com/nuxt/cli/pull/1330)).

- **Type-check onboarding**: `nuxt typecheck` now offers to install
`vue-tsc` and `typescript` for you if they're missing
([nuxt/cli#1316](https://redirect.github.com/nuxt/cli/pull/1316)).

- **Golar support for type-checking**: `nuxt typecheck` can now use
[Golar](https://golar.dev) as an alternative to `vue-tsc`
([nuxt/cli#1362](https://redirect.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`:

 ```sh
 nuxt typecheck --checker=golar
 ```

- **Layer-aware dev server**: the dev server now reloads on changes to
local layer `nuxt.config` files
([nuxt/cli#1345](https://redirect.github.com/nuxt/cli/pull/1345)).

##### 🧩 TypeScript Plugin and Named Layout Slots

Nuxt's experimental TypeScript plugin is powered by
[`@dxup/nuxt`](https://redirect.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.

New in the bundled version is an opt-in **runtime** feature: named
layout slots
([KazariEX/dxup#20](https://redirect.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.

Enable it alongside the plugin:

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 typescriptPlugin: true,
 },
 dxup: {
 features: {
 namedLayoutSlots: true,
 },
 },
})
```

Then a layout can expose named slots:

```vue
<!-- layouts/center.vue -->
<template>
 <slot />
 <slot name="side" one="one" />
</template>
```

And any page using that layout can fill them:

```vue
<!-- pages/about.vue -->
<script setup lang="ts">
definePageMeta({ layout: 'center' })
</script>

<template>
 <template #side="{ one }">
 This "{{ one }}" comes from the layout slot.
 </template>
 <div>About page</div>
</template>
```

📖 [`typescriptPlugin`
documentation](https://nuxt.com/docs/guide/going-further/experimental-features#typescriptplugin)

##### 🔥 Performance and Reliability

As always, a lot of work has gone into making Nuxt faster and steadier.

One you can opt into today is the **shared file watcher**
([#&#8203;35143](https://redirect.github.com/nuxt/nuxt/issues/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:

```ts
// nuxt.config.ts
export default defineNuxtConfig({
 experimental: {
 watcher: 'builder',
 },
})
```

There are also some other good performance improvements that don't need
to be opted into:

- **Faster dev startup**: dev-only Nitro and pages work is now deferred
and streamlined
([#&#8203;35381](https://redirect.github.com/nuxt/nuxt/issues/35381),
[#&#8203;35383](https://redirect.github.com/nuxt/nuxt/issues/35383)).
- **Leaner production builds**: the island-renderer chunk is skipped
entirely when you use no islands
([#&#8203;35456](https://redirect.github.com/nuxt/nuxt/issues/35456)),
and plugin handling is tree-shaken out of prod builds
([#&#8203;35278](https://redirect.github.com/nuxt/nuxt/issues/35278)).
- **Improved island hashing**: more stable island and key hashing, with
`getIslandHash` and `hashKey` now exposed
([#&#8203;35583](https://redirect.github.com/nuxt/nuxt/issues/35583)).
- **Concurrency and I/O wins** across Kit path resolution and Nitro
inline styles
([#&#8203;35511](https://redirect.github.com/nuxt/nuxt/issues/35511),
[#&#8203;35514](https://redirect.github.com/nuxt/nuxt/issues/35514)).

A couple of other nice quality-of-life fixes:

- `$fetch` is now auto-imported in user code, which fixes edge cases
with top-level `$fetch.create` under Rolldown's output format
([#&#8203;35581](https://redirect.github.com/nuxt/nuxt/issues/35581)).
- Nuxt now honours system `HTTP_PROXY` / `HTTPS_PROXY` environment
variables in the builder environment
([#&#8203;35183](https://redirect.github.com/nuxt/nuxt/issues/35183)).
- HMR now works for `defineNuxtComponent` in JSX
([#&#8203;35620](https://redirect.github.com/nuxt/nuxt/issues/35620)).

##### ⚠️ Heads-Up Before Upgrading

As mentioned above, this release includes three major dependency bumps.
For most apps they're transparent, but they're worth a moment of
attention:

- **Vite 8**: check custom Vite plugins and config against the [Vite
migration guide](https://vite.dev/guide/migration).
- **Rspack 2**: if you use `builder: 'rspack'`, the internals are now
Rsbuild-based, so custom Rspack config may need review.
- **`unhead` v3**: possible breaking *type* changes from stricter
`useHead` typing.

##### ⬆️ Upgrading

Our recommendation for upgrading is to run:

```sh
npx nuxt upgrade --dedupe

# or, if you are staying on the 3.x line
npx nuxt@latest upgrade --dedupe --channel=v3
```

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).

> \[!TIP]
> Check out our [upgrade
guide](https://nuxt.com/docs/getting-started/upgrade) if you're
upgrading from an older version.

Thank you to all of the many contributors to this release. This was a
big one, and it wouldn't happen without you. 💚

#### 👉 Changelog

[compare
changes](https://redirect.github.com/nuxt/nuxt/compare/v4.4.8...v4.5.0)

##### 🚀 Enhancements

- **rspack:** Upgrade to rspack v2
([#&#8203;34929](https://redirect.github.com/nuxt/nuxt/pull/34929))
- **nuxt:** Migrate to unhead v3
([#&#8203;34793](https://redirect.github.com/nuxt/nuxt/pull/34793))
- **nuxt:** Support named views via filename convention
([#&#8203;35123](https://redirect.github.com/nuxt/nuxt/pull/35123))
- **nuxt:** Expose environment name on `import.meta`
([#&#8203;34844](https://redirect.github.com/nuxt/nuxt/pull/34844))
- **nuxt:** Forward destination preload hints on link prefetch
([#&#8203;35144](https://redirect.github.com/nuxt/nuxt/pull/35144))
- **nuxt:** Honour http proxy env vars in builder environment
([#&#8203;35183](https://redirect.github.com/nuxt/nuxt/pull/35183))
- **kit:** Support `allowImportingTsExtensions`
([87c214b34](https://redirect.github.com/nuxt/nuxt/commit/87c214b34))
- **nitro,nuxt,schema:** Add experimental SSR streaming
([5f4efe5a5](https://redirect.github.com/nuxt/nuxt/commit/5f4efe5a5))
- **vite:** Migrate to Vite 8
([#&#8203;34256](https://redirect.github.com/nuxt/nuxt/pull/34256))
- **nitro,nuxt:** Add support for tracing channels for ssr events
([#&#8203;35191](https://redirect.github.com/nuxt/nuxt/pull/35191))
- **kit,nitro,nuxt,schema,vite,webpack:** `nuxt/*` build output contract
([#&#8203;35463](https://redirect.github.com/nuxt/nuxt/pull/35463))
- **nuxt:** Expose `NuxtLink` prefetch props for custom slot
([#&#8203;34539](https://redirect.github.com/nuxt/nuxt/pull/34539))
- **rspack:** Use rspack-specific Vue loader
([a085e8e34](https://redirect.github.com/nuxt/nuxt/commit/a085e8e34))
- **rspack:** Use rspack-specific Vue loader
([#&#8203;35566](https://redirect.github.com/nuxt/nuxt/pull/35566))
- **nuxt,vite:** Attach vite HMR to the shared dev server listener
([a8ea0c7e2](https://redirect.github.com/nuxt/nuxt/commit/a8ea0c7e2))
- **nuxt:** Add `enabled` option to AsyncData
([#&#8203;33260](https://redirect.github.com/nuxt/nuxt/pull/33260))
- **rspack:** Use rsbuild dev server in middleware mode
([#&#8203;35575](https://redirect.github.com/nuxt/nuxt/pull/35575))
- **nuxt:** Expose `getIslandHash` + `hashKey` + improve hash for keys
([#&#8203;35583](https://redirect.github.com/nuxt/nuxt/pull/35583))
- **nuxt:** Add `useLayout` composable for accessing the resolved route
layout
([#&#8203;35623](https://redirect.github.com/nuxt/nuxt/pull/35623))
- **nuxt:** Support `enabled` option in `useFetch`
([#&#8203;35627](https://redirect.github.com/nuxt/nuxt/pull/35627))
- Error code system
([#&#8203;35429](https://redirect.github.com/nuxt/nuxt/pull/35429))
- **nuxt:** Require keyed function 'source' with compatibilityVersion 5
([d56662647](https://redirect.github.com/nuxt/nuxt/commit/d56662647))
- **kit:** Order layer aliases before generic root aliases (`~`, `@`)
([#&#8203;35641](https://redirect.github.com/nuxt/nuxt/pull/35641))
- **kit:** Add `updateAppConfig` util for module authors
([#&#8203;35651](https://redirect.github.com/nuxt/nuxt/pull/35651))
- **nuxt:** Warn when parent page lacks NuxtPage
([#&#8203;35639](https://redirect.github.com/nuxt/nuxt/pull/35639))

##### 🔥 Performance

- **nuxt,vite:** Reuse vite watcher via `experimental.watcher`
([#&#8203;35143](https://redirect.github.com/nuxt/nuxt/pull/35143))
- **nuxt:** Tree-shake unneeded plugin handling from prod builds
([#&#8203;35278](https://redirect.github.com/nuxt/nuxt/pull/35278))
- **nuxt:** Defer dev-only nitro startup work
([#&#8203;35381](https://redirect.github.com/nuxt/nuxt/pull/35381))
- **nuxt:** Reduce dev pages startup work
([#&#8203;35383](https://redirect.github.com/nuxt/nuxt/pull/35383))
- **vite:** Skip unnecessary decorator transforms
([#&#8203;35395](https://redirect.github.com/nuxt/nuxt/pull/35395))
- **nuxt,rspack,vite,webpack:** Migrate to `rolldown-string`
([#&#8203;35058](https://redirect.github.com/nuxt/nuxt/pull/35058))
- **nitro,nuxt,vite:** Remove unused dependencies
([#&#8203;34861](https://redirect.github.com/nuxt/nuxt/pull/34861))
- **nuxt:** Re-parse transformed file once in tree-shake plugin
([#&#8203;35509](https://redirect.github.com/nuxt/nuxt/pull/35509))
- **nuxt:** Index scanned components by name to avoid quadratic lookup
([#&#8203;35510](https://redirect.github.com/nuxt/nuxt/pull/35510))
- **kit:** Stat paths directly and probe extensions in parallel
([#&#8203;35511](https://redirect.github.com/nuxt/nuxt/pull/35511))
- **nitro:** Load inline style chunks concurrently
([#&#8203;35514](https://redirect.github.com/nuxt/nuxt/pull/35514))
- **nuxt:** Skip island-renderer chunk when no islands used
([#&#8203;35456](https://redirect.github.com/nuxt/nuxt/pull/35456))

##### 🩹 Fixes

- **nuxt:** Fix explicit return types of factory types
([40a80ec7d](https://redirect.github.com/nuxt/nuxt/commit/40a80ec7d))
- **vite:** Do not await `ready` event for vite watcher
([6fe539f52](https://redirect.github.com/nuxt/nuxt/commit/6fe539f52))
- **vite:** Invalidate modules for legacy vite server
([#&#8203;35315](https://redirect.github.com/nuxt/nuxt/pull/35315))
- **kit,nuxt:** Pass error as `cause` when we re-throw
([#&#8203;35387](https://redirect.github.com/nuxt/nuxt/pull/35387))
- **nuxt:** Make virtual module IDs stable across hosts
([#&#8203;35317](https://redirect.github.com/nuxt/nuxt/pull/35317))
- **vite:** Inline CSS for lazy components imported from `#components`
([#&#8203;35215](https://redirect.github.com/nuxt/nuxt/pull/35215))
- **nuxt:** Validate `<ClientOnly>` fallback tag name
([#&#8203;35325](https://redirect.github.com/nuxt/nuxt/pull/35325))
- **vite:** Extract server page CSS when `inlineStyles` is disabled
([#&#8203;35209](https://redirect.github.com/nuxt/nuxt/pull/35209))
- **nitro:** Include nested layers in nitro transforms
([#&#8203;35327](https://redirect.github.com/nuxt/nuxt/pull/35327))
- **kit:** Don't exclude layer module runtime files from app tsconfig
([#&#8203;35326](https://redirect.github.com/nuxt/nuxt/pull/35326))
- **nitro:** Export empty styles object with `ssr: false`
([#&#8203;35330](https://redirect.github.com/nuxt/nuxt/pull/35330))
- **nuxt:** Emit auto-import paths as files, not directories
([#&#8203;35333](https://redirect.github.com/nuxt/nuxt/pull/35333))
- **nuxt:** Suppress spurious slot warning in `NuxtPage` during nav
([#&#8203;35335](https://redirect.github.com/nuxt/nuxt/pull/35335))
- **vite:** Preserve backslash separators in windows named pipe path
([#&#8203;35336](https://redirect.github.com/nuxt/nuxt/pull/35336))
- **nuxt:** Detach in-flight promise on `useAsyncData` teardown
([#&#8203;35328](https://redirect.github.com/nuxt/nuxt/pull/35328))
- **nuxt:** Respect per-page keepalive set via `definePageMeta`
([#&#8203;34526](https://redirect.github.com/nuxt/nuxt/pull/34526))
- **nuxt:** Align useFetch error type with runtime
([#&#8203;35346](https://redirect.github.com/nuxt/nuxt/pull/35346))
- **nuxt:** Unwrap getter `body` in `useFetch`
([#&#8203;35343](https://redirect.github.com/nuxt/nuxt/pull/35343))
- **rspack,webpack:** Strip invalid webpack PURE annotations
([#&#8203;35386](https://redirect.github.com/nuxt/nuxt/pull/35386))
- **nuxt:** Guard against -1 when unregistering a router hook
([#&#8203;35391](https://redirect.github.com/nuxt/nuxt/pull/35391))
- **nuxt:** Clean up load/error listeners in preloadPayload
([#&#8203;35392](https://redirect.github.com/nuxt/nuxt/pull/35392))
- **nuxt:** Avoid idle wait when refreshing data after hydration
([#&#8203;35358](https://redirect.github.com/nuxt/nuxt/pull/35358))
- **nuxt:** Hash serialized island props
([#&#8203;35356](https://redirect.github.com/nuxt/nuxt/pull/35356))
- **nuxt:** Ensure `page:start` finishes before `page:finish` starts
([#&#8203;35408](https://redirect.github.com/nuxt/nuxt/pull/35408))
- **vite:** Invalidate lazily-created SSR modules on render
([#&#8203;35410](https://redirect.github.com/nuxt/nuxt/pull/35410))
- **nuxt:** Preserve plugin navigation during app boot
([#&#8203;35344](https://redirect.github.com/nuxt/nuxt/pull/35344))
- **vite:** Invalidate stale SSR virtual modules on render
([#&#8203;35413](https://redirect.github.com/nuxt/nuxt/pull/35413))
- **nitro:** Don't preload JS for lazy-hydrated components
([#&#8203;35342](https://redirect.github.com/nuxt/nuxt/pull/35342))
- **vite:** Add extension to vite-node-runner virtual specifier
([0bf3f1d5d](https://redirect.github.com/nuxt/nuxt/commit/0bf3f1d5d))
- **vite:** Invalidate ssr copy of regenerated templates
([33a581ce7](https://redirect.github.com/nuxt/nuxt/commit/33a581ce7))
- **vite:** Set define for `NODE_ENV` and `__VUE_PROD_DEVTOOLS__`
([#&#8203;35444](https://redirect.github.com/nuxt/nuxt/pull/35444))
- **vite:** Avoid emitted ssr styles file name collisions
([#&#8203;35432](https://redirect.github.com/nuxt/nuxt/pull/35432))
- **nuxt:** Avoid syncing route too early when reused page remounts
([#&#8203;35440](https://redirect.github.com/nuxt/nuxt/pull/35440))
- **nuxt:** Skip showing route errors for crawlers
([#&#8203;35411](https://redirect.github.com/nuxt/nuxt/pull/35411))
- **nuxt:** Keep nested layout on deferred route during suspended layout
switch
([#&#8203;35443](https://redirect.github.com/nuxt/nuxt/pull/35443))
- **nuxt:** Restore deferred query route before page is mounted
([#&#8203;35442](https://redirect.github.com/nuxt/nuxt/pull/35442))
- **kit,nuxt:** Resolve auto-import type paths through shared resolver
([#&#8203;35451](https://redirect.github.com/nuxt/nuxt/pull/35451))
- **nuxt:** Make islands hash backwards-compatible
([#&#8203;35452](https://redirect.github.com/nuxt/nuxt/pull/35452))
- **vite:** Give ssr its own hmr websocket port on vite 8.1
([#&#8203;35458](https://redirect.github.com/nuxt/nuxt/pull/35458))
- **nuxt:** Auto-import `$fetch` where possible
([#&#8203;35581](https://redirect.github.com/nuxt/nuxt/pull/35581))
- **nuxt:** Update unctx to v3
([#&#8203;35541](https://redirect.github.com/nuxt/nuxt/pull/35541))
- **nitro:** Point cache driver at `.mjs` runtime output
([#&#8203;35263](https://redirect.github.com/nuxt/nuxt/pull/35263))
- **nuxt:** Add `head.push` for client side
([#&#8203;35498](https://redirect.github.com/nuxt/nuxt/pull/35498))
- **nitro:** Only reload nitro after initial nitro build
([30a573733](https://redirect.github.com/nuxt/nuxt/commit/30a573733))
- **nuxt:** Pass nuxt `rootDir` to typed-router context
([#&#8203;35565](https://redirect.github.com/nuxt/nuxt/pull/35565))
- **nuxt:** Type `__nuxt_error` marker on `NuxtError`
([06e976d2e](https://redirect.github.com/nuxt/nuxt/commit/06e976d2e))
- **kit:** `noUncheckedSideEffectImports` (v5) + disable
`libReplacement`
([#&#8203;35548](https://redirect.github.com/nuxt/nuxt/pull/35548))
- **nuxt:** Node10 compatible subpath exports
([a216d732d](https://redirect.github.com/nuxt/nuxt/commit/a216d732d))
- **nuxt:** Unwrap module mutation trackers from options after
installing
([#&#8203;35574](https://redirect.github.com/nuxt/nuxt/pull/35574))
- **nuxt:** Entity-encode redirect body to preserve query separators
([#&#8203;35486](https://redirect.github.com/nuxt/nuxt/pull/35486))
- **rspack,webpack:** Use async entry in dev to avoid circular import
([#&#8203;35586](https://redirect.github.com/nuxt/nuxt/pull/35586))
- **nuxt:** Tolerate missing dirs in parcel watcher
([#&#8203;35585](https://redirect.github.com/nuxt/nuxt/pull/35585))
- **nuxt:** Respect saved scroll position on same-page back navigation
from hash
([#&#8203;35608](https://redirect.github.com/nuxt/nuxt/pull/35608))
- **nuxt:** Resolve unctx helper to an absolute path for server bundling
([#&#8203;35602](https://redirect.github.com/nuxt/nuxt/pull/35602))
- **nuxt:** Apply `unctx` transform marker through `magic-string`
([#&#8203;35618](https://redirect.github.com/nuxt/nuxt/pull/35618))
- **schema:** Enable HMR for defineNuxtComponent in JSX
([#&#8203;35620](https://redirect.github.com/nuxt/nuxt/pull/35620))
- **nuxt:** Evict stale forwarded prefetch hints and fix key mismatch
([#&#8203;35621](https://redirect.github.com/nuxt/nuxt/pull/35621))
- **nuxt:** Re-add computeIslandHash for backwards compatibility
([353164bb5](https://redirect.github.com/nuxt/nuxt/commit/353164bb5))
- **nitro:** Correct nitro runtime config type key
([bc3b53add](https://redirect.github.com/nuxt/nuxt/commit/bc3b53add))
- **schema:** Resolve Vite cache directory from workspace
([#&#8203;35626](https://redirect.github.com/nuxt/nuxt/pull/35626))
- **nitro:** Externalise dev SSR entry to avoid slow rollup re-parse
([ff42c54a7](https://redirect.github.com/nuxt/nuxt/commit/ff42c54a7))
- **nuxt:** Drop extension on diagnostics import
([c699cc0de](https://redirect.github.com/nuxt/nuxt/commit/c699cc0de))
- **nitro:** Write prerender cache files atomically
([#&#8203;35619](https://redirect.github.com/nuxt/nuxt/pull/35619))
- **nitro:** Don't import `node:process` in diagnostics
([d73b5df6d](https://redirect.github.com/nuxt/nuxt/commit/d73b5df6d))
- **nuxt:** Apply latest navigation on concurrent `navigateTo` in
built-in router
([#&#8203;35631](https://redirect.github.com/nuxt/nuxt/pull/35631))
- **nuxt:** Update client URL to match SSR on fatal middleware error
([#&#8203;35637](https://redirect.github.com/nuxt/nuxt/pull/35637))

##### 💅 Refactors

- **nitro,nuxt:** Add explicit return types to runtime files
([#&#8203;35139](https://redirect.github.com/nuxt/nuxt/pull/35139))
- **nuxt:** Resolve builder earlier + skip watcher for `nuxt prepare`
([#&#8203;35141](https://redirect.github.com/nuxt/nuxt/pull/35141))
- **nuxt:** Delete cleared keys in `clearNuxtData` & `clearNuxtState`
([#&#8203;35142](https://redirect.github.com/nuxt/nuxt/pull/35142))
- **nuxt:** Use jiti `fsCache` instead of deprecated `cache`
([#&#8203;35268](https://redirect.github.com/nuxt/nuxt/pull/35268))
- **nitro:** Use walkResolver instead of deprecated
resolveUnrefHeadInput
([#&#8203;35267](https://redirect.github.com/nuxt/nuxt/pull/35267))
- **nuxt:** Add type predicates
([#&#8203;35208](https://redirect.github.com/nuxt/nuxt/pull/35208))
- **vite:** Type vite-node-runner error data and resolve `#vite-node`
types from source
([#&#8203;35334](https://redirect.github.com/nuxt/nuxt/pull/35334))
- **nuxt:** Split head runtime plugin by environment
([#&#8203;35389](https://redirect.github.com/nuxt/nuxt/pull/35389))
- **nuxt:** Use `rolldown/utils` instead of oxc-\* dependencies
([#&#8203;34983](https://redirect.github.com/nuxt/nuxt/pull/34983))
- **kit,vite,webpack,nitro,schema:** `ssrStyles` build output => lazy
code provider
([#&#8203;35601](https://redirect.github.com/nuxt/nuxt/pull/35601))
- **nuxt,nitro:** Use dev exports for no-build type-checking
([#&#8203;35605](https://redirect.github.com/nuxt/nuxt/pull/35605))
- **rspack:** Use `rsbuild` to power rspack builder
([#&#8203;35489](https://redirect.github.com/nuxt/nuxt/pull/35489))
- **vite:** Extract TemplateHMRPlugin from DevServerPlugin
([#&#8203;35579](https://redirect.github.com/nuxt/nuxt/pull/35579))

##### 📖 Documentation

- Add builder guide
([#&#8203;35576](https://redirect.github.com/nuxt/nuxt/pull/35576))
- Correct and improve `useAsyncData` and `useFetch`
([#&#8203;35528](https://redirect.github.com/nuxt/nuxt/pull/35528))
- Improving testing documentation for better understanding
([#&#8203;35526](https://redirect.github.com/nuxt/nuxt/pull/35526))
- Fix incorrect transform signature in useAsyncData/useFetch type docs
([#&#8203;35403](https://redirect.github.com/nuxt/nuxt/pull/35403))
- Add minimal version badges to API documentation
([#&#8203;34485](https://redirect.github.com/nuxt/nuxt/pull/34485))
- Clarify usage of await with useFetch
([#&#8203;33745](https://redirect.github.com/nuxt/nuxt/pull/33745))
- Add badges for new features
([1839fe01d](https://redirect.github.com/nuxt/nuxt/commit/1839fe01d))
- Remove `enabled` from `useFetch` docs
([bf7810600](https://redirect.github.com/nuxt/nuxt/commit/bf7810600))
- Add tip about prerendering registration for pages
([#&#8203;35635](https://redirect.github.com/nuxt/nuxt/pull/35635))
- Clarify that `useFetch` keys are unique per call site
([#&#8203;35645](https://redirect.github.com/nuxt/nuxt/pull/35645))
- Clarify useFetch custom data error
([#&#8203;35647](https://redirect.github.com/nuxt/nuxt/pull/35647))

##### 📦 Build

- Use `tsdown` to build project
([#&#8203;35179](https://redirect.github.com/nuxt/nuxt/pull/35179))

##### 🏡 Chore

- Update lockfile
([92087005f](https://redirect.github.com/nuxt/nuxt/commit/92087005f))
- Handle cleaning nuxt build dist manually
([aaafe9879](https://redirect.github.com/nuxt/nuxt/commit/aaafe9879))
- Upgrade oxc/tsdown/rolldown deps together
([28173926d](https://redirect.github.com/nuxt/nuxt/commit/28173926d))
- Use `vp` in nightly release script
([97b56d98d](https://redirect.github.com/nuxt/nuxt/commit/97b56d98d))
- Update lockfile for tsdown build and dev exports
([5d9cd2d67](https://redirect.github.com/nuxt/nuxt/commit/5d9cd2d67))
- Update bundle size snapshots
([b9d353516](https://redirect.github.com/nuxt/nuxt/commit/b9d353516))
- Allow node version updates
([#&#8203;35297](https://redirect.github.com/nuxt/nuxt/pull/35297))
- Update bundle size
([d37b13b60](https://redirect.github.com/nuxt/nuxt/commit/d37b13b60))

##### ✅ Tests

- Strip host path from server bundle before measuring size
([#&#8203;35316](https://redirect.github.com/nuxt/nuxt/pull/35316))
- Run playwright tests in dev mode too
([#&#8203;35329](https://redirect.

> ✂ **Note**
>
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
 - At any time (no schedule defined)
- Automerge
 - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/antoinezanardi/goat-it-web-game).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODAuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4MC4wIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6W119-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Antoine ZANARDI <antoine.zanardi@epitech.eu>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nuxt ui template already set the package manager

3 participants