---
title: "Nuxt 3.12"
description: "Nuxt 3.12 is out - full of improvements and preparing the way for Nuxt 4!"
canonical_url: https://nuxt.com/blog/v3-12
last_updated: 2026-04-15
---

# Nuxt 3.12

> Nuxt 3.12 is out - full of improvements and preparing the way for Nuxt 4!

We're on the road to the release of Nuxt 4, but we've not held back in Nuxt v3.12.

## 🚀 Testing Nuxt 4 changes

Nuxt 4 is on the horizon, and it's now possible to test out the behaviour changes that will be coming in the next major release ([#26925](https://github.com/nuxt/nuxt/pull/26925)) by setting an option in your `nuxt.config.ts` file:

```ts [nuxt.config.ts]
export default defineNuxtConfig({
  future: {
    compatibilityVersion: 4,
  },
})
```

As we've been merging PRs for Nuxt 4, we've been enabling them behind this flag. As much as possible we're aiming for backwards compatibility - our test matrix is running the same fixtures in both v3 and v4 compatibility mode.

There is a lot to say here, with 10+ different PRs and behaviour changes documented and testable, but for full details, including migration steps, see [the v4 upgrade documentation](/docs/getting-started/upgrade#testing-nuxt-4).

We'd be very grateful for early testing of what's coming in Nuxt 4! 🙏

## 📜 Nuxt Scripts auto-install

We've been gradually working to release [Nuxt Scripts](https://scripts.nuxt.com/). It's currently in public preview, but we're near a public release, so we've added some stubs for composables that (when used) will prompt installing the `@nuxt/scripts` module.

👉 Watch out for the launch - and an article explaining more!

## 🌈 Layer auto-registration and bugfixes

Just like `~/modules`, any layers within your project in the `~/layers` directory will now be automatically registered as layers in your project ([#27221](https://github.com/nuxt/nuxt/pull/27221)).

We also now correctly load layer dependencies, which should resolve a range of issues with monorepos and git installations ([#27338](https://github.com/nuxt/nuxt/pull/27338)).

## 🌐 Built-in accessibility improvements

We now have a built-in [`<NuxtRouteAnnouncer>`](/docs/api/components/nuxt-route-announcer) component and corresponding [`useRouteAnnouncer`](/docs/api/composables/use-route-announcer) composable, which will be added by default to new Nuxt templates going forward.

For full details, see [the original PR (#25741)](https://github.com/nuxt/nuxt/pull/25741) and [documentation](/docs/api/components/nuxt-route-announcer).

We're continuing to work on `nuxt/a11y` - expect to hear more on that in future!

## 🔥 Performance improvements

We've landed some performance improvements as well, many of which are behind the `compatibilityVersion: 4` flag, such as a move away from deeply reactive asyncData payloads.

Significant improvements include deduplicating modules ([#27475](https://github.com/nuxt/nuxt/pull/27475)) - which will apply mostly to layer users who specify modules in their layers. In one project, we saw 30s+ improvement in starting Nuxt.

We've also improved Vite dev server start up time by excluding common ESM dependencies from pre-bundling, and would suggest module authors consider doing the same ([#27372](https://github.com/nuxt/nuxt/pull/27372)).

We improved chunk determinism, so sequential builds should be less likely to have *completely* different chunk hashes ([#27258](https://github.com/nuxt/nuxt/pull/27258)).

And we tree shake more client-only composables from your server builds ([#27044](https://github.com/nuxt/nuxt/pull/27044)), and have reduced the size of server component payloads ([#26863](https://github.com/nuxt/nuxt/pull/26863)).

## 👨‍👩‍👧‍👦 Multi-app support

We've landed a couple of changes that take us toward a place of supporting multi-app natively in Nuxt, including a `multiApp` experimental flag ([#27291](https://github.com/nuxt/nuxt/pull/27291)) and the ability to have multiple Nuxt app instances running in parallel at runtime ([#27068](https://github.com/nuxt/nuxt/pull/27068)).

While it's not yet ready, please do follow along on [the tracker issue](https://github.com/nuxt/nuxt/issues/21635), and feel free to pitch in if this is interesting to you.

## ⛑️ DX wins

We now serialise more things in your dev server logs, including VNodes ([#27309](https://github.com/nuxt/nuxt/pull/27309)) and [URLs](https://github.com/nuxt/nuxt/commit/a549b46e9). We also addressed a bug that could lead to a frozen dev server.

When accessing private runtime config in the browser, we now let you know with a more informative error message ([#26441](https://github.com/nuxt/nuxt/pull/26441)).

## 🪨 Stabilising features

We've removed some experimental options that have been stabilised and which we feel no longer need to be configurable:

- `experimental.treeshakeClientOnly` (enabled by default since v3.0.0)
- `experimental.configSchema` (enabled by default since v3.3.0)
- `experimental.polyfillVueUseHead` (disabled since v3.4.0) - implementable in user-land with [plugin](https://github.com/nuxt/nuxt/blob/f209158352b09d1986aa320e29ff36353b91c358/packages/nuxt/src/head/runtime/plugins/vueuse-head-polyfill.ts#L10-L11)
- `experimental.respectNoSSRHeader` (disabled since v3.4.0) - implementable in user-land with [server middleware](https://github.com/nuxt/nuxt/blob/c660b39447f0d5b8790c0826092638d321cd6821/packages/nuxt/src/core/runtime/nitro/no-ssr.ts#L8-L9)

We've also enabled `scanPageMeta` by default ([#27134](https://github.com/nuxt/nuxt/pull/27134)). This pulls out any page metadata in your `definePageMeta` macro, and makes it available to modules (like `@nuxtjs/i18n`) so they can augment it.

This unlocks much better module/typed routing integration, but has a potential performance cost - so please file an issue if you experience any problems.

## 💪 Type improvements

We now have support for typed `#fallback` slots in server components ([#27097](https://github.com/nuxt/nuxt/pull/27097)).

We've also improved some defaults in your generated `tsconfig.json`, including setting `module: 'preserve'` if you have a locally installed TypeScript v5.4 version ([see docs](https://www.typescriptlang.org/tsconfig/#preserve)) - see [#26667](https://github.com/nuxt/nuxt/pull/26667), [#27485](https://github.com/nuxt/nuxt/pull/27485).

## 📦 Module author/power user improvements

We have shipped a range of type improvements for module authors, including:

- support for typed module options in `installModule` ([#26744](https://github.com/nuxt/nuxt/pull/26744))
- the option to specify compatibility with certain builders (vite/webpack) in module options ([#27022](https://github.com/nuxt/nuxt/pull/27022))
- a new `onPrehydrate` hook for hooking into the browser hydration cycle ([#27037](https://github.com/nuxt/nuxt/pull/27037))
- the ability to access and update *resolved* runtime configuration within modules, with new build-time `useRuntimeConfig` and `updateRuntimeConfig` utils ([#27117](https://github.com/nuxt/nuxt/pull/27117))

## 🎨 Inlined UI templates

If you previously used `@nuxt/ui-templates` then it may be worth knowing that we have moved them from [a separate repository](https://github.com/nuxt/ui-templates) into the [nuxt/nuxt](https://github.com/nuxt/nuxt) monorepo. (This is purely a refactor rather than a change, although you can expect some new designs for Nuxt v4.)

## ✅ Upgrading

As usual, our recommendation for upgrading is to run:

```sh
npx nuxi@latest upgrade --force
```

This will refresh your lockfile as well, and ensures that you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.

## Full Release Notes

<read-more icon="i-simple-icons-github" target="_blank" to="https://github.com/nuxt/nuxt/releases/tag/v3.12.0">

Read the full release notes of Nuxt `v3.12.0`.

</read-more>

A huge thank you to the 75+ Nuxt contributors and community members who have been part of this release. ❤️

Finally, thank you for reading this far! We hope you enjoy v3.12, and please do let us know if you have any feedback or issues. 🙏

**Happy Nuxting ✨**
