tag:github.com,2008:https://github.com/nuxt/nuxt/releases Release notes from nuxt 2026-03-12T11:58:04Z tag:github.com,2008:Repository/71995937/v4.4.2 2026-03-12T11:58:04Z v4.4.2 <p>v4.4.2</p> danielroe tag:github.com,2008:Repository/71995937/v4.4.1 2026-03-12T11:43:21Z v4.4.1 <p>v4.4.1</p> danielroe tag:github.com,2008:Repository/71995937/v4.4.0 2026-03-12T14:27:48Z v4.4.0/v4.4.2 <blockquote> <p>4.4.0/4.4.2 is the next minor release (v4.4.2 was published with no changes due to a publishing failure)</p> </blockquote> <h2>๐Ÿ‘€ Highlights</h2> <h3>๐Ÿญ <code>createUseFetch</code> and <code>createUseAsyncData</code></h3> <p>You can now create <strong>custom instances</strong> of <code>useFetch</code> and <code>useAsyncData</code> with your own default options (<a href="https://github.com/nuxt/nuxt/pull/32300" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32300/hovercard">#32300</a>).</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// composables/api.ts // Simple defaults export const useClientFetch = createUseFetch({ server: false, }) // Dynamic defaults with full control over merging export const useApiFetch = createUseFetch((currentOptions) =&gt; { const runtimeConfig = useRuntimeConfig() return { ...currentOptions, baseURL: currentOptions.baseURL ?? runtimeConfig.public.baseApiUrl, } })"><pre><span class="pl-c">// composables/api.ts</span> <span class="pl-c">// Simple defaults</span> <span class="pl-k">export</span> <span class="pl-k">const</span> <span class="pl-s1">useClientFetch</span> <span class="pl-c1">=</span> <span class="pl-en">createUseFetch</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">server</span>: <span class="pl-c1">false</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-c">// Dynamic defaults with full control over merging</span> <span class="pl-k">export</span> <span class="pl-k">const</span> <span class="pl-s1">useApiFetch</span> <span class="pl-c1">=</span> <span class="pl-en">createUseFetch</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-s1">currentOptions</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> <span class="pl-k">const</span> <span class="pl-s1">runtimeConfig</span> <span class="pl-c1">=</span> <span class="pl-en">useRuntimeConfig</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-k">return</span> <span class="pl-kos">{</span> ...<span class="pl-s1">currentOptions</span><span class="pl-kos">,</span> <span class="pl-c1">baseURL</span>: <span class="pl-s1">currentOptions</span><span class="pl-kos">.</span><span class="pl-c1">baseURL</span> <span class="pl-c1">??</span> <span class="pl-s1">runtimeConfig</span><span class="pl-kos">.</span><span class="pl-c1">public</span><span class="pl-kos">.</span><span class="pl-c1">baseApiUrl</span><span class="pl-kos">,</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>Then use them exactly like <code>useFetch</code> โ€“ they're fully typed and support all the same options:</p> <div class="highlight highlight-text-html-vue notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;!-- pages/dashboard.vue --&gt; &lt;script setup lang=&quot;ts&quot;&gt; // Uses your baseURL from runtimeConfig automatically const { data: users } = await useApiFetch('/users') &lt;/script&gt;"><pre><span class="pl-c"><span class="pl-c">&lt;!--</span> pages/dashboard.vue <span class="pl-c">--&gt;</span></span> &lt;<span class="pl-ent">script</span> setup lang="ts"&gt;<span class="pl-s1"></span> <span class="pl-s1"><span class="pl-c"><span class="pl-c">//</span> Uses your baseURL from runtimeConfig automatically</span></span> <span class="pl-s1"><span class="pl-k"><span class="pl-k">const</span></span> { <span class="pl-v">data</span>: users } <span class="pl-k">=</span> <span class="pl-k">await</span> <span class="pl-en">useApiFetch</span>(<span class="pl-s"><span class="pl-pds">'</span>/users<span class="pl-pds">'</span></span>)</span> <span class="pl-s1"></span>&lt;/<span class="pl-ent">script</span>&gt;</pre></div> <p>When you pass a plain object, your usage options automatically override the defaults. When you pass a function, you get full control over how options are merged โ€“ which means you can compose interceptors, headers, and other complex options however you need.</p> <p>Under the hood, this is powered by a new Nuxt ad-hoc module that scans your composables directory and automatically registers your custom instances for key injection โ€“ so they work seamlessly with SSR, just like <code>useAsyncData</code> and <code>useFetch</code>.</p> <p>There's also <code>createUseAsyncData</code> for the same pattern with <code>useAsyncData</code>.</p> <blockquote> <p>๐Ÿ“– <a href="https://nuxt.com/docs/api/composables/create-use-async-data" rel="nofollow">Read more: <code>createUseAsyncData</code></a></p> </blockquote> <h3>๐Ÿ—บ๏ธ Vue Router v5</h3> <p>We've upgraded to <a href="https://github.com/vuejs/router">vue-router v5</a> (<a href="https://github.com/nuxt/nuxt/pull/34181" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34181/hovercard">#34181</a>), which removes the dependency on <code>unplugin-vue-router</code>. This is the first major vue-router upgrade since Nuxt 3, and it comes with a bunch of improvements under the hood.</p> <p>For most apps, this should be a transparent upgrade. If you're using <code>unplugin-vue-router</code> directly, you can remove it from your dependencies.</p> <p>The next step will be taking typed routes out of experimental status. ๐Ÿ‘€</p> <h3>๐Ÿ’ช Typed Layout Props in <code>definePageMeta</code></h3> <p>You can now pass props to your layouts directly from <code>definePageMeta</code> (<a href="https://github.com/nuxt/nuxt/pull/34262" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34262/hovercard">#34262</a>). This means your layouts can be parameterised per-page without needing to use <code>provide</code>/<code>inject</code> or other workarounds. Check out the <a href="https://nuxt.com/docs/guide/directory-structure/layouts#layout-props" rel="nofollow">updated docs</a> for the full details.</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// pages/dashboard.vue definePageMeta({ layout: { name: 'panel', props: { sidebar: true, title: 'Dashboard', }, }, })"><pre><span class="pl-c">// pages/dashboard.vue</span> <span class="pl-en">definePageMeta</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">layout</span>: <span class="pl-kos">{</span> <span class="pl-c1">name</span>: <span class="pl-s">'panel'</span><span class="pl-kos">,</span> <span class="pl-c1">props</span>: <span class="pl-kos">{</span> <span class="pl-c1">sidebar</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span> <span class="pl-c1">title</span>: <span class="pl-s">'Dashboard'</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>Even better โ€“ the props are <strong>fully typed</strong> (<a href="https://github.com/nuxt/nuxt/pull/34409" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34409/hovercard">#34409</a>). If your layout defines props, you'll get autocomplete and type-checking in <code>definePageMeta</code>.</p> <div class="highlight highlight-text-html-vue notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;!-- layouts/panel.vue --&gt; &lt;script setup lang=&quot;ts&quot;&gt; defineProps&lt;{ sidebar?: boolean title?: string }&gt;() &lt;/script&gt;"><pre><span class="pl-c"><span class="pl-c">&lt;!--</span> layouts/panel.vue <span class="pl-c">--&gt;</span></span> &lt;<span class="pl-ent">script</span> setup lang="ts"&gt;<span class="pl-s1"></span> <span class="pl-s1"><span class="pl-en">defineProps</span>&lt;{</span> <span class="pl-s1"> sidebar<span class="pl-k">?</span><span class="pl-k">:</span> <span class="pl-c1">boolean</span></span> <span class="pl-s1"> title<span class="pl-k">?</span><span class="pl-k">:</span> <span class="pl-c1">string</span></span> <span class="pl-s1">}&gt;()</span> <span class="pl-s1"></span>&lt;/<span class="pl-ent">script</span>&gt;</pre></div> <blockquote> <p>๐Ÿ“– <a href="https://nuxt.com/docs/guide/directory-structure/layouts" rel="nofollow">Read more: Layouts</a></p> </blockquote> <h3>๐Ÿ—ฃ๏ธ <code>useAnnouncer</code> Composable</h3> <p>Accessibility got a major boost with the new <code>useAnnouncer</code> composable and <code>&lt;NuxtAnnouncer&gt;</code> component (<a href="https://github.com/nuxt/nuxt/pull/34318" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34318/hovercard">#34318</a>). While <code>useRouteAnnouncer</code> handles page navigation for screen readers, many apps need to announce <strong>dynamic in-page changes</strong> โ€“ form submissions, loading states, search results, and more.</p> <div class="highlight highlight-text-html-vue notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;!-- app.vue --&gt; &lt;template&gt; &lt;NuxtAnnouncer /&gt; &lt;NuxtRouteAnnouncer /&gt; &lt;NuxtLayout&gt; &lt;NuxtPage /&gt; &lt;/NuxtLayout&gt; &lt;/template&gt;"><pre><span class="pl-c"><span class="pl-c">&lt;!--</span> app.vue <span class="pl-c">--&gt;</span></span> &lt;<span class="pl-ent">template</span>&gt; &lt;<span class="pl-ent">NuxtAnnouncer</span> /&gt; &lt;<span class="pl-ent">NuxtRouteAnnouncer</span> /&gt; &lt;<span class="pl-ent">NuxtLayout</span>&gt; &lt;<span class="pl-ent">NuxtPage</span> /&gt; &lt;/<span class="pl-ent">NuxtLayout</span>&gt; &lt;/<span class="pl-ent">template</span>&gt;</pre></div> <div class="highlight highlight-text-html-vue notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;!-- components/ContactForm.vue --&gt; &lt;script setup lang=&quot;ts&quot;&gt; const { polite, assertive } = useAnnouncer() async function submitForm() { try { await $fetch('/api/contact', { method: 'POST', body: formData }) polite('Message sent successfully') } catch (error) { assertive('Error: Failed to send message') } } &lt;/script&gt;"><pre><span class="pl-c"><span class="pl-c">&lt;!--</span> components/ContactForm.vue <span class="pl-c">--&gt;</span></span> &lt;<span class="pl-ent">script</span> setup lang="ts"&gt;<span class="pl-s1"></span> <span class="pl-s1"><span class="pl-k"><span class="pl-k">const</span></span> { polite, assertive } <span class="pl-k">=</span> <span class="pl-en">useAnnouncer</span>()</span> <span class="pl-s1"></span> <span class="pl-s1"><span class="pl-k">async</span> <span class="pl-k">function</span> submitForm() {</span> <span class="pl-s1"> <span class="pl-k">try</span> {</span> <span class="pl-s1"> <span class="pl-k">await</span> <span class="pl-en">$fetch</span>(<span class="pl-s"><span class="pl-pds">'</span>/api/contact<span class="pl-pds">'</span></span>, { method: <span class="pl-s"><span class="pl-pds">'</span>POST<span class="pl-pds">'</span></span>, body: <span class="pl-smi">formData</span> })</span> <span class="pl-s1"> <span class="pl-en">polite</span>(<span class="pl-s"><span class="pl-pds">'</span>Message sent successfully<span class="pl-pds">'</span></span>)</span> <span class="pl-s1"> }</span> <span class="pl-s1"> <span class="pl-k">catch</span> (<span class="pl-smi">error</span>) {</span> <span class="pl-s1"> <span class="pl-en">assertive</span>(<span class="pl-s"><span class="pl-pds">'</span>Error: Failed to send message<span class="pl-pds">'</span></span>)</span> <span class="pl-s1"> }</span> <span class="pl-s1">}</span> <span class="pl-s1"></span>&lt;/<span class="pl-ent">script</span>&gt;</pre></div> <blockquote> <p><strong>Note:</strong> This is part of our <a href="https://github.com/nuxt/nuxt/issues/23255" data-hovercard-type="issue" data-hovercard-url="/nuxt/nuxt/issues/23255/hovercard">accessibility roadmap</a>. You don't need to use it everywhere โ€“ for many interactions, moving focus to new content or using native form validation is sufficient. <code>useAnnouncer</code> is most useful when content changes dynamically without a corresponding focus change.</p> </blockquote> <blockquote> <p>๐Ÿ“– <a href="https://nuxt.com/docs/api/composables/use-announcer" rel="nofollow">Read more: <code>useAnnouncer</code></a></p> </blockquote> <h3>๐Ÿš€ Migrate to <code>unrouting</code></h3> <p>We've migrated Nuxt's file-system route generation to <a href="https://github.com/unjs/unrouting"><code>unrouting</code></a> (<a href="https://github.com/nuxt/nuxt/pull/34316" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34316/hovercard">#34316</a>), which uses a trie data structure for constructing routes. The cold start is roughly the same (~8ms vs ~6ms for large apps), but dev server changes are <strong>up to 28x faster</strong> when you're not adding/removing pages, and ~15% faster even when you are.</p> <p>This also makes route generation more deterministic โ€“ it's no longer sensitive to page file ordering.</p> <h3>๐Ÿซ Smarter Payload Handling for Cached Routes</h3> <p>When a cached route (ISR/SWR) is rendered at runtime with payload extraction enabled, the browser immediately fetches <code>_payload.json</code> as a second request โ€“ which triggers a full SSR re-render of the same page. In serverless environments, this can spin up a second lambda before the first response has even finished streaming.</p> <p>This release addresses this with two changes (<a href="https://github.com/nuxt/nuxt/pull/34410" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34410/hovercard">#34410</a>):</p> <ol> <li>A new <code>payloadExtraction: 'client'</code> mode that inlines the full payload in the initial HTML response while still generating <code>_payload.json</code> for client-side navigation</li> <li>A runtime in-memory LRU payload cache so that <code>_payload.json</code> requests can be served without a full re-render</li> </ol> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// nuxt.config.ts export default defineNuxtConfig({ experimental: { payloadExtraction: 'client', }, })"><pre><span class="pl-c">// nuxt.config.ts</span> <span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">experimental</span>: <span class="pl-kos">{</span> <span class="pl-c1">payloadExtraction</span>: <span class="pl-s">'client'</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <blockquote> <p><strong>Note:</strong> <code>payloadExtraction: 'client'</code> will become the default with <code>compatibilityVersion: 5</code>. The runtime cache is active for all users.</p> </blockquote> <blockquote> <p>๐Ÿ“– <a href="https://nuxt.com/docs/guide/going-further/experimental-features#payloadextraction" rel="nofollow">Read more: Experimental <code>payloadExtraction</code></a></p> </blockquote> <h3>๐Ÿช <code>refresh</code> Option for <code>useCookie</code></h3> <p>If you're using cookies for session management, you've probably run into the problem of needing to extend a cookie's expiration without changing its value. The new <code>refresh</code> option makes this simple (<a href="https://github.com/nuxt/nuxt/pull/33814" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33814/hovercard">#33814</a>):</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="const session = useCookie('session-id', { maxAge: 60 * 60, refresh: true, }) // Extends expiration each time, even with the same value session.value = session.value"><pre><span class="pl-k">const</span> <span class="pl-s1">session</span> <span class="pl-c1">=</span> <span class="pl-en">useCookie</span><span class="pl-kos">(</span><span class="pl-s">'session-id'</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">maxAge</span>: <span class="pl-c1">60</span> <span class="pl-c1">*</span> <span class="pl-c1">60</span><span class="pl-kos">,</span> <span class="pl-c1">refresh</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-c">// Extends expiration each time, even with the same value</span> <span class="pl-s1">session</span><span class="pl-kos">.</span><span class="pl-c1">value</span> <span class="pl-c1">=</span> <span class="pl-s1">session</span><span class="pl-kos">.</span><span class="pl-c1">value</span></pre></div> <blockquote> <p>๐Ÿ“– <a href="https://nuxt.com/docs/api/composables/use-cookie" rel="nofollow">Read more: <code>useCookie</code></a></p> </blockquote> <h3>โ™ป๏ธ <code>useState</code> Reset to Default</h3> <p><code>useState</code> and <code>clearNuxtState</code> now support resetting to the initial value instead of clearing to <code>undefined</code> (<a href="https://github.com/nuxt/nuxt/pull/33527" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33527/hovercard">#33527</a>). This aligns with how <code>useAsyncData</code> handles resets and is more intuitive for state management.</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="const count = useState('counter', () =&gt; 0) count.value = 42 // Resets to 0 (the init value), not undefined clearNuxtState('counter')"><pre><span class="pl-k">const</span> <span class="pl-s1">count</span> <span class="pl-c1">=</span> <span class="pl-en">useState</span><span class="pl-kos">(</span><span class="pl-s">'counter'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-c1">0</span><span class="pl-kos">)</span> <span class="pl-s1">count</span><span class="pl-kos">.</span><span class="pl-c1">value</span> <span class="pl-c1">=</span> <span class="pl-c1">42</span> <span class="pl-c">// Resets to 0 (the init value), not undefined</span> <span class="pl-en">clearNuxtState</span><span class="pl-kos">(</span><span class="pl-s">'counter'</span><span class="pl-kos">)</span></pre></div> <blockquote> <p>๐Ÿ“– <a href="https://nuxt.com/docs/api/utils/clear-nuxt-state" rel="nofollow">Read more: <code>clearNuxtState</code></a></p> </blockquote> <h3>๐Ÿ•ต๏ธโ€โ™‚๏ธ Better Import Protection</h3> <p>Inspired by features in <a href="https://tanstack.com/start/latest/docs/framework/react/guide/import-protection" rel="nofollow">TanStack Start</a>, import protection now shows <strong>suggestions</strong> and a full <strong>trace</strong> of where a problematic import originated (<a href="https://github.com/nuxt/nuxt/pull/34454" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34454/hovercard">#34454</a>). This makes it much easier to debug why a server-only import ended up in your client bundle.</p> <p>For example, if you accidentally import from a server route in a component:</p> <p><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9a5df9324b789c7944d57de8b14db54c7370778cae8a52a4ab5bef479557d5b8/68747470733a2f2f6e7578742e636f6d2f6173736574732f626c6f672f696d706f72742d70726f74656374696f6e2e706e67"><img src="https://camo.githubusercontent.com/9a5df9324b789c7944d57de8b14db54c7370778cae8a52a4ab5bef479557d5b8/68747470733a2f2f6e7578742e636f6d2f6173736574732f626c6f672f696d706f72742d70726f74656374696f6e2e706e67" alt="More useful import protection error" data-canonical-src="https://nuxt.com/assets/blog/import-protection.png" style="max-width: 100%;"></a></p> <p>The trace shows the import chain (the component was imported from a page), the exact line of code, and actionable suggestions for how to fix it.</p> <p>We plan to continue work on improving our error messages. ๐Ÿชต</p> <h3>๐Ÿ”ฎ View Transitions Types</h3> <p>You can now define <a href="https://developer.chrome.com/blog/view-transitions-update-io24#view-transition-types" rel="nofollow">view transition types</a> in Nuxt's experimental view transitions support (<a href="https://github.com/nuxt/nuxt/pull/31982" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/31982/hovercard">#31982</a>). This lets you use different transition styles for different navigation patterns (forwards vs. backwards, tabs vs. pages, etc.).</p> <blockquote> <p>๐Ÿ“– <a href="https://nuxt.com/docs/getting-started/transitions#view-transitions-api-experimental" rel="nofollow">Read more: View Transitions API</a></p> </blockquote> <h3>๐Ÿ’ก Improved <code>optimizeDeps</code> Hints</h3> <p>When Vite discovers new dependencies at runtime and triggers page reloads, Nuxt now shows a clear, copy-pasteable <code>nuxt.config.ts</code> snippet to pre-bundle them (<a href="https://github.com/nuxt/nuxt/pull/34320" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34320/hovercard">#34320</a>). It also warns about unresolvable entries at startup.</p> <h3>๐Ÿท๏ธ Normalised Page Component Names (Experimental)</h3> <p>A new experimental option normalises page component names to match route names (<a href="https://github.com/nuxt/nuxt/pull/33513" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33513/hovercard">#33513</a>), which can help with consistency in devtools and debugging.</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// nuxt.config.ts export default defineNuxtConfig({ experimental: { normalizeComponentNames: true, }, })"><pre><span class="pl-c">// nuxt.config.ts</span> <span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">experimental</span>: <span class="pl-kos">{</span> <span class="pl-c1">normalizeComponentNames</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <blockquote> <p>๐Ÿ“– <a href="https://nuxt.com/docs/guide/going-further/experimental-features#normalizecomponentnames" rel="nofollow">Read more: <code>normalizeComponentNames</code></a></p> </blockquote> <h3>โšก Build Profiling</h3> <p>Ever wondered where your build time goes? You can now get a detailed performance breakdown of your Nuxt builds (<a href="https://github.com/nuxt/nuxt/pull/34468" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34468/hovercard">#34468</a>, <a href="https://github.com/nuxt/cli/pull/1243" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/cli/pull/1243/hovercard">nuxt/cli#1243</a>):</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="nuxt build --profile"><pre>nuxt build --profile</pre></div> <p>This produces a report showing duration, RSS delta, and heap delta for every build phase, module, and bundler plugin:</p> <p><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/387b697839ce7901180dbe71c170a8b38c3c8864a9ea6b80cdd335fcfc5a91aa/68747470733a2f2f6e7578742e636f6d2f6173736574732f626c6f672f6275696c642d70726f66696c65722e706e67"><img src="https://camo.githubusercontent.com/387b697839ce7901180dbe71c170a8b38c3c8864a9ea6b80cdd335fcfc5a91aa/68747470733a2f2f6e7578742e636f6d2f6173736574732f626c6f672f6275696c642d70726f66696c65722e706e67" alt="Build timings report printed to console" data-canonical-src="https://nuxt.com/assets/blog/build-profiler.png" style="max-width: 100%;"></a></p> <p>It also profiles individual modules and bundler plugins, making it easy to spot bottlenecks. Three output formats are written:</p> <ul> <li><strong>Chrome Trace</strong> (<code>.nuxt/perf-trace.json</code>) โ€“ open in <code>chrome://tracing</code> or Perfetto for a visual timeline</li> <li><strong>JSON report</strong> (<code>.nuxt/perf-report.json</code>) โ€“ machine-readable data for tracking over time</li> <li><strong>CPU profile</strong> (<code>nuxt-build.cpuprofile</code>) โ€“ open in Chrome DevTools or VS Code for flame graphs</li> </ul> <p>For even more detail, use <code>--profile=verbose</code> to print timing breakdowns to the console.</p> <blockquote> <p>๐Ÿ“– <a href="https://nuxt.com/docs/api/commands/build" rel="nofollow">Read more: <code>nuxt build</code></a></p> </blockquote> <p>We'll be using this feature to make Nuxt even faster โ€“ and if performance is something you care about, this might be a good opportunity to contribute!</p> <h3>๐Ÿ”ฅ Performance Improvements</h3> <ul> <li><strong>14,000x faster module ID parsing</strong> โ€“ replaced <code>new URL()</code> + regex chain with a single <code>indexOf</code> + slice (<a href="https://github.com/nuxt/nuxt/pull/34451" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34451/hovercard">#34451</a>)</li> <li><strong>Disabled NuxtLink visibility prefetching in dev</strong> โ€“ stops Vite from discovering and reloading deps unnecessarily during development (<a href="https://github.com/nuxt/nuxt/pull/34325" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34325/hovercard">#34325</a>)</li> </ul> <h2>โœ… Upgrading</h2> <p>Our recommendation for upgrading is to run:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="npx nuxt upgrade --dedupe"><pre>npx nuxt upgrade --dedupe</pre></div> <p>This will deduplicate your lockfile and help ensure you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.</p> <blockquote> <p><strong>Tip:</strong> Check out our <a href="https://nuxt.com/docs/getting-started/upgrade" rel="nofollow">upgrade guide</a> if upgrading from an older version.</p> </blockquote> <h2>๐Ÿ‘‰ Changelog</h2> <p><a href="https://github.com/nuxt/nuxt/compare/v4.3.1...v4.4.0">compare changes</a></p> <h3>๐Ÿš€ Enhancements</h3> <ul> <li><strong>nuxt:</strong> Migrate to unrouting for nuxt file system -&gt; route generation (<a href="https://github.com/nuxt/nuxt/pull/34316" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34316/hovercard">#34316</a>)</li> <li><strong>nuxt:</strong> Allow setting layout props in <code>definePageMeta</code> (<a href="https://github.com/nuxt/nuxt/pull/34262" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34262/hovercard">#34262</a>)</li> <li><strong>nuxt:</strong> Upgrade to vue-router v5 (<a href="https://github.com/nuxt/nuxt/pull/34181" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34181/hovercard">#34181</a>)</li> <li><strong>nuxt:</strong> Add <code>useAnnouncer</code> composable and <code>&lt;NuxtAnnouncer&gt;</code> component (<a href="https://github.com/nuxt/nuxt/pull/34318" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34318/hovercard">#34318</a>)</li> <li><strong>nuxt:</strong> Add reset to default functionality for <code>useState</code> and <code>clearNuxtState</code> (<a href="https://github.com/nuxt/nuxt/pull/33527" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33527/hovercard">#33527</a>)</li> <li><strong>nuxt,schema:</strong> Experimentally normalise page component names to match route (<a href="https://github.com/nuxt/nuxt/pull/33513" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33513/hovercard">#33513</a>)</li> <li><strong>nuxt:</strong> Add <code>refresh</code> option to useCookie (<a href="https://github.com/nuxt/nuxt/pull/33814" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33814/hovercard">#33814</a>)</li> <li><strong>nuxt:</strong> Export page composables from <code>#app/composables/pages</code> (<a href="https://github.com/nuxt/nuxt/pull/33453" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33453/hovercard">#33453</a>)</li> <li><strong>vite:</strong> Improved optimizeDeps hints (<a href="https://github.com/nuxt/nuxt/pull/34320" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34320/hovercard">#34320</a>)</li> <li><strong>nuxt:</strong> Add View Transitions Types support (<a href="https://github.com/nuxt/nuxt/pull/31982" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/31982/hovercard">#31982</a>)</li> <li><strong>nuxt:</strong> Typed props for <code>layout</code> property in <code>definePageMeta</code> (<a href="https://github.com/nuxt/nuxt/pull/34409" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34409/hovercard">#34409</a>)</li> <li><strong>deps:</strong> Upgrade <code>hookable</code> to v6 (<a href="https://github.com/nuxt/nuxt/pull/33905" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33905/hovercard">#33905</a>)</li> <li><strong>deps:</strong> Update to std-env v4 (<a href="https://github.com/nuxt/nuxt/pull/34457" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34457/hovercard">#34457</a>)</li> <li><strong>nitro,nuxt:</strong> Add suggestions + trace to import protection (<a href="https://github.com/nuxt/nuxt/pull/34454" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34454/hovercard">#34454</a>)</li> <li><strong>kit,nitro,nuxt,schema,vite:</strong> Add build profiling (<a href="https://github.com/nuxt/nuxt/pull/34468" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34468/hovercard">#34468</a>)</li> <li><strong>nuxt,kit,schema:</strong> Add a factory function for <code>useFetch</code> and <code>useAsyncData</code> (<a href="https://github.com/nuxt/nuxt/pull/32300" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32300/hovercard">#32300</a>)</li> </ul> <h3>๐Ÿ”ฅ Performance</h3> <ul> <li><strong>nuxt:</strong> Disable NuxtLink visibility prefetching in dev mode (<a href="https://github.com/nuxt/nuxt/pull/34325" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34325/hovercard">#34325</a>)</li> <li><strong>nuxt,vite,webpack:</strong> Use string parsing for module ids (<a href="https://github.com/nuxt/nuxt/pull/34451" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34451/hovercard">#34451</a>)</li> <li><strong>nitro,schema:</strong> Inline payload in HTML for cached routes + add <code>payloadExtraction: 'client'</code> (<a href="https://github.com/nuxt/nuxt/pull/34410" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34410/hovercard">#34410</a>)</li> </ul> <h3>๐Ÿฉน Fixes</h3> <ul> <li><strong>schema:</strong> Do not bundle types (<a href="https://github.com/nuxt/nuxt/pull/34300" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34300/hovercard">#34300</a>)</li> <li><strong>nuxt:</strong> Always inject explicit prerender routes into prerender queue (<a href="https://github.com/nuxt/nuxt/pull/34311" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34311/hovercard">#34311</a>)</li> <li><strong>vite:</strong> Resolve package CSS paths in dev manifest (<a href="https://github.com/nuxt/nuxt/pull/34303" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34303/hovercard">#34303</a>)</li> <li><strong>nuxt:</strong> Wait for layout transition to finish before scrolling to top (<a href="https://github.com/nuxt/nuxt/pull/34206" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34206/hovercard">#34206</a>)</li> <li><strong>kit:</strong> Prevent duplicate <code>moduleDependencies</code> options (<a href="https://github.com/nuxt/nuxt/pull/34330" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34330/hovercard">#34330</a>)</li> <li><strong>nuxt:</strong> Retain promise methods after destructuring (<a href="https://github.com/nuxt/nuxt/pull/34319" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34319/hovercard">#34319</a>)</li> <li><strong>nitro:</strong> Encode forward slashes in payload (<a href="https://github.com/nuxt/nuxt/pull/34375" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34375/hovercard">#34375</a>)</li> <li><strong>nuxt:</strong> Do not cache <code>_payload.json</code> in dev mode (<a href="https://github.com/nuxt/nuxt/pull/34365" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34365/hovercard">#34365</a>)</li> <li><strong>nuxt:</strong> Accept refs as inputs in <code>NuxtLink.useLink</code> (<a href="https://github.com/nuxt/nuxt/pull/34380" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34380/hovercard">#34380</a>)</li> <li><strong>vite:</strong> Add nitro dev handler after vite proxy middleware (<a href="https://github.com/nuxt/nuxt/pull/34349" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34349/hovercard">#34349</a>)</li> <li><strong>nuxt:</strong> Hydrate prerendered pages with initial route + replace after hydration (<a href="https://github.com/nuxt/nuxt/pull/34211" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34211/hovercard">#34211</a>)</li> <li><strong>nitro:</strong> Escape strings rendered within js payload script tags (<a href="https://github.com/nuxt/nuxt/commit/d52a4fdd7">d52a4fdd7</a>)</li> <li><strong>vite:</strong> Recreate ViteNodeServer after config restart (<a href="https://github.com/nuxt/nuxt/pull/34396" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34396/hovercard">#34396</a>)</li> <li><strong>nitro:</strong> Allow navigation from error page to external protocols (<a href="https://github.com/nuxt/nuxt/pull/34405" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34405/hovercard">#34405</a>)</li> <li><strong>nitro,nuxt,schema:</strong> Don't extract payloads w/ <code>ssr: false</code> (<a href="https://github.com/nuxt/nuxt/pull/34327" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34327/hovercard">#34327</a>)</li> <li><strong>nuxt:</strong> Replace destr with JSON.parse in cookie encode/decode (<a href="https://github.com/nuxt/nuxt/pull/34452" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34452/hovercard">#34452</a>)</li> <li><strong>vite:</strong> Normalise development ssr app stacktrace (<a href="https://github.com/nuxt/nuxt/pull/33989" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33989/hovercard">#33989</a>)</li> <li><strong>vite:</strong> Update ssr styles plugin for rolldown compatibility (<a href="https://github.com/nuxt/nuxt/pull/34435" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34435/hovercard">#34435</a>)</li> <li><strong>nuxt:</strong> Script block extract regex conflict (<a href="https://github.com/nuxt/nuxt/pull/34412" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34412/hovercard">#34412</a>)</li> <li><strong>vite:</strong> Move <code>rollup-plugin-visualizer</code> to optional peer dep (<a href="https://github.com/nuxt/nuxt/pull/34458" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34458/hovercard">#34458</a>)</li> <li><strong>nuxt:</strong> Restore island head entries from payload during hydration (<a href="https://github.com/nuxt/nuxt/pull/34491" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34491/hovercard">#34491</a>)</li> <li><strong>kit:</strong> Share <code>asyncNuxtStorage</code> across kit instances (<a href="https://github.com/nuxt/nuxt/pull/34492" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34492/hovercard">#34492</a>)</li> <li><strong>nuxt:</strong> Close BroadcastChannel and add error handling in refreshCookie (<a href="https://github.com/nuxt/nuxt/pull/34508" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34508/hovercard">#34508</a>)</li> <li><strong>nuxt:</strong> Check file freshness before truncating in cache restore (<a href="https://github.com/nuxt/nuxt/pull/34509" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34509/hovercard">#34509</a>)</li> <li><strong>nuxt:</strong> Never preload manifest (<a href="https://github.com/nuxt/nuxt/pull/34511" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34511/hovercard">#34511</a>)</li> <li><strong>nitro:</strong> Validate island handler context (<a href="https://github.com/nuxt/nuxt/pull/34510" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34510/hovercard">#34510</a>)</li> <li><strong>nuxt:</strong> Pass deleteCount to splice in preloadRouteComponents (<a href="https://github.com/nuxt/nuxt/pull/34514" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34514/hovercard">#34514</a>)</li> <li><strong>nuxt:</strong> Fix cookie expiration timeout for long-lived cookies (<a href="https://github.com/nuxt/nuxt/pull/34513" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34513/hovercard">#34513</a>)</li> <li><strong>nuxt:</strong> Handle rejected promise in view transition abort (<a href="https://github.com/nuxt/nuxt/pull/34515" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34515/hovercard">#34515</a>)</li> </ul> <h3>๐Ÿ’… Refactors</h3> <ul> <li><strong>nuxt:</strong> Nullish coalesce instead of non-null assertions (<a href="https://github.com/nuxt/nuxt/pull/34331" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34331/hovercard">#34331</a>)</li> <li><strong>nitro,vite:</strong> Set ssr export conditions + vue feature flags within nitro builder (<a href="https://github.com/nuxt/nuxt/pull/34379" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34379/hovercard">#34379</a>)</li> <li><strong>nitro,nuxt:</strong> Add <code>/h3</code> subpath export for forward-compat (<a href="https://github.com/nuxt/nuxt/pull/34383" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34383/hovercard">#34383</a>)</li> <li><strong>nuxt:</strong> Use JSON.parse instead of <code>destr</code> (<a href="https://github.com/nuxt/nuxt/pull/34037" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34037/hovercard">#34037</a>)</li> <li><strong>vite:</strong> Use vite's <code>transformWithEsbuild</code> for analysis (<a href="https://github.com/nuxt/nuxt/pull/34447" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34447/hovercard">#34447</a>)</li> <li><strong>nitro,vite:</strong> Use babel for experimental decorator support (<a href="https://github.com/nuxt/nuxt/pull/34465" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34465/hovercard">#34465</a>)</li> <li><strong>webpack:</strong> Remove unused <code>event.context.webpack</code> code (<a href="https://github.com/nuxt/nuxt/pull/34502" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34502/hovercard">#34502</a>)</li> </ul> <h3>๐Ÿ“– Documentation</h3> <ul> <li>Update instructions for typedPages with public hoist pattern (<a href="https://github.com/nuxt/nuxt/pull/34285" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34285/hovercard">#34285</a>)</li> <li>Add alternative editor LSP setup guidance (<a href="https://github.com/nuxt/nuxt/pull/34322" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34322/hovercard">#34322</a>)</li> <li>Improve <code>&lt;NuxtImg&gt;</code> fetch priority example (<a href="https://github.com/nuxt/nuxt/pull/34341" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34341/hovercard">#34341</a>)</li> <li>Update Cloudflare dashboard path (<a href="https://github.com/nuxt/nuxt/pull/34372" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34372/hovercard">#34372</a>)</li> <li>Clarify --preset option in nuxt build command (<a href="https://github.com/nuxt/nuxt/pull/34335" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34335/hovercard">#34335</a>)</li> <li>Add shared/ directory to Nuxt 4 upgrade guide (<a href="https://github.com/nuxt/nuxt/pull/34391" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34391/hovercard">#34391</a>)</li> <li>Update link redirects + reduce checking flakiness (<a href="https://github.com/nuxt/nuxt/commit/01aa49659">01aa49659</a>)</li> <li>Add import for fileURLToPath in example code (<a href="https://github.com/nuxt/nuxt/pull/34401" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34401/hovercard">#34401</a>)</li> <li>Capitalise title (<a href="https://github.com/nuxt/nuxt/pull/34395" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34395/hovercard">#34395</a>)</li> <li>Update testing guide to test-utils v4 (<a href="https://github.com/nuxt/nuxt/pull/34408" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34408/hovercard">#34408</a>)</li> <li>Add pending back for <code>useFetch</code> + <code>useLazyFetch</code> docs (<a href="https://github.com/nuxt/nuxt/pull/34449" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34449/hovercard">#34449</a>)</li> <li>Correct md heading level (<a href="https://github.com/nuxt/nuxt/pull/34467" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34467/hovercard">#34467</a>)</li> <li>Fix twoslash code examples (<a href="https://github.com/nuxt/nuxt/pull/34469" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34469/hovercard">#34469</a>)</li> <li>Remove duplicated word (<a href="https://github.com/nuxt/nuxt/commit/5a22feaec">5a22feaec</a>)</li> <li>Add typed layout props docs (<a href="https://github.com/nuxt/nuxt/pull/34507" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34507/hovercard">#34507</a>)</li> </ul> <h3>๐Ÿก Chore</h3> <ul> <li>Prevent layout shift on banner image readme (<a href="https://github.com/nuxt/nuxt/pull/34309" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34309/hovercard">#34309</a>)</li> <li>Use npmx links ๐Ÿ’– (<a href="https://github.com/nuxt/nuxt/pull/34340" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34340/hovercard">#34340</a>)</li> <li>Use <code>nuxt/.github</code> pr template (<a href="https://github.com/nuxt/nuxt/commit/5502ccd7b">5502ccd7b</a>)</li> <li>Update link for nuxt ossf badge (<a href="https://github.com/nuxt/nuxt/pull/34406" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34406/hovercard">#34406</a>)</li> <li>Remove unnecessary workspace resolutions (<a href="https://github.com/nuxt/nuxt/pull/34453" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34453/hovercard">#34453</a>)</li> <li>Migrate npm badges and links to npmx.dev (<a href="https://github.com/nuxt/nuxt/commit/71eb13c21">71eb13c21</a>)</li> <li>Publish 4.x releases to <code>4x</code> and <code>latest</code> tags (<a href="https://github.com/nuxt/nuxt/commit/1bc9bfd10">1bc9bfd10</a>)</li> <li>Enforce consistent return-await usage (<a href="https://github.com/nuxt/nuxt/pull/34490" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34490/hovercard">#34490</a>)</li> <li><strong>vite:</strong> Optional chaining for nitroApp.hooks (<a href="https://github.com/nuxt/nuxt/commit/24a12c810">24a12c810</a>)</li> <li><strong>kit:</strong> Cast nitroConfig to <code>any</code> (<a href="https://github.com/nuxt/nuxt/commit/cc380ba3b">cc380ba3b</a>)</li> <li>Expand <code>engines.node</code> following <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4034843119" data-permission-text="Title is private" data-url="https://github.com/nuxt/nuxt/issues/34458" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34458/hovercard" href="https://github.com/nuxt/nuxt/pull/34458">#34458</a> (<a href="https://github.com/nuxt/nuxt/issues/34458" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34458/hovercard">#34458</a>)</li> <li>Update <code>installed-check</code> and <code>engines.node</code> (<a href="https://github.com/nuxt/nuxt/commit/0c5869c2d">0c5869c2d</a>)</li> <li>Lint (<a href="https://github.com/nuxt/nuxt/commit/31028d2e0">31028d2e0</a>)</li> </ul> <h3>โœ… Tests</h3> <ul> <li>Add page path gen benchmark (<a href="https://github.com/nuxt/nuxt/pull/34315" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34315/hovercard">#34315</a>)</li> <li>Add dev server benchmark for page route generation (<a href="https://github.com/nuxt/nuxt/pull/34323" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34323/hovercard">#34323</a>)</li> <li>Skip bundle tests when running in stubbed mode (<a href="https://github.com/nuxt/nuxt/pull/34450" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34450/hovercard">#34450</a>)</li> <li>Remove curly braces from inlined css expectations (<a href="https://github.com/nuxt/nuxt/commit/c9ab2747f">c9ab2747f</a>)</li> <li>Update bundle size (<a href="https://github.com/nuxt/nuxt/commit/f8e243a57">f8e243a57</a>)</li> <li>Update bundle size (<a href="https://github.com/nuxt/nuxt/commit/102f7ffe1">102f7ffe1</a>)</li> <li>Update bundle size (<a href="https://github.com/nuxt/nuxt/commit/dcebd1800">dcebd1800</a>)</li> </ul> <h3>๐Ÿค– CI</h3> <ul> <li>Optimise ci workflows (<a href="https://github.com/nuxt/nuxt/pull/34274" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34274/hovercard">#34274</a>)</li> <li>Run benchmarks on pushes to <code>main</code> (<a href="https://github.com/nuxt/nuxt/commit/6abf31062">6abf31062</a>)</li> <li>Avoid checkout in <code>issue-needs-reproduction</code> (<a href="https://github.com/nuxt/nuxt/commit/7849b34c8">7849b34c8</a>)</li> <li>Merge all issue labelled workflows (<a href="https://github.com/nuxt/nuxt/commit/fdd30349a">fdd30349a</a>)</li> <li>Fail fast on matrices for merge groups (<a href="https://github.com/nuxt/nuxt/commit/1008d3afd">1008d3afd</a>)</li> <li>More perf optimisations for merge queues (<a href="https://github.com/nuxt/nuxt/commit/297e4e526">297e4e526</a>)</li> <li>Move build step after runtime/unit tests (<a href="https://github.com/nuxt/nuxt/pull/34388" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34388/hovercard">#34388</a>)</li> <li>Update default branches (<a href="https://github.com/nuxt/nuxt/commit/ba251c697">ba251c697</a>)</li> <li>Bump matrix timeout (<a href="https://github.com/nuxt/nuxt/commit/9026c16c8">9026c16c8</a>)</li> <li>Give <code>issues: write</code> permission to needs-reproduction workflow (<a href="https://github.com/nuxt/nuxt/commit/ba3412b49">ba3412b49</a>)</li> <li>Include <code>v5</code> prefix in skip-changelog filter (<a href="https://github.com/nuxt/nuxt/commit/dbc1a8666">dbc1a8666</a>)</li> <li>Don't run actions against release PRs (<a href="https://github.com/nuxt/nuxt/commit/961589297">961589297</a>)</li> <li>Run ci on push to 4.x/3.x (<a href="https://github.com/nuxt/nuxt/commit/9240729e8">9240729e8</a>)</li> <li>Only run provenance check on PRs (<a href="https://github.com/nuxt/nuxt/commit/5ba227449">5ba227449</a>)</li> </ul> <h3>โค๏ธ Contributors</h3> <ul> <li>Daniel Roe (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/danielroe/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/danielroe">@danielroe</a>)</li> <li>Ori (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oritwoen/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oritwoen">@oritwoen</a>)</li> <li>Yoshihiro Yamaguchi (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/yamachi4416/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/yamachi4416">@yamachi4416</a>)</li> <li>Logan (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iml885203/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iml885203">@iml885203</a>)</li> <li>Shiminori (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/noriyuki-shimizu/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/noriyuki-shimizu">@noriyuki-shimizu</a>)</li> <li>Unai Mengual (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/owlnai/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/owlnai">@owlnai</a>)</li> <li>Zoolpex (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Zoolpex/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Zoolpex">@Zoolpex</a>)</li> <li>Harlan Wilton (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/harlan-zw/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/harlan-zw">@harlan-zw</a>)</li> <li>Julien Huang (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/huang-julien/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/huang-julien">@huang-julien</a>)</li> <li>ๅฑฑๅน่‰ฒๅพกๅฎˆ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/KazariEX/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/KazariEX">@KazariEX</a>)</li> <li>Max (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/onmax/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/onmax">@onmax</a>)</li> <li>Alex Korytskyi (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/alex-key/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/alex-key">@alex-key</a>)</li> <li>abeer0 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iiio2/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iiio2">@iiio2</a>)</li> <li>Johannes Przymusinski (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/cngJo/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/cngJo">@cngJo</a>)</li> <li>Adam Patterson (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/adampatterson/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/adampatterson">@adampatterson</a>)</li> <li>Florian Heuberger (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Flo0806/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Flo0806">@Flo0806</a>)</li> <li>Lorenzo Fiamingo (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/lorenzofiamingo/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/lorenzofiamingo">@lorenzofiamingo</a>)</li> <li>Vida Xie (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/9romise/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/9romise">@9romise</a>)</li> <li>Ihor (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/riabinkovihor/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/riabinkovihor">@riabinkovihor</a>)</li> <li>Harm Zeinstra (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Harm-Nullix/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Harm-Nullix">@Harm-Nullix</a>)</li> <li>Roli Bosch (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roli-lpci/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roli-lpci">@roli-lpci</a>)</li> <li>Fabian Kirchhoff (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/fabkho/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/fabkho">@fabkho</a>)</li> <li>Eduardo San Martin Morote (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/posva/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/posva">@posva</a>)</li> <li>Henry (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/lllomh/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/lllomh">@lllomh</a>)</li> <li>Davin`GM (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/DavinGM/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/DavinGM">@DavinGM</a>)</li> <li>Alexander Lichter (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/TheAlexLichter/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/TheAlexLichter">@TheAlexLichter</a>)</li> <li>Paul Melero (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/paulmelero/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/paulmelero">@paulmelero</a>)</li> <li>dependabot[bot] (<a class="user-mention notranslate" data-hovercard-type="organization" data-hovercard-url="/orgs/dependabot/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dependabot">@dependabot</a>[bot])</li> <li>Martin Arce (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/divagueame/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/divagueame">@divagueame</a>)</li> <li>edison (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/edison1105/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/edison1105">@edison1105</a>)</li> <li>Bobbie Goede (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/BobbieGoede/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/BobbieGoede">@BobbieGoede</a>)</li> <li>Nemanja Malesija (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/nemanjamalesija/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/nemanjamalesija">@nemanjamalesija</a>)</li> <li>Damian Gล‚owala (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/DamianGlowala/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/DamianGlowala">@DamianGlowala</a>)</li> <li>David Nahodyl (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Smef/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Smef">@Smef</a>)</li> <li>Benjamin Canac (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/benjamincanac/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/benjamincanac">@benjamincanac</a>)</li> </ul> danielroe tag:github.com,2008:Repository/71995937/v3.21.2 2026-03-12T11:26:37Z v3.21.2 <p>v3.21.2</p> github-actions[bot] tag:github.com,2008:Repository/71995937/v4.3.1 2026-02-07T16:56:17Z v4.3.1 <blockquote> <p>4.3.1 is a regularly scheduled patch release.</p> </blockquote> <h2>๐Ÿ‘‰ Changelog</h2> <p><a href="https://github.com/nuxt/nuxt/compare/v4.3.0...v4.3.1">compare changes</a></p> <h3>๐Ÿฉน Fixes</h3> <ul> <li><strong>nuxt:</strong> Correct reference format of server builder (<a href="https://github.com/nuxt/nuxt/pull/34177" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34177/hovercard">#34177</a>)</li> <li><strong>nuxt:</strong> Add status/statusText getters to NuxtError (<a href="https://github.com/nuxt/nuxt/pull/34188" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34188/hovercard">#34188</a>)</li> <li><strong>nuxt:</strong> Don't inject shared types for differing auto-imports (<a href="https://github.com/nuxt/nuxt/pull/34191" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34191/hovercard">#34191</a>)</li> <li><strong>schema:</strong> Add direnv and vendor to default ignore (<a href="https://github.com/nuxt/nuxt/pull/34190" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34190/hovercard">#34190</a>)</li> <li><strong>nuxt:</strong> Focus hash links after navigation (<a href="https://github.com/nuxt/nuxt/pull/34193" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34193/hovercard">#34193</a>)</li> <li><strong>nuxt:</strong> Exclude head runtime from unhead imports transform (<a href="https://github.com/nuxt/nuxt/pull/34195" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34195/hovercard">#34195</a>)</li> <li><strong>kit:</strong> Include prereleases in semver satisfy check (<a href="https://github.com/nuxt/nuxt/pull/34210" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34210/hovercard">#34210</a>)</li> <li><strong>nitro:</strong> Encode unicode paths in <code>x-nitro-prerender</code> header (<a href="https://github.com/nuxt/nuxt/pull/34202" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34202/hovercard">#34202</a>)</li> <li><strong>nuxt:</strong> Watch <code>server/</code> for <code>builder:watch</code> hook (<a href="https://github.com/nuxt/nuxt/pull/34208" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34208/hovercard">#34208</a>)</li> <li><strong>nitro:</strong> Preserve <code>error.message</code> for fatal errors (<a href="https://github.com/nuxt/nuxt/pull/34226" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34226/hovercard">#34226</a>)</li> <li>Only enable dynamic imports when ts plugin (<a href="https://github.com/nuxt/nuxt/pull/34205" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34205/hovercard">#34205</a>)</li> <li><strong>webpack:</strong> Use H3Error for 403 in dev server (<a href="https://github.com/nuxt/nuxt/pull/34233" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34233/hovercard">#34233</a>)</li> <li><strong>nuxt:</strong> Ensure NuxtError extends Error type (<a href="https://github.com/nuxt/nuxt/pull/34242" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34242/hovercard">#34242</a>)</li> <li><strong>vite:</strong> Use H3Error for 404 in dev server (<a href="https://github.com/nuxt/nuxt/pull/34225" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34225/hovercard">#34225</a>)</li> <li><strong>nuxt:</strong> Add backwards compat for <code>#app</code> barrel export in keyed functions (<a href="https://github.com/nuxt/nuxt/pull/34199" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34199/hovercard">#34199</a>)</li> <li><strong>nuxt:</strong> Track + re-add custom routes on hmr (<a href="https://github.com/nuxt/nuxt/pull/32044" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32044/hovercard">#32044</a>)</li> <li><strong>nuxt:</strong> Keep vnode when leaving deeper nested route (<a href="https://github.com/nuxt/nuxt/pull/33778" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33778/hovercard">#33778</a>)</li> <li><strong>vite:</strong> Prevent CSS flickering in dev mode after config changes (<a href="https://github.com/nuxt/nuxt/pull/33856" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33856/hovercard">#33856</a>)</li> <li><strong>nuxt:</strong> Do not start view transition if there is no route (<a href="https://github.com/nuxt/nuxt/pull/33723" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33723/hovercard">#33723</a>)</li> <li><strong>nuxt:</strong> Call deferHydration done on NuxtPage unmount (<a href="https://github.com/nuxt/nuxt/pull/34152" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34152/hovercard">#34152</a>)</li> <li><strong>nuxt:</strong> Handle invalid <code>datetime in </code>` (<a href="https://github.com/nuxt/nuxt/pull/33992" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33992/hovercard">#33992</a>)</li> <li><strong>nuxt:</strong> Preserve middleware error status in 404 fallback (<a href="https://github.com/nuxt/nuxt/pull/34148" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34148/hovercard">#34148</a>)</li> <li><strong>nitro:</strong> Do not augment <code>nuxt/schema</code> (<a href="https://github.com/nuxt/nuxt/pull/34255" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34255/hovercard">#34255</a>)</li> <li><strong>nuxt:</strong> Cache manifest files to preserve buildId (<a href="https://github.com/nuxt/nuxt/pull/34002" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34002/hovercard">#34002</a>)</li> <li><strong>nuxt:</strong> Don't decode query string in SSR context URL (<a href="https://github.com/nuxt/nuxt/pull/34252" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34252/hovercard">#34252</a>)</li> <li><strong>nuxt:</strong> Allow specifying moduleDependencies by <code>meta.name</code> (<a href="https://github.com/nuxt/nuxt/pull/34263" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34263/hovercard">#34263</a>)</li> <li><strong>nuxt:</strong> Resolve <code>#components</code> import mapping conflict for packages outside rootDir (<a href="https://github.com/nuxt/nuxt/pull/34139" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34139/hovercard">#34139</a>)</li> <li><strong>vite,webpack:</strong> Use node.res to send 403/404 (<a href="https://github.com/nuxt/nuxt/pull/34266" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34266/hovercard">#34266</a>)</li> <li><strong>nitro,nuxt:</strong> Align path encoding with vue-router (<a href="https://github.com/nuxt/nuxt/pull/34265" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34265/hovercard">#34265</a>)</li> <li><strong>nitro:</strong> Augment <code>nuxt/schema</code> once more (<a href="https://github.com/nuxt/nuxt/commit/552bbd8d1">552bbd8d1</a>)</li> </ul> <h3>๐Ÿ’… Refactors</h3> <ul> <li><strong>nuxt:</strong> Prefer <code>genObjectKey</code> to omit unnecessary quotes (<a href="https://github.com/nuxt/nuxt/pull/34245" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34245/hovercard">#34245</a>)</li> <li><strong>nuxt:</strong> Use <code>ComponentProps</code> helper to extract layout props (<a href="https://github.com/nuxt/nuxt/pull/34248" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34248/hovercard">#34248</a>)</li> </ul> <h3>๐Ÿ“– Documentation</h3> <ul> <li>Update roadmap dates (<a href="https://github.com/nuxt/nuxt/pull/34166" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34166/hovercard">#34166</a>)</li> <li>Correct default value of <code>nitroAutoImports</code> (<a href="https://github.com/nuxt/nuxt/pull/34182" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34182/hovercard">#34182</a>)</li> <li>Clarify shared type context limitations for custom imports (<a href="https://github.com/nuxt/nuxt/pull/34194" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34194/hovercard">#34194</a>)</li> <li>Fix broken links (<a href="https://github.com/nuxt/nuxt/pull/34223" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34223/hovercard">#34223</a>)</li> <li>Document payload extraction for ISR/SWR routes (<a href="https://github.com/nuxt/nuxt/pull/34222" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34222/hovercard">#34222</a>)</li> <li>Update default aliases in configuration reference (<a href="https://github.com/nuxt/nuxt/pull/34237" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34237/hovercard">#34237</a>)</li> <li>Update example of email validation (<a href="https://github.com/nuxt/nuxt/pull/34247" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34247/hovercard">#34247</a>)</li> <li>Align server alias examples with <code>#server</code> and <code>rootDir</code> (<a href="https://github.com/nuxt/nuxt/pull/34259" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34259/hovercard">#34259</a>)</li> <li>Add documentation for <code>keyedComposables</code> (<a href="https://github.com/nuxt/nuxt/pull/34201" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34201/hovercard">#34201</a>)</li> </ul> <h3>๐Ÿก Chore</h3> <ul> <li>Remove <code>px</code> from <code>width</code> attribute (<a href="https://github.com/nuxt/nuxt/commit/8d1cbb27a">8d1cbb27a</a>)</li> <li>Add ai config in gitignore (<a href="https://github.com/nuxt/nuxt/pull/34220" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34220/hovercard">#34220</a>)</li> </ul> <h3>โœ… Tests</h3> <ul> <li>Vitest v4 compatibility (<a href="https://github.com/nuxt/nuxt/commit/825b2c202">825b2c202</a>)</li> <li>Add runtime tests for deeply nested <code>&lt;NuxtPage&gt;</code> navigation (<a href="https://github.com/nuxt/nuxt/commit/048efc030">048efc030</a>)</li> </ul> <h3>โค๏ธ Contributors</h3> <ul> <li>Daniel Roe (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/danielroe/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/danielroe">@danielroe</a>)</li> <li>Matej ฤŒernรฝ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/cernymatej/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/cernymatej">@cernymatej</a>)</li> <li>Octavio Araiza (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/8ctavio/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/8ctavio">@8ctavio</a>)</li> <li>Muhammad Yasir Ghaffar (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/M-YasirGhaffar/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/M-YasirGhaffar">@M-YasirGhaffar</a>)</li> <li>mrkaashee (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/mrkaashee/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/mrkaashee">@mrkaashee</a>)</li> <li>Max (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/onmax/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/onmax">@onmax</a>)</li> <li>Bobbie Goede (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/BobbieGoede/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/BobbieGoede">@BobbieGoede</a>)</li> <li>็บธ้นฟ/Zhilu (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/L33Z22L11/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/L33Z22L11">@L33Z22L11</a>)</li> <li>Florian Heuberger (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Flo0806/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Flo0806">@Flo0806</a>)</li> <li>ๅฑฑๅน่‰ฒๅพกๅฎˆ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/KazariEX/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/KazariEX">@KazariEX</a>)</li> <li>ExXTreMe315 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ExXTreMe315/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ExXTreMe315">@ExXTreMe315</a>)</li> <li>Eugene (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/FlexIDK/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/FlexIDK">@FlexIDK</a>)</li> <li>abeer0 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iiio2/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iiio2">@iiio2</a>)</li> <li>Jonas Thelemann (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/dargmuesli/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dargmuesli">@dargmuesli</a>)</li> <li>Erwan Jugand (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/erwanjugand/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/erwanjugand">@erwanjugand</a>)</li> </ul> danielroe tag:github.com,2008:Repository/71995937/v3.21.1 2026-02-07T16:55:47Z v3.21.1 <blockquote> <p>3.21.1 is a regularly schedule patch release.</p> </blockquote> <h2>๐Ÿ‘‰ Changelog</h2> <p><a href="https://github.com/nuxt/nuxt/compare/v3.21.0...v3.21.1">compare changes</a></p> <h3>๐Ÿฉน Fixes</h3> <ul> <li><strong>nuxt:</strong> Correct reference format of server builder (<a href="https://github.com/nuxt/nuxt/pull/34177" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34177/hovercard">#34177</a>)</li> <li><strong>nuxt:</strong> Add status/statusText getters to NuxtError (<a href="https://github.com/nuxt/nuxt/pull/34188" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34188/hovercard">#34188</a>)</li> <li><strong>schema:</strong> Add direnv and vendor to default ignore (<a href="https://github.com/nuxt/nuxt/pull/34190" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34190/hovercard">#34190</a>)</li> <li><strong>nuxt:</strong> Focus hash links after navigation (<a href="https://github.com/nuxt/nuxt/pull/34193" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34193/hovercard">#34193</a>)</li> <li><strong>nuxt:</strong> Exclude head runtime from unhead imports transform (<a href="https://github.com/nuxt/nuxt/pull/34195" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34195/hovercard">#34195</a>)</li> <li><strong>kit:</strong> Include prereleases in semver satisfy check (<a href="https://github.com/nuxt/nuxt/pull/34210" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34210/hovercard">#34210</a>)</li> <li><strong>nuxt:</strong> Watch <code>server/</code> for <code>builder:watch</code> hook (<a href="https://github.com/nuxt/nuxt/pull/34208" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34208/hovercard">#34208</a>)</li> <li><strong>nitro:</strong> Encode unicode paths in <code>x-nitro-prerender</code> header (<a href="https://github.com/nuxt/nuxt/pull/34202" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34202/hovercard">#34202</a>)</li> <li><strong>nitro:</strong> Preserve <code>error.message</code> for fatal errors (<a href="https://github.com/nuxt/nuxt/pull/34226" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34226/hovercard">#34226</a>)</li> <li>Only enable dynamic imports when ts plugin (<a href="https://github.com/nuxt/nuxt/pull/34205" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34205/hovercard">#34205</a>)</li> <li><strong>webpack:</strong> Use H3Error for 403 in dev server (<a href="https://github.com/nuxt/nuxt/pull/34233" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34233/hovercard">#34233</a>)</li> <li><strong>nuxt:</strong> Ensure NuxtError extends Error type (<a href="https://github.com/nuxt/nuxt/pull/34242" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34242/hovercard">#34242</a>)</li> <li><strong>vite:</strong> Use H3Error for 404 in dev server (<a href="https://github.com/nuxt/nuxt/pull/34225" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34225/hovercard">#34225</a>)</li> <li><strong>nuxt:</strong> Add backwards compat for <code>#app</code> barrel export in keyed functions (<a href="https://github.com/nuxt/nuxt/pull/34199" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34199/hovercard">#34199</a>)</li> <li><strong>nuxt:</strong> Track + re-add custom routes on hmr (<a href="https://github.com/nuxt/nuxt/pull/32044" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32044/hovercard">#32044</a>)</li> <li><strong>nuxt:</strong> Keep vnode when leaving deeper nested route (<a href="https://github.com/nuxt/nuxt/pull/33778" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33778/hovercard">#33778</a>)</li> <li><strong>vite:</strong> Prevent CSS flickering in dev mode after config changes (<a href="https://github.com/nuxt/nuxt/pull/33856" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33856/hovercard">#33856</a>)</li> <li><strong>nuxt:</strong> Do not start view transition if there is no route (<a href="https://github.com/nuxt/nuxt/pull/33723" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33723/hovercard">#33723</a>)</li> <li><strong>nuxt:</strong> Call deferHydration done on NuxtPage unmount (<a href="https://github.com/nuxt/nuxt/pull/34152" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34152/hovercard">#34152</a>)</li> <li><strong>nuxt:</strong> Handle invalid <code>datetime in </code>` (<a href="https://github.com/nuxt/nuxt/pull/33992" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33992/hovercard">#33992</a>)</li> <li><strong>nuxt:</strong> Preserve middleware error status in 404 fallback (<a href="https://github.com/nuxt/nuxt/pull/34148" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34148/hovercard">#34148</a>)</li> <li><strong>nitro:</strong> Do not augment <code>nuxt/schema</code> (<a href="https://github.com/nuxt/nuxt/pull/34255" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34255/hovercard">#34255</a>)</li> <li><strong>nuxt:</strong> Cache manifest files to preserve buildId (<a href="https://github.com/nuxt/nuxt/pull/34002" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34002/hovercard">#34002</a>)</li> <li><strong>nuxt:</strong> Don't decode query string in SSR context URL (<a href="https://github.com/nuxt/nuxt/pull/34252" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34252/hovercard">#34252</a>)</li> <li><strong>nuxt:</strong> Allow specifying moduleDependencies by <code>meta.name</code> (<a href="https://github.com/nuxt/nuxt/pull/34263" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34263/hovercard">#34263</a>)</li> <li><strong>nuxt:</strong> Resolve <code>#components</code> import mapping conflict for packages outside rootDir (<a href="https://github.com/nuxt/nuxt/pull/34139" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34139/hovercard">#34139</a>)</li> <li><strong>vite,webpack:</strong> Use node.res to send 403/404 (<a href="https://github.com/nuxt/nuxt/pull/34266" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34266/hovercard">#34266</a>)</li> <li><strong>nitro,nuxt:</strong> Align path encoding with vue-router (<a href="https://github.com/nuxt/nuxt/pull/34265" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34265/hovercard">#34265</a>)</li> <li><strong>nitro:</strong> Augment <code>nuxt/schema</code> once more (<a href="https://github.com/nuxt/nuxt/commit/9f5bb611d">9f5bb611d</a>)</li> </ul> <h3>๐Ÿ’… Refactors</h3> <ul> <li><strong>nuxt:</strong> Prefer <code>genObjectKey</code> to omit unnecessary quotes (<a href="https://github.com/nuxt/nuxt/pull/34245" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34245/hovercard">#34245</a>)</li> <li><strong>nuxt:</strong> Use <code>ComponentProps</code> helper to extract layout props (<a href="https://github.com/nuxt/nuxt/pull/34248" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34248/hovercard">#34248</a>)</li> </ul> <h3>๐Ÿ“– Documentation</h3> <ul> <li>Remove link to ai guide entirely (<a href="https://github.com/nuxt/nuxt/commit/084b5d7f2">084b5d7f2</a>)</li> <li>Update roadmap dates (<a href="https://github.com/nuxt/nuxt/pull/34166" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34166/hovercard">#34166</a>)</li> <li>Clarify shared type context limitations for custom imports (<a href="https://github.com/nuxt/nuxt/pull/34194" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34194/hovercard">#34194</a>)</li> <li>Fix broken links (<a href="https://github.com/nuxt/nuxt/pull/34223" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34223/hovercard">#34223</a>)</li> <li>Document payload extraction for ISR/SWR routes (<a href="https://github.com/nuxt/nuxt/pull/34222" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34222/hovercard">#34222</a>)</li> <li>Update example of email validation (<a href="https://github.com/nuxt/nuxt/pull/34247" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34247/hovercard">#34247</a>)</li> <li>Add documentation for <code>keyedComposables</code> (<a href="https://github.com/nuxt/nuxt/pull/34201" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34201/hovercard">#34201</a>)</li> </ul> <h3>๐Ÿก Chore</h3> <ul> <li>Remove <code>px</code> from <code>width</code> attribute (<a href="https://github.com/nuxt/nuxt/commit/e80147f7d">e80147f7d</a>)</li> <li>Add ai config in gitignore (<a href="https://github.com/nuxt/nuxt/pull/34220" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34220/hovercard">#34220</a>)</li> </ul> <h3>โœ… Tests</h3> <ul> <li>Vitest v4 compatibility (<a href="https://github.com/nuxt/nuxt/commit/70e147b71">70e147b71</a>)</li> <li>Add runtime tests for deeply nested <code>&lt;NuxtPage&gt;</code> navigation (<a href="https://github.com/nuxt/nuxt/commit/707a9dc44">707a9dc44</a>)</li> <li>Resolve merge issues in tests (<a href="https://github.com/nuxt/nuxt/commit/85abddc54">85abddc54</a>)</li> </ul> <h3>โค๏ธ Contributors</h3> <ul> <li>Daniel Roe (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/danielroe/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/danielroe">@danielroe</a>)</li> <li>Matej ฤŒernรฝ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/cernymatej/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/cernymatej">@cernymatej</a>)</li> <li>Octavio Araiza (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/8ctavio/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/8ctavio">@8ctavio</a>)</li> <li>Muhammad Yasir Ghaffar (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/M-YasirGhaffar/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/M-YasirGhaffar">@M-YasirGhaffar</a>)</li> <li>Max (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/onmax/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/onmax">@onmax</a>)</li> <li>Bobbie Goede (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/BobbieGoede/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/BobbieGoede">@BobbieGoede</a>)</li> <li>็บธ้นฟ/Zhilu (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/L33Z22L11/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/L33Z22L11">@L33Z22L11</a>)</li> <li>Florian Heuberger (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Flo0806/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Flo0806">@Flo0806</a>)</li> <li>ๅฑฑๅน่‰ฒๅพกๅฎˆ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/KazariEX/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/KazariEX">@KazariEX</a>)</li> <li>ExXTreMe315 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ExXTreMe315/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ExXTreMe315">@ExXTreMe315</a>)</li> <li>Eugene (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/FlexIDK/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/FlexIDK">@FlexIDK</a>)</li> <li>abeer0 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iiio2/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iiio2">@iiio2</a>)</li> <li>Jonas Thelemann (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/dargmuesli/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dargmuesli">@dargmuesli</a>)</li> <li>Erwan Jugand (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/erwanjugand/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/erwanjugand">@erwanjugand</a>)</li> </ul> danielroe tag:github.com,2008:Repository/71995937/v4.3.0 2026-01-23T09:16:50Z v4.3.0 <blockquote> <p>4.3.0 is the next minor release.</p> </blockquote> <p>Nuxt 4.3 brings powerful new features for layouts, caching, and developer experience โ€“ plus significant performance improvements under the hood.</p> <h2>๐Ÿ“ฃ Some News</h2> <h3>Extended v3 Support</h3> <p>Early this month, I <a href="https://github.com/nuxt/nuxt/discussions/33918" data-hovercard-type="discussion" data-hovercard-url="/nuxt/nuxt/discussions/33918/hovercard">opened a discussion</a> to find out how the upgrade had gone from v3 to v4. I was really pleased to hear how well it had gone for most people.</p> <p>Having said that, we're committed to making sure no one gets left behind. And so we will <strong>continue to provide security updates and critical bug fix releases</strong> beyond the previously announced end-of-life date of January 31, 2026, meaning Nuxt v3 will meet its end-of-life on July 31, 2026.</p> <div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title"><svg class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>Tip</p><p>As usual, today also brings a minor release for v3, with many of the same improvements backported from v4.3.</p> </div> <h3>Preparing for Nuxt 5</h3> <p>We're closer than ever to the releases of Nuxt v5 and Nitro v3. In the coming weeks, the <code>main</code> branch of the Nuxt repository will begin receiving initial commits for Nuxt 5. However, it's still <strong>business as usual</strong>.</p> <ul> <li>Continue making pull requests to the <code>main</code> branch</li> <li>We'll backport changes to the <code>4.x</code> and <code>3.x</code> branches</li> </ul> <p>Keep an eye out on the <a href="https://nuxt.com/docs/4.x/getting-started/upgrade" rel="nofollow">Upgrade Guide</a> โ€“ we'll be adding details about how you can already start migrating your projects to prepare for Nuxt v4 with <code>future.compatibilityVersion: 5</code>.</p> <h2>๐Ÿ—‚๏ธ Route Rule Layouts</h2> <p>But that's enough about the future. We have a lot of good things for you today!</p> <p>First, you can now set layouts directly in route rules using the new <code>appLayout</code> property (<a href="https://github.com/nuxt/nuxt/pull/31092" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/31092/hovercard">#31092</a>). This provides a centralized, declarative way to manage layouts across your application without scattering <code>definePageMeta</code> calls throughout your pages.</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtConfig({ routeRules: { '/admin/**': { appLayout: 'admin' }, '/dashboard/**': { appLayout: 'dashboard' }, '/auth/**': { appLayout: 'minimal' } } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">routeRules</span>: <span class="pl-kos">{</span> <span class="pl-s">'/admin/**'</span>: <span class="pl-kos">{</span> <span class="pl-c1">appLayout</span>: <span class="pl-s">'admin'</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-s">'/dashboard/**'</span>: <span class="pl-kos">{</span> <span class="pl-c1">appLayout</span>: <span class="pl-s">'dashboard'</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-s">'/auth/**'</span>: <span class="pl-kos">{</span> <span class="pl-c1">appLayout</span>: <span class="pl-s">'minimal'</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>This might be useful for:</p> <ul> <li>Admin panels with a shared layout across many routes</li> <li>Marketing pages that need a different layout from the app</li> </ul> <div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title"><svg class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>Tip</p><p>Plus, you can pass props to layouts now! See <a href="#layout-props-with-setpagelayout">the <code>setPageLayout</code> improvements below</a>.</p> </div> <h2>๐Ÿ“ฆ ISR/SWR Payload Extraction</h2> <p>Payload extraction now works with ISR (incremental static regeneration), SWR (stale-while-revalidate) and cache <code>routeRules</code> (<a href="https://github.com/nuxt/nuxt/pull/33467" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33467/hovercard">#33467</a>). Previously, only pre-rendered pages could generate <code>_payload.json</code> files.</p> <p>This means:</p> <ul> <li>Client-side navigation to ISR/SWR pages can use cached payloads</li> <li>CDNs (Vercel, Netlify, Cloudflare) can cache payload files alongside HTML</li> <li>Fewer API calls during navigation โ€“ data can be prefetched and served from the cached payload</li> </ul> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtConfig({ routeRules: { '/products/**': { isr: 3600, // Revalidate every hour } } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">routeRules</span>: <span class="pl-kos">{</span> <span class="pl-s">'/products/**'</span>: <span class="pl-kos">{</span> <span class="pl-c1">isr</span>: <span class="pl-c1">3600</span><span class="pl-kos">,</span> <span class="pl-c">// Revalidate every hour</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <h2>๐Ÿงน Dev Mode Payload Extraction</h2> <p>Related to the above, payload extraction now also works in development mode (<a href="https://github.com/nuxt/nuxt/pull/30784" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/30784/hovercard">#30784</a>). This makes it easier to test and debug payload behavior without needing to run a production build.</p> <div class="markdown-alert markdown-alert-important"><p class="markdown-alert-title"><svg class="octicon octicon-report mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>Important</p><p>Payload extraction works in dev mode with <code>nitro.static</code> set to <code>true</code>, or for individual pages which have <code>isr</code>, <code>swr</code>, <code>prerender</code> or <code>cache</code> route rules.</p> </div> <h2>๐Ÿšซ Disable Modules from Layers</h2> <p>When extending Nuxt layers, you can now disable specific modules that you don't need (<a href="https://github.com/nuxt/nuxt/pull/33883" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33883/hovercard">#33883</a>). Just pass <code>false</code> to the module's options:</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtConfig({ extends: ['../shared-layer'], // disable @nuxt/image from layer image: false, })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">extends</span>: <span class="pl-kos">[</span><span class="pl-s">'../shared-layer'</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-c">// disable <span class="pl-k">@nuxt</span>/image from layer</span> <span class="pl-c1">image</span>: <span class="pl-c1">false</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <h2>๐Ÿท๏ธ Route Groups in Page Meta</h2> <p><a href="https://nuxt.com/docs/4.x/directory-structure/app/pages#route-groups" rel="nofollow">Route groups</a> (folders wrapped in parentheses like <code>(protected)/</code>) are now exposed in page meta (<a href="https://github.com/nuxt/nuxt/pull/33460" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33460/hovercard">#33460</a>). This makes it easy to check which groups a route belongs to in middleware or anywhere you have access to the route.</p> <div class="highlight highlight-text-html-vue notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;script setup lang=&quot;ts&quot;&gt; // This page's meta will include: { groups: ['protected'] } useRoute().meta.groups &lt;/script&gt;"><pre>&lt;<span class="pl-ent">script</span> setup lang="ts"&gt;<span class="pl-s1"></span> <span class="pl-s1"><span class="pl-c"><span class="pl-c">//</span> This page's meta will include: { groups: ['protected'] }</span></span> <span class="pl-s1"><span class="pl-en">useRoute</span>().<span class="pl-smi">meta</span>.<span class="pl-smi">groups</span></span> <span class="pl-s1"></span>&lt;/<span class="pl-ent">script</span>&gt;</pre></div> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtRouteMiddleware((to) =&gt; { if (to.meta.groups?.includes('protected') &amp;&amp; !isAuthenticated()) { return navigateTo('/login') } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtRouteMiddleware</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-s1">to</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> <span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-s1">to</span><span class="pl-kos">.</span><span class="pl-c1">meta</span><span class="pl-kos">.</span><span class="pl-c1">groups</span><span class="pl-kos">?.</span><span class="pl-en">includes</span><span class="pl-kos">(</span><span class="pl-s">'protected'</span><span class="pl-kos">)</span> <span class="pl-c1">&amp;&amp;</span> <span class="pl-c1">!</span><span class="pl-en">isAuthenticated</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-k">return</span> <span class="pl-en">navigateTo</span><span class="pl-kos">(</span><span class="pl-s">'/login'</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>This provides a clean, convention-based approach to route-level authorization without needing to add <code>definePageMeta</code> to every protected page.</p> <h2>๐ŸŽจ Layout Props with <code>setPageLayout</code></h2> <p>The <code>setPageLayout</code> composable now accepts a second parameter to pass props to your layout (<a href="https://github.com/nuxt/nuxt/pull/33805" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33805/hovercard">#33805</a>):</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtRouteMiddleware((to) =&gt; { setPageLayout('admin', { sidebar: true, theme: 'dark' }) })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtRouteMiddleware</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-s1">to</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> <span class="pl-en">setPageLayout</span><span class="pl-kos">(</span><span class="pl-s">'admin'</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">sidebar</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span> <span class="pl-c1">theme</span>: <span class="pl-s">'dark'</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <div class="highlight highlight-text-html-vue notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;script setup lang=&quot;ts&quot;&gt; defineProps&lt;{ sidebar?: boolean theme?: 'light' | 'dark' }&gt;() &lt;/script&gt;"><pre>&lt;<span class="pl-ent">script</span> setup lang="ts"&gt;<span class="pl-s1"></span> <span class="pl-s1"><span class="pl-en">defineProps</span>&lt;{</span> <span class="pl-s1"> sidebar<span class="pl-k">?</span><span class="pl-k">:</span> <span class="pl-c1">boolean</span></span> <span class="pl-s1"> theme<span class="pl-k">?</span><span class="pl-k">:</span> <span class="pl-s"><span class="pl-pds">'</span>light<span class="pl-pds">'</span></span> <span class="pl-k">|</span> <span class="pl-s"><span class="pl-pds">'</span>dark<span class="pl-pds">'</span></span></span> <span class="pl-s1">}&gt;()</span> <span class="pl-s1"></span>&lt;/<span class="pl-ent">script</span>&gt;</pre></div> <h2>๐Ÿ”ง <code>#server</code> Alias</h2> <p>A new <code>#server</code> alias provides clean imports within your server directory (<a href="https://github.com/nuxt/nuxt/pull/33870" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33870/hovercard">#33870</a>), similar to how <code>#shared</code> works:</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// Before: relative path hell import { helper } from '../../../../utils/helper' // After: clean and predictable import { helper } from '#server/utils/helper'"><pre><span class="pl-c">// Before: relative path hell</span> <span class="pl-k">import</span> <span class="pl-kos">{</span> <span class="pl-s1">helper</span> <span class="pl-kos">}</span> <span class="pl-k">from</span> <span class="pl-s">'../../../../utils/helper'</span> <span class="pl-c">// After: clean and predictable</span> <span class="pl-k">import</span> <span class="pl-kos">{</span> <span class="pl-s1">helper</span> <span class="pl-kos">}</span> <span class="pl-k">from</span> <span class="pl-s">'#server/utils/helper'</span></pre></div> <p>The alias includes import protection โ€“ you can't accidentally import <code>#server</code> code from client or shared contexts.</p> <h2>๐ŸชŸ Draggable Error Overlay</h2> <p>The development error overlay introduced in Nuxt 4.2 is now draggable and can be minimized (<a href="https://github.com/nuxt/nuxt/pull/33695" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33695/hovercard">#33695</a>). You can:</p> <ul> <li>Drag it to any corner of the screen (it snaps to edges)</li> <li>Minimize it to a small pill button when you want to keep working</li> <li>Your position and minimized state persist across page reloads</li> </ul> <p>This is a quality-of-life improvement when you're iterating on fixes and don't want the overlay blocking your view.</p> <p><a href="https://github.com/user-attachments/assets/nuxt_4-3_error_demo.mp4">https://github.com/user-attachments/assets/nuxt_4-3_error_demo.mp4</a></p> <h2>โš™๏ธ Async Plugin Constructors</h2> <p>Module authors can now use async functions when adding build plugins (<a href="https://github.com/nuxt/nuxt/pull/33619" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33619/hovercard">#33619</a>):</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtModule({ async setup() { // Lazy load only when actually needed addVitePlugin(() =&gt; import('my-cool-plugin').then(r =&gt; r.default())) // No need to load webpack plugin if using Vite addWebpackPlugin(() =&gt; import('my-cool-plugin/webpack').then(r =&gt; r.default())) } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtModule</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-k">async</span> <span class="pl-en">setup</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-c">// Lazy load only when actually needed</span> <span class="pl-en">addVitePlugin</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-k">import</span><span class="pl-kos">(</span><span class="pl-s">'my-cool-plugin'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">then</span><span class="pl-kos">(</span><span class="pl-s1">r</span> <span class="pl-c1">=&gt;</span> <span class="pl-s1">r</span><span class="pl-kos">.</span><span class="pl-en">default</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-c">// No need to load webpack plugin if using Vite</span> <span class="pl-en">addWebpackPlugin</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-k">import</span><span class="pl-kos">(</span><span class="pl-s">'my-cool-plugin/webpack'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">then</span><span class="pl-kos">(</span><span class="pl-s1">r</span> <span class="pl-c1">=&gt;</span> <span class="pl-s1">r</span><span class="pl-kos">.</span><span class="pl-en">default</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>This enables true lazy loading of build plugins, avoiding unnecessary code loading when plugins aren't needed.</p> <h2>๐Ÿš€ Performance Improvements</h2> <p>This release includes several performance optimizations for faster builds:</p> <ul> <li><strong>Hook filters</strong> - Internal plugins now use filters to avoid running hooks unnecessarily (<a href="https://github.com/nuxt/nuxt/pull/33898" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33898/hovercard">#33898</a>)</li> <li><strong>SSR styles optimization</strong> - The <code>nuxt:ssr-styles</code> plugin is now significantly faster (<a href="https://github.com/nuxt/nuxt/pull/33862" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33862/hovercard">#33862</a>, <a href="https://github.com/nuxt/nuxt/pull/33865" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33865/hovercard">#33865</a>)</li> <li><strong>Layer alias transform</strong> - Skipped when using Vite (it handles this natively) (<a href="https://github.com/nuxt/nuxt/pull/33864" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33864/hovercard">#33864</a>)</li> <li><strong>Route rules compilation</strong> - Route rules are now compiled into a client chunk using <code>rou3</code>, removing the need for <code>radix3</code> in the client bundle and eliminating app manifest fetches (<a href="https://github.com/nuxt/nuxt/pull/33920" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33920/hovercard">#33920</a>)</li> </ul> <h2>๐ŸŽจ Inline Styles for Webpack/Rspack</h2> <p>The <code>inlineStyles</code> feature now works with webpack and rspack builders (<a href="https://github.com/nuxt/nuxt/pull/33966" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33966/hovercard">#33966</a>), not just Vite. This enables critical CSS inlining for better Core Web Vitals regardless of your bundler choice.</p> <h2><g-emoji class="g-emoji" alias="warning">โš ๏ธ</g-emoji> Deprecations</h2> <h3><code>statusCode</code> โ†’ <code>status</code>, <code>statusMessage</code> โ†’ <code>statusText</code></h3> <p>In preparation for Nitro v3 and H3 v2, we're moving to use Web API naming conventions (<a href="https://github.com/nuxt/nuxt/pull/33912" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33912/hovercard">#33912</a>). The old properties still work but are deprecated in advance of v5:</p> <div class="highlight highlight-source-diff notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="- throw createError({ statusCode: 404, statusMessage: 'Not Found' }) + throw createError({ status: 404, statusText: 'Not Found' })"><pre><span class="pl-md"><span class="pl-md">-</span> throw createError({ statusCode: 404, statusMessage: 'Not Found' })</span> <span class="pl-mi1"><span class="pl-mi1">+</span> throw createError({ status: 404, statusText: 'Not Found' })</span></pre></div> <h2>๐Ÿ› Bug Fixes</h2> <p>Notable fixes in this release:</p> <ul> <li>Fixed head component deduplication using <code>key</code> attribute (<a href="https://github.com/nuxt/nuxt/pull/33958" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33958/hovercard">#33958</a>, <a href="https://github.com/nuxt/nuxt/pull/33963" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33963/hovercard">#33963</a>)</li> <li>Fixed async data properties not being reactive in Options API (<a href="https://github.com/nuxt/nuxt/pull/34119" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34119/hovercard">#34119</a>)</li> <li>Fixed <code>useCookie</code> unsafe number parsing during decode (<a href="https://github.com/nuxt/nuxt/pull/34007" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34007/hovercard">#34007</a>)</li> <li>Fixed <code>NuxtPage</code> not re-rendering when nested <code>NuxtLayout</code> has layouts disabled (<a href="https://github.com/nuxt/nuxt/pull/34078" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34078/hovercard">#34078</a>)</li> <li>Fixed client-side pathname decoding for non-ASCII route aliases (<a href="https://github.com/nuxt/nuxt/pull/34043" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34043/hovercard">#34043</a>)</li> <li>Fixed suspense remounting when navigating after pending state (<a href="https://github.com/nuxt/nuxt/pull/33991" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33991/hovercard">#33991</a>)</li> <li>Fixed clipboard copy in error overlay (<a href="https://github.com/nuxt/nuxt/pull/33873" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33873/hovercard">#33873</a>)</li> <li>Enabled <code>allowArbitraryExtensions</code> by default in TypeScript config (<a href="https://github.com/nuxt/nuxt/pull/34084" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34084/hovercard">#34084</a>)</li> <li>Added <code>noUncheckedIndexedAccess</code> to server tsconfig for safer typing (<a href="https://github.com/nuxt/nuxt/pull/33985" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33985/hovercard">#33985</a>)</li> </ul> <div class="markdown-alert markdown-alert-important"><p class="markdown-alert-title"><svg class="octicon octicon-report mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>Important</p><p>Enabling <code>noUncheckedIndexedAccess</code> in the Nitro server TypeScript config improves type safety but may surface new type errors in your server code. This change was necessary because Nuxt's app context performs type checks on server routes (<a href="https://nuxt.com/docs/4.x/guide/modules/recipes-advanced#known-limitations" rel="nofollow">learn more</a>).</p> <p>While we recommend keeping this enabled for better type safety, you can disable it if needed:</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtConfig({ nitro: { typescript: { tsConfig: { compilerOptions: { noUncheckedIndexedAccess: false } } } } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">nitro</span>: <span class="pl-kos">{</span> <span class="pl-c1">typescript</span>: <span class="pl-kos">{</span> <span class="pl-c1">tsConfig</span>: <span class="pl-kos">{</span> <span class="pl-c1">compilerOptions</span>: <span class="pl-kos">{</span> <span class="pl-c1">noUncheckedIndexedAccess</span>: <span class="pl-c1">false</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>Note that disabling this may allow type errors to slip through that could cause runtime issues with indexed access.</p> </div> <h2>๐Ÿ“š Documentation</h2> <ul> <li>Improved module author guides with clearer structure (<a href="https://github.com/nuxt/nuxt/pull/33803" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33803/hovercard">#33803</a>)</li> <li>Added MCP setup instructions for Claude Desktop (<a href="https://github.com/nuxt/nuxt/pull/33914" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33914/hovercard">#33914</a>)</li> <li>Added layers directory documentation (<a href="https://github.com/nuxt/nuxt/pull/33967" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33967/hovercard">#33967</a>)</li> <li>Added Deno package manager examples (<a href="https://github.com/nuxt/nuxt/pull/34070" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34070/hovercard">#34070</a>)</li> <li>Clarified type-checking context limitations for server routes (<a href="https://github.com/nuxt/nuxt/pull/33964" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33964/hovercard">#33964</a>)</li> </ul> <h2>๐ŸŽ‰ Nuxt 3.21.0</h2> <p>Alongside v4.3.0, we're releasing <strong>Nuxt v3.21.0</strong> with many of the same improvements backported to the 3.x branch. This release includes:</p> <ul> <li><strong>All the same features</strong>: Route rule layouts, ISR payload extraction, layout props with <code>setPageLayout</code>, <code>#server</code> alias, draggable error overlay, and more</li> <li><strong>All performance improvements</strong>: SSR styles optimization, hook filters, and route rules compilation</li> <li><strong>Module disabling</strong>: Disable layer modules by setting options to <code>false</code></li> <li><strong>Critical bug fixes</strong>: Async data reactivity in Options API, <code>useCookie</code> number parsing, head component deduplication, and more</li> </ul> <h2>โœ… Upgrading</h2> <p>Our recommendation for upgrading is to run:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="npx nuxt upgrade --dedupe # or, if you are upgrading to v3.21 npx nuxt@latest upgrade --dedupe --channel=v3"><pre>npx nuxt upgrade --dedupe <span class="pl-c"><span class="pl-c">#</span> or, if you are upgrading to v3.21</span> npx nuxt@latest upgrade --dedupe --channel=v3</pre></div> <p>This will deduplicate your lockfile and help ensure you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.</p> <div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title"><svg class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>Tip</p><p>Check out our <a href="https://nuxt.com/docs/getting-started/upgrade" rel="nofollow">upgrade guide</a> if upgrading from an older version.</p> </div> <h2>๐Ÿ‘‰ Changelog</h2> <p><a href="https://github.com/nuxt/nuxt/compare/v4.2.2...v4.3.0">compare changes</a></p> <h3>๐Ÿš€ Enhancements</h3> <ul> <li><strong>kit:</strong> Support async constructor for adding plugins (<a href="https://github.com/nuxt/nuxt/pull/33619" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33619/hovercard">#33619</a>)</li> <li><strong>kit:</strong> Export Nuxt major version type (<a href="https://github.com/nuxt/nuxt/pull/33700" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33700/hovercard">#33700</a>)</li> <li><strong>schema:</strong> Add <code>#server</code> alias for server directory imports (<a href="https://github.com/nuxt/nuxt/pull/33870" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33870/hovercard">#33870</a>)</li> <li><strong>ui-templates:</strong> Let it snow! โ„๏ธ (<a href="https://github.com/nuxt/nuxt/pull/33804" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33804/hovercard">#33804</a>)</li> <li><strong>schema:</strong> Hoist nitro <code>crossws</code> types (<a href="https://github.com/nuxt/nuxt/commit/5b16a51f5">5b16a51f5</a>)</li> <li><strong>nitro,nuxt:</strong> Compile route rules into client chunk (<a href="https://github.com/nuxt/nuxt/pull/33920" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33920/hovercard">#33920</a>)</li> <li><strong>nuxt:</strong> Allow disabling modules by setting module options to <code>false</code> (<a href="https://github.com/nuxt/nuxt/pull/33883" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33883/hovercard">#33883</a>)</li> <li><strong>kit:</strong> Allow specifying <code>moduleDependencies</code> as an async function (<a href="https://github.com/nuxt/nuxt/pull/33504" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33504/hovercard">#33504</a>)</li> <li><strong>nuxt:</strong> Support <code>appLayout</code> in route rules (<a href="https://github.com/nuxt/nuxt/pull/31092" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/31092/hovercard">#31092</a>)</li> <li><strong>nuxt:</strong> Add route groups to page meta (<a href="https://github.com/nuxt/nuxt/pull/33460" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33460/hovercard">#33460</a>)</li> <li><strong>nuxt:</strong> Enable payload extraction for ISR/SWR routes (<a href="https://github.com/nuxt/nuxt/pull/33467" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33467/hovercard">#33467</a>)</li> <li><strong>nuxt:</strong> Allow updating props with <code>setPageLayout</code> (<a href="https://github.com/nuxt/nuxt/pull/33805" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33805/hovercard">#33805</a>)</li> <li><strong>nuxt:</strong> Enable dragging and minimizing for error overlay (<a href="https://github.com/nuxt/nuxt/pull/33695" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33695/hovercard">#33695</a>)</li> <li><strong>nitro,nuxt:</strong> Add support for payload extraction in dev (<a href="https://github.com/nuxt/nuxt/pull/30784" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/30784/hovercard">#30784</a>)</li> <li><strong>rspack,webpack:</strong> Add inline styles (<a href="https://github.com/nuxt/nuxt/pull/33966" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33966/hovercard">#33966</a>)</li> <li><strong>kit:</strong> Add forward-compatible nitro types (<a href="https://github.com/nuxt/nuxt/pull/34036" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34036/hovercard">#34036</a>)</li> </ul> <h3>๐Ÿ”ฅ Performance</h3> <ul> <li><strong>nuxt:</strong> Do not init layer alias transform when using vite (<a href="https://github.com/nuxt/nuxt/pull/33864" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33864/hovercard">#33864</a>)</li> <li><strong>vite:</strong> Add hook filters for ssr styles plugin (<a href="https://github.com/nuxt/nuxt/pull/33865" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33865/hovercard">#33865</a>)</li> <li><strong>vite:</strong> Optimize <code>nuxt:ssr-styles</code> plugin (<a href="https://github.com/nuxt/nuxt/pull/33862" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33862/hovercard">#33862</a>)</li> <li><strong>nuxt:</strong> Use filter for vfs plugin load (<a href="https://github.com/nuxt/nuxt/commit/eb3d2d4c6">eb3d2d4c6</a>)</li> <li><strong>nuxt,vite:</strong> Use filters to avoid running hooks unnecessarily (<a href="https://github.com/nuxt/nuxt/commit/6b7fc7477">6b7fc7477</a>)</li> <li><strong>nuxt,vite:</strong> Add more filters to internal plugins (<a href="https://github.com/nuxt/nuxt/pull/33898" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33898/hovercard">#33898</a>)</li> </ul> <h3>๐Ÿฉน Fixes</h3> <ul> <li><strong>kit:</strong> Normalize local layer paths with trailing slashes (<a href="https://github.com/nuxt/nuxt/pull/33858" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33858/hovercard">#33858</a>)</li> <li><strong>nuxt:</strong> Avoid overwriting multiple head input in island handler (<a href="https://github.com/nuxt/nuxt/pull/33849" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33849/hovercard">#33849</a>)</li> <li><strong>nuxt:</strong> Update meta instead of calling <code>router.replace</code> in page hmr (<a href="https://github.com/nuxt/nuxt/pull/33897" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33897/hovercard">#33897</a>)</li> <li><strong>nuxt:</strong> Don't call <code>page:loading:end</code> in cache if already called (<a href="https://github.com/nuxt/nuxt/commit/7789f73bd">7789f73bd</a>)</li> <li><strong>vite:</strong> Add error handling for parsing <code>NUXT_VITE_NODE_OPTIONS</code> (<a href="https://github.com/nuxt/nuxt/commit/41a564d23">41a564d23</a>)</li> <li><strong>nuxt:</strong> Do not skip middleware when <code>appMiddleware</code> references invalid key (<a href="https://github.com/nuxt/nuxt/commit/323f27bc8">323f27bc8</a>)</li> <li><strong>nitro:</strong> Clipboard copy in error overlay (<a href="https://github.com/nuxt/nuxt/pull/33873" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33873/hovercard">#33873</a>)</li> <li><strong>webpack,rspack:</strong> Resolve deep imports in virtual files (<a href="https://github.com/nuxt/nuxt/pull/33927" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33927/hovercard">#33927</a>)</li> <li><strong>webpack:</strong> Disable async chunks in dev mode (<a href="https://github.com/nuxt/nuxt/commit/0310c4070">0310c4070</a>)</li> <li><strong>webpack:</strong> Correctly evaluate sourcemap name (<a href="https://github.com/nuxt/nuxt/commit/653f364af">653f364af</a>)</li> <li><strong>nuxt:</strong> Handle node10 resolution for <code>nuxt/meta</code> (<a href="https://github.com/nuxt/nuxt/commit/01c2c9b13">01c2c9b13</a>)</li> <li><strong>nuxt:</strong> Do not early return if component priorities conflict (<a href="https://github.com/nuxt/nuxt/pull/33955" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33955/hovercard">#33955</a>)</li> <li><strong>nuxt:</strong> Use <code>key</code> for tag deduplication in <code>&lt;Head&gt;</code> component (<a href="https://github.com/nuxt/nuxt/pull/33958" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33958/hovercard">#33958</a>)</li> <li><strong>schema,vite:</strong> Resolve <code>build.transpile</code> when initialising vite (<a href="https://github.com/nuxt/nuxt/pull/33868" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33868/hovercard">#33868</a>)</li> <li><strong>nuxt,rspack,webpack:</strong> Inject module identifiers for webpack builders (<a href="https://github.com/nuxt/nuxt/pull/33962" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33962/hovercard">#33962</a>)</li> <li><strong>nuxt:</strong> Add key to head components for proper deduplication (<a href="https://github.com/nuxt/nuxt/pull/33963" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33963/hovercard">#33963</a>)</li> <li><strong>nitro:</strong> Check prettyResponse.body type before error overlay (<a href="https://github.com/nuxt/nuxt/pull/33977" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33977/hovercard">#33977</a>)</li> <li><strong>nuxt:</strong> Don't URI-encode static route paths (<a href="https://github.com/nuxt/nuxt/pull/33990" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33990/hovercard">#33990</a>)</li> <li><strong>nuxt:</strong> Skip internal stub routes from prerender (<a href="https://github.com/nuxt/nuxt/pull/34001" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34001/hovercard">#34001</a>)</li> <li><strong>kit,schema:</strong> Align module <code>onUpgrade</code> arguments with types (<a href="https://github.com/nuxt/nuxt/pull/33988" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33988/hovercard">#33988</a>)</li> <li><strong>nuxt:</strong> Handle unsafe number parsing in useCookie decode (<a href="https://github.com/nuxt/nuxt/pull/34007" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34007/hovercard">#34007</a>)</li> <li><strong>nuxt:</strong> Do not externalise <code>rou3</code> (<a href="https://github.com/nuxt/nuxt/commit/2df4e1ae3">2df4e1ae3</a>)</li> <li><strong>nitro:</strong> Add <code>noUncheckedIndexedAccess</code> to server tsconfig (<a href="https://github.com/nuxt/nuxt/pull/33985" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33985/hovercard">#33985</a>)</li> <li><strong>nuxt:</strong> Add auto-import declarations for <code>shared/</code> context (<a href="https://github.com/nuxt/nuxt/pull/33978" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33978/hovercard">#33978</a>)</li> <li><strong>nuxt:</strong> Update global reference to globalThis in <code>useRequestFetch</code> (<a href="https://github.com/nuxt/nuxt/pull/33976" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33976/hovercard">#33976</a>)</li> <li><strong>vite:</strong> Configure hmr port for server build (<a href="https://github.com/nuxt/nuxt/pull/33929" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33929/hovercard">#33929</a>)</li> <li><strong>kit:</strong> Add forward compatible nitro v3 types (<a href="https://github.com/nuxt/nuxt/pull/34053" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34053/hovercard">#34053</a>)</li> <li><strong>nitro,nuxt:</strong> Do not import nitro deps in builders (<a href="https://github.com/nuxt/nuxt/pull/34054" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34054/hovercard">#34054</a>)</li> <li><strong>nitro:</strong> Add <code>h3</code> types to auto-imports (<a href="https://github.com/nuxt/nuxt/pull/34035" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34035/hovercard">#34035</a>)</li> <li><strong>schema:</strong> Add some more directories to ignore (<a href="https://github.com/nuxt/nuxt/commit/ebc2a66ab">ebc2a66ab</a>)</li> <li><strong>nitro:</strong> Also augment <code>nuxt/schema</code> (<a href="https://github.com/nuxt/nuxt/commit/a6a044d81">a6a044d81</a>)</li> <li><strong>nuxt:</strong> Make asyncData properties reactive in Options API (<a href="https://github.com/nuxt/nuxt/pull/34119" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34119/hovercard">#34119</a>)</li> <li><strong>nuxt:</strong> Rerender <code>NuxtPage</code> when nested <code>NuxtLayout</code> has explicitly disabled layouts (<a href="https://github.com/nuxt/nuxt/pull/34078" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34078/hovercard">#34078</a>)</li> <li><strong>kit,nitro:</strong> Enable <code>allowArbitraryExtensions</code> by default (<a href="https://github.com/nuxt/nuxt/pull/34084" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34084/hovercard">#34084</a>)</li> <li><strong>nuxt:</strong> Decode client-side pathname for non-ASCII route aliases (<a href="https://github.com/nuxt/nuxt/pull/34043" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34043/hovercard">#34043</a>)</li> <li><strong>nuxt:</strong> Force remount suspense when navigating after pending (<a href="https://github.com/nuxt/nuxt/pull/33991" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33991/hovercard">#33991</a>)</li> <li><strong>nuxt:</strong> Add documentation link to server builder error message (<a href="https://github.com/nuxt/nuxt/pull/34122" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34122/hovercard">#34122</a>)</li> <li><strong>nuxt:</strong> Validate placeholder/fallback tags + warn about placeholder/fallback props (<a href="https://github.com/nuxt/nuxt/commit/567a1c6fb">567a1c6fb</a>)</li> <li><strong>nuxt:</strong> Force flush <code>useAsyncData</code> debounced execute post watcher flush (<a href="https://github.com/nuxt/nuxt/pull/34125" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34125/hovercard">#34125</a>)</li> <li><strong>nitro:</strong> Process isr/swr/cache keys (<a href="https://github.com/nuxt/nuxt/commit/d84278622">d84278622</a>)</li> <li><strong>nuxt:</strong> Add <code>typeFrom</code> support for <code>imports.d.ts</code> template exports (<a href="https://github.com/nuxt/nuxt/pull/34135" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34135/hovercard">#34135</a>)</li> <li><strong>nuxt:</strong> Ensure we inline styles for <code>hydrate-never</code> components (<a href="https://github.com/nuxt/nuxt/pull/34132" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34132/hovercard">#34132</a>)</li> </ul> <h3>๐Ÿ’… Refactors</h3> <ul> <li><strong>kit:</strong> Add explicit return types for kit utilities (<a href="https://github.com/nuxt/nuxt/commit/6cd1289d1">6cd1289d1</a>)</li> <li><strong>nitro,nuxt,schema,vite:</strong> Provide explicit return types (<a href="https://github.com/nuxt/nuxt/commit/1d2c0c25f">1d2c0c25f</a>)</li> <li><strong>kit,nuxt,schema:</strong> Use named imports from <code>defu</code> + <code>consola</code> (<a href="https://github.com/nuxt/nuxt/commit/322dae3e0">322dae3e0</a>)</li> <li>Add explicit <code>.ts</code> file extensions to relative imports (<a href="https://github.com/nuxt/nuxt/commit/80778c0cd">80778c0cd</a>)</li> <li><strong>kit,nitro,nuxt,schema:</strong> Reduce barrels + move <code>&lt;&gt;</code> to <code>as</code> (<a href="https://github.com/nuxt/nuxt/commit/f1713850c">f1713850c</a>)</li> <li><strong>nitro,nuxt:</strong> Use <code>~</code> prefix for internal ssrContext properties (<a href="https://github.com/nuxt/nuxt/pull/33896" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33896/hovercard">#33896</a>)</li> <li><strong>nitro:</strong> Add explicit return types for runtime utils (<a href="https://github.com/nuxt/nuxt/commit/a4fda917e">a4fda917e</a>)</li> <li><strong>nitro:</strong> Move tree-shaken flags from replace plugin -&gt; vfs (<a href="https://github.com/nuxt/nuxt/pull/33907" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33907/hovercard">#33907</a>)</li> <li><strong>nitro,nuxt,vite,webpack:</strong> Use <code>status</code>/<code>statusText</code> + deprecate old props (<a href="https://github.com/nuxt/nuxt/pull/33912" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33912/hovercard">#33912</a>)</li> <li><strong>webpack:</strong> Use RuntimeModule API for chunk preloads (<a href="https://github.com/nuxt/nuxt/pull/33930" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33930/hovercard">#33930</a>)</li> <li><strong>nuxt:</strong> Use AST-aware function key injection (<a href="https://github.com/nuxt/nuxt/pull/33446" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33446/hovercard">#33446</a>)</li> <li><strong>nitro,nuxt,schema:</strong> Use augments for nitro schema types (<a href="https://github.com/nuxt/nuxt/pull/34039" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34039/hovercard">#34039</a>)</li> <li><strong>nitro,rspack,vite,webpack:</strong> Move cors handling -&gt; nitro builder (<a href="https://github.com/nuxt/nuxt/pull/34048" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34048/hovercard">#34048</a>)</li> </ul> <h3>๐Ÿ“– Documentation</h3> <ul> <li>Split and improve <code>Module Author Guides</code> (<a href="https://github.com/nuxt/nuxt/pull/33803" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33803/hovercard">#33803</a>)</li> <li>Update links to module guide (<a href="https://github.com/nuxt/nuxt/commit/86d67b24f">86d67b24f</a>)</li> <li>Fix <code>useHead</code> return type (<a href="https://github.com/nuxt/nuxt/pull/33857" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33857/hovercard">#33857</a>)</li> <li>Add note that middleware doesn't run when rendering islands (<a href="https://github.com/nuxt/nuxt/commit/7df27c781">7df27c781</a>)</li> <li>Add note on default branch for layers (<a href="https://github.com/nuxt/nuxt/pull/33919" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33919/hovercard">#33919</a>)</li> <li>Add mcp setup instructions for claude desktop (<a href="https://github.com/nuxt/nuxt/pull/33914" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33914/hovercard">#33914</a>)</li> <li>Mention deno as package manager (<a href="https://github.com/nuxt/nuxt/pull/33875" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33875/hovercard">#33875</a>)</li> <li>Clarify purpose of <code>statusText</code> (<a href="https://github.com/nuxt/nuxt/pull/32834" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32834/hovercard">#32834</a>)</li> <li>Update lychee config and remove medium article link (<a href="https://github.com/nuxt/nuxt/commit/c0b4e0f28">c0b4e0f28</a>)</li> <li>Update module count and fix typo (<a href="https://github.com/nuxt/nuxt/pull/33950" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33950/hovercard">#33950</a>)</li> <li>Add DeepWiki badge (<a href="https://github.com/nuxt/nuxt/pull/33508" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33508/hovercard">#33508</a>)</li> <li>Give example of usage of <code>defineWrappedResponseHandler</code> (<a href="https://github.com/nuxt/nuxt/pull/33952" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33952/hovercard">#33952</a>)</li> <li>Provide cleaner example code for vitest projects (<a href="https://github.com/nuxt/nuxt/pull/33960" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33960/hovercard">#33960</a>)</li> <li>Improve <code>addImports</code> example (<a href="https://github.com/nuxt/nuxt/pull/34011" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34011/hovercard">#34011</a>)</li> <li>Update yarn create command (<a href="https://github.com/nuxt/nuxt/commit/4a3c08874">4a3c08874</a>)</li> <li>Update roadmap with a11y (<a href="https://github.com/nuxt/nuxt/commit/d3453d6a5">d3453d6a5</a>)</li> <li>Add a11y release (<a href="https://github.com/nuxt/nuxt/pull/34041" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34041/hovercard">#34041</a>)</li> <li>Remove Nuxtr from recommendations (<a href="https://github.com/nuxt/nuxt/pull/34045" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34045/hovercard">#34045</a>)</li> <li>Typo (<a href="https://github.com/nuxt/nuxt/pull/34050" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34050/hovercard">#34050</a>)</li> <li>Remove duplicate feature (<a href="https://github.com/nuxt/nuxt/pull/34058" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34058/hovercard">#34058</a>)</li> <li>Fix typo (<a href="https://github.com/nuxt/nuxt/pull/34057" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34057/hovercard">#34057</a>)</li> <li>Provide deno package manager examples (<a href="https://github.com/nuxt/nuxt/pull/34070" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34070/hovercard">#34070</a>)</li> <li>Update JSDoc for <code>config.experimental</code> properties (<a href="https://github.com/nuxt/nuxt/pull/34069" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34069/hovercard">#34069</a>)</li> <li>Fix transition types (<a href="https://github.com/nuxt/nuxt/pull/34082" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34082/hovercard">#34082</a>)</li> <li>Make custom wrapper recipe link more prominent (<a href="https://github.com/nuxt/nuxt/pull/34085" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34085/hovercard">#34085</a>)</li> <li>Remove <code>null</code> from <code>getCachedData</code> trigger (<a href="https://github.com/nuxt/nuxt/commit/f7cf3747e">f7cf3747e</a>)</li> <li><strong>nuxt:</strong> Mention custom serializers in <code>useState</code> docs (<a href="https://github.com/nuxt/nuxt/pull/34105" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34105/hovercard">#34105</a>)</li> <li>Add info about runtime directories + type checking (<a href="https://github.com/nuxt/nuxt/pull/34097" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34097/hovercard">#34097</a>)</li> <li>Clarify module setups in <code>.nuxtrc</code> example (<a href="https://github.com/nuxt/nuxt/pull/34107" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34107/hovercard">#34107</a>)</li> <li>Remove duplicate entries in table (<a href="https://github.com/nuxt/nuxt/pull/34094" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34094/hovercard">#34094</a>)</li> <li>Clarify catch all notation for <code>addServerHandler</code> (<a href="https://github.com/nuxt/nuxt/pull/34060" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34060/hovercard">#34060</a>)</li> <li>Add layers directory documentation (<a href="https://github.com/nuxt/nuxt/pull/33967" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33967/hovercard">#33967</a>)</li> <li>Clarify type-checking context limitations for server routes (<a href="https://github.com/nuxt/nuxt/pull/33964" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33964/hovercard">#33964</a>)</li> <li>Add a tip for <code>appLayout</code> (<a href="https://github.com/nuxt/nuxt/commit/beda47955">beda47955</a>)</li> <li>Add docs for disabling modules by passing <code>false</code> to its options (<a href="https://github.com/nuxt/nuxt/commit/cdad9310c">cdad9310c</a>)</li> <li>Add info about caching payloads with isr/swr (<a href="https://github.com/nuxt/nuxt/commit/6e10ff04f">6e10ff04f</a>)</li> <li>Add example for async addVitePlugin (<a href="https://github.com/nuxt/nuxt/commit/1098254f7">1098254f7</a>)</li> <li>Add example of passing props to layouts (<a href="https://github.com/nuxt/nuxt/commit/1f9e6b82c">1f9e6b82c</a>)</li> <li>Mark vite plugin as not typed (<a href="https://github.com/nuxt/nuxt/commit/5e09fddfb">5e09fddfb</a>)</li> <li>Add warning about <code>source</code> from <code>&lt;NuxtIsland&gt;</code> (<a href="https://github.com/nuxt/nuxt/commit/1586bbb6e">1586bbb6e</a>)</li> </ul> <h3>๐Ÿ“ฆ Build</h3> <ul> <li>Remove babel debugging plugin from jiti stub options (<a href="https://github.com/nuxt/nuxt/commit/bce8248b4">bce8248b4</a>)</li> <li><strong>vite:</strong> Add build entries for <code>vite-node</code> entrypoints (<a href="https://github.com/nuxt/nuxt/pull/33893" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33893/hovercard">#33893</a>)</li> <li><strong>nuxt:</strong> Tidy up subpath export types (<a href="https://github.com/nuxt/nuxt/commit/a63d4a014">a63d4a014</a>)</li> <li>Use <code>obuild</code> except for nuxt + nitro-server packages (<a href="https://github.com/nuxt/nuxt/pull/34049" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34049/hovercard">#34049</a>)</li> <li><strong>schema:</strong> Fix <code>/builder-env</code> subpath types (<a href="https://github.com/nuxt/nuxt/commit/7f5034288">7f5034288</a>)</li> </ul> <h3>๐Ÿก Chore</h3> <ul> <li>Add return types to debug plugins (<a href="https://github.com/nuxt/nuxt/commit/8f7554287">8f7554287</a>)</li> <li>Add <code>build:stub</code> command for those that need it (<a href="https://github.com/nuxt/nuxt/commit/3e3d3d37a">3e3d3d37a</a>)</li> <li>Revert change to how type augments are inserted (<a href="https://github.com/nuxt/nuxt/commit/c1b3590ff">c1b3590ff</a>)</li> <li>Update eslint config rule (<a href="https://github.com/nuxt/nuxt/commit/2717d8fd3">2717d8fd3</a>)</li> <li>Do not require aligned columns in tables (<a href="https://github.com/nuxt/nuxt/commit/8d3c5b371">8d3c5b371</a>)</li> <li>Lint (<a href="https://github.com/nuxt/nuxt/commit/f89d447a1">f89d447a1</a>)</li> <li>Explicitly import <code>node:process</code> (<a href="https://github.com/nuxt/nuxt/pull/33982" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33982/hovercard">#33982</a>)</li> <li>Add root scripts to lint context (<a href="https://github.com/nuxt/nuxt/commit/e22089f82">e22089f82</a>)</li> <li>Tidy up configs (<a href="https://github.com/nuxt/nuxt/commit/8b42d4c2b">8b42d4c2b</a>)</li> <li>Lint docs with eslint (<a href="https://github.com/nuxt/nuxt/commit/51da8e681">51da8e681</a>)</li> <li>Lint (<a href="https://github.com/nuxt/nuxt/commit/1cfd3c460">1cfd3c460</a>)</li> </ul> <h3>โœ… Tests</h3> <ul> <li>Update tests for new version of nuxt/test-utils (<a href="https://github.com/nuxt/nuxt/pull/33842" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33842/hovercard">#33842</a>)</li> <li>Avoid unnecessary tick (<a href="https://github.com/nuxt/nuxt/commit/988f6657a">988f6657a</a>)</li> <li>Add regression test for asyncData HMR (<a href="https://github.com/nuxt/nuxt/pull/32182" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32182/hovercard">#32182</a>)</li> <li>Add test for page hmr resetting state (<a href="https://github.com/nuxt/nuxt/pull/32418" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32418/hovercard">#32418</a>)</li> <li>Add reproduction for vite pre-transform error (<a href="https://github.com/nuxt/nuxt/pull/31574" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/31574/hovercard">#31574</a>)</li> <li>Add regression test for <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3073110088" data-permission-text="Title is private" data-url="https://github.com/nuxt/nuxt/issues/32154" data-hovercard-type="issue" data-hovercard-url="/nuxt/nuxt/issues/32154/hovercard" href="https://github.com/nuxt/nuxt/issues/32154">#32154</a> (<a href="https://github.com/nuxt/nuxt/issues/32154" data-hovercard-type="issue" data-hovercard-url="/nuxt/nuxt/issues/32154/hovercard">#32154</a>)</li> <li>Use <code>vi.hoisted</code> for klona mock (<a href="https://github.com/nuxt/nuxt/pull/34113" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34113/hovercard">#34113</a>)</li> </ul> <h3>๐Ÿค– CI</h3> <ul> <li>Directly call webhook url (<a href="https://github.com/nuxt/nuxt/commit/ce15997ce">ce15997ce</a>)</li> <li>Use new reusable triage workflows (<a href="https://github.com/nuxt/nuxt/pull/34072" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34072/hovercard">#34072</a>)</li> <li>Use new shared dependency review workflow (<a href="https://github.com/nuxt/nuxt/commit/8c01e1ce9">8c01e1ce9</a>)</li> </ul> <h3>โค๏ธ Contributors</h3> <ul> <li>Florian Heuberger (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Flo0806/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Flo0806">@Flo0806</a>)</li> <li>Octavio Araiza (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/8ctavio/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/8ctavio">@8ctavio</a>)</li> <li>Daniel Roe (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/danielroe/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/danielroe">@danielroe</a>)</li> <li>Robin (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/OrbisK/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/OrbisK">@OrbisK</a>)</li> <li>shaheer-arbisoft (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/shaheer-arbisoft/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/shaheer-arbisoft">@shaheer-arbisoft</a>)</li> <li>Matej ฤŒernรฝ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/cernymatej/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/cernymatej">@cernymatej</a>)</li> <li>Francesco Mussoni (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/solidusite/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/solidusite">@solidusite</a>)</li> <li>Danila Poyarkov (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/dannote/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dannote">@dannote</a>)</li> <li>Victor Saa (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/vis97c/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/vis97c">@vis97c</a>)</li> <li>Teages (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Teages/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Teages">@Teages</a>)</li> <li>Eli Sterken (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/eli-sterk/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/eli-sterk">@eli-sterk</a>)</li> <li>Ryota Watanabe (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/wattanx/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/wattanx">@wattanx</a>)</li> <li>Jakub Andrzejewski (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Baroshem/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Baroshem">@Baroshem</a>)</li> <li>edison (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/edison1105/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/edison1105">@edison1105</a>)</li> <li>Max (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/onmax/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/onmax">@onmax</a>)</li> <li>Aidan Hibbard (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/aidanhibbard/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/aidanhibbard">@aidanhibbard</a>)</li> <li>Rahul Dogra (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/rahuld109/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/rahuld109">@rahuld109</a>)</li> <li>Julien Huang (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/huang-julien/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/huang-julien">@huang-julien</a>)</li> <li>abeer0 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iiio2/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iiio2">@iiio2</a>)</li> <li>James Robert Lund III (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/lundjrl/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/lundjrl">@lundjrl</a>)</li> <li>Philipp Wagner (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/imphil/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/imphil">@imphil</a>)</li> <li>Maxime Pauvert (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/maximepvrt/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/maximepvrt">@maximepvrt</a>)</li> <li>Wind (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/productdevbook/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/productdevbook">@productdevbook</a>)</li> <li>Agatem (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/agatemosu/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/agatemosu">@agatemosu</a>)</li> <li>Pavel (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/eL1fe/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/eL1fe">@eL1fe</a>)</li> <li>Alois Seฤkรกr (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/AloisSeckar/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/AloisSeckar">@AloisSeckar</a>)</li> <li>Lucie (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/lihbr/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/lihbr">@lihbr</a>)</li> <li>Sergiu Ravliuc (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/YoSoySergio/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/YoSoySergio">@YoSoySergio</a>)</li> <li>Saeid Zareie (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Saeid-Za/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Saeid-Za">@Saeid-Za</a>)</li> <li>Alireza Jahandideh (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Youhan/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Youhan">@Youhan</a>)</li> <li>kikuchan (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/kikuchan/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/kikuchan">@kikuchan</a>)</li> <li>Ragura (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Ragura/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Ragura">@Ragura</a>)</li> <li>Josh Deltener (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/hecktarzuli/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/hecktarzuli">@hecktarzuli</a>)</li> <li>Teena (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/franklin-tina/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/franklin-tina">@franklin-tina</a>)</li> <li>Frederik BuรŸmann (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/freb97/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/freb97">@freb97</a>)</li> <li>Benjamin Oddou (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/BenjaminOddou/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/BenjaminOddou">@BenjaminOddou</a>)</li> <li>Mukund Shah (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/mukundshah/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/mukundshah">@mukundshah</a>)</li> <li>Jessรฉ Correia Lins (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/linspw/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/linspw">@linspw</a>)</li> <li>Jannik Sohn (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/janniksohn/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/janniksohn">@janniksohn</a>)</li> <li>Dawit (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oneminch/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oneminch">@oneminch</a>)</li> <li>Ali Sokkar (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/NyllRE/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/NyllRE">@NyllRE</a>)</li> <li>Horu (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/HigherOrderLogic/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/HigherOrderLogic">@HigherOrderLogic</a>)</li> <li>Anthony Fu (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/antfu/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/antfu">@antfu</a>)</li> <li>Harlan Wilton (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/harlan-zw/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/harlan-zw">@harlan-zw</a>)</li> <li>Alexander Lichter (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/TheAlexLichter/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/TheAlexLichter">@TheAlexLichter</a>)</li> <li>Ryan Wilson (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/rywils/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/rywils">@rywils</a>)</li> <li>Hugo (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/HugoRCD/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/HugoRCD">@HugoRCD</a>)</li> <li>yamachi4416 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/yamachi4416/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/yamachi4416">@yamachi4416</a>)</li> </ul> danielroe tag:github.com,2008:Repository/71995937/v3.21.0 2026-01-23T09:17:15Z v3.21.0 <blockquote> <p>3.21.0 is the next minor release.</p> </blockquote> <p>Nuxt 4.3 and 3.21 bring powerful new features for layouts, caching, and developer experience โ€“ plus significant performance improvements under the hood.</p> <h2>๐Ÿ“ฃ Some News</h2> <h3>Extended v3 Support</h3> <p>Early this month, I <a href="https://github.com/nuxt/nuxt/discussions/33918" data-hovercard-type="discussion" data-hovercard-url="/nuxt/nuxt/discussions/33918/hovercard">opened a discussion</a> to find out how the upgrade had gone from v3 to v4. I was really pleased to hear how well it had gone for most people.</p> <p>Having said that, we're committed to making sure no one gets left behind. And so we will <strong>continue to provide security updates and critical bug fix releases</strong> beyond the previously announced end-of-life date of January 31, 2026, meaning Nuxt v3 will meet its end-of-life on July 31, 2026.</p> <div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title"><svg class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>Tip</p><p>As usual, today also brings a minor release for v3, with many of the same improvements backported from v4.3.</p> </div> <h3>Preparing for Nuxt 5</h3> <p>We're closer than ever to the releases of Nuxt v5 and Nitro v3. In the coming weeks, the <code>main</code> branch of the Nuxt repository will begin receiving initial commits for Nuxt 5. However, it's still <strong>business as usual</strong>.</p> <ul> <li>Continue making pull requests to the <code>main</code> branch</li> <li>We'll backport changes to the <code>4.x</code> and <code>3.x</code> branches</li> </ul> <p>Keep an eye out on the <a href="https://nuxt.com/docs/4.x/getting-started/upgrade" rel="nofollow">Upgrade Guide</a> โ€“ we'll be adding details about how you can already start migrating your projects to prepare for Nuxt v4 with <code>future.compatibilityVersion: 5</code>.</p> <h2>๐Ÿ—‚๏ธ Route Rule Layouts</h2> <p>But that's enough about the future. We have a lot of good things for you today!</p> <p>First, you can now set layouts directly in route rules using the new <code>appLayout</code> property (<a href="https://github.com/nuxt/nuxt/pull/31092" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/31092/hovercard">#31092</a>). This provides a centralized, declarative way to manage layouts across your application without scattering <code>definePageMeta</code> calls throughout your pages.</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtConfig({ routeRules: { '/admin/**': { appLayout: 'admin' }, '/dashboard/**': { appLayout: 'dashboard' }, '/auth/**': { appLayout: 'minimal' } } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">routeRules</span>: <span class="pl-kos">{</span> <span class="pl-s">'/admin/**'</span>: <span class="pl-kos">{</span> <span class="pl-c1">appLayout</span>: <span class="pl-s">'admin'</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-s">'/dashboard/**'</span>: <span class="pl-kos">{</span> <span class="pl-c1">appLayout</span>: <span class="pl-s">'dashboard'</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-s">'/auth/**'</span>: <span class="pl-kos">{</span> <span class="pl-c1">appLayout</span>: <span class="pl-s">'minimal'</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>This might be useful for:</p> <ul> <li>Admin panels with a shared layout across many routes</li> <li>Marketing pages that need a different layout from the app</li> </ul> <div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title"><svg class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>Tip</p><p>Plus, you can pass props to layouts now! See <a href="#layout-props-with-setpagelayout">the <code>setPageLayout</code> improvements below</a>.</p> </div> <h2>๐Ÿ“ฆ ISR/SWR Payload Extraction</h2> <p>Payload extraction now works with ISR (incremental static regeneration), SWR (stale-while-revalidate) and cache <code>routeRules</code> (<a href="https://github.com/nuxt/nuxt/pull/33467" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33467/hovercard">#33467</a>). Previously, only pre-rendered pages could generate <code>_payload.json</code> files.</p> <p>This means:</p> <ul> <li>Client-side navigation to ISR/SWR pages can use cached payloads</li> <li>CDNs (Vercel, Netlify, Cloudflare) can cache payload files alongside HTML</li> <li>Fewer API calls during navigation โ€“ data can be prefetched and served from the cached payload</li> </ul> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtConfig({ routeRules: { '/products/**': { isr: 3600, // Revalidate every hour } } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">routeRules</span>: <span class="pl-kos">{</span> <span class="pl-s">'/products/**'</span>: <span class="pl-kos">{</span> <span class="pl-c1">isr</span>: <span class="pl-c1">3600</span><span class="pl-kos">,</span> <span class="pl-c">// Revalidate every hour</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <h2>๐Ÿงน Dev Mode Payload Extraction</h2> <p>Related to the above, payload extraction now also works in development mode (<a href="https://github.com/nuxt/nuxt/pull/30784" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/30784/hovercard">#30784</a>). This makes it easier to test and debug payload behavior without needing to run a production build.</p> <div class="markdown-alert markdown-alert-important"><p class="markdown-alert-title"><svg class="octicon octicon-report mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>Important</p><p>Payload extraction works in dev mode with <code>nitro.static</code> set to <code>true</code>, or for individual pages which have <code>isr</code>, <code>swr</code>, <code>prerender</code> or <code>cache</code> route rules.</p> </div> <h2>๐Ÿšซ Disable Modules from Layers</h2> <p>When extending Nuxt layers, you can now disable specific modules that you don't need (<a href="https://github.com/nuxt/nuxt/pull/33883" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33883/hovercard">#33883</a>). Just pass <code>false</code> to the module's options:</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtConfig({ extends: ['../shared-layer'], // disable @nuxt/image from layer image: false, })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">extends</span>: <span class="pl-kos">[</span><span class="pl-s">'../shared-layer'</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-c">// disable <span class="pl-k">@nuxt</span>/image from layer</span> <span class="pl-c1">image</span>: <span class="pl-c1">false</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <h2>๐Ÿท๏ธ Route Groups in Page Meta</h2> <p><a href="https://nuxt.com/docs/4.x/directory-structure/app/pages#route-groups" rel="nofollow">Route groups</a> (folders wrapped in parentheses like <code>(protected)/</code>) are now exposed in page meta (<a href="https://github.com/nuxt/nuxt/pull/33460" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33460/hovercard">#33460</a>). This makes it easy to check which groups a route belongs to in middleware or anywhere you have access to the route.</p> <div class="highlight highlight-text-html-vue notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;script setup lang=&quot;ts&quot;&gt; // This page's meta will include: { groups: ['protected'] } useRoute().meta.groups &lt;/script&gt;"><pre>&lt;<span class="pl-ent">script</span> setup lang="ts"&gt;<span class="pl-s1"></span> <span class="pl-s1"><span class="pl-c"><span class="pl-c">//</span> This page's meta will include: { groups: ['protected'] }</span></span> <span class="pl-s1"><span class="pl-en">useRoute</span>().<span class="pl-smi">meta</span>.<span class="pl-smi">groups</span></span> <span class="pl-s1"></span>&lt;/<span class="pl-ent">script</span>&gt;</pre></div> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtRouteMiddleware((to) =&gt; { if (to.meta.groups?.includes('protected') &amp;&amp; !isAuthenticated()) { return navigateTo('/login') } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtRouteMiddleware</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-s1">to</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> <span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-s1">to</span><span class="pl-kos">.</span><span class="pl-c1">meta</span><span class="pl-kos">.</span><span class="pl-c1">groups</span><span class="pl-kos">?.</span><span class="pl-en">includes</span><span class="pl-kos">(</span><span class="pl-s">'protected'</span><span class="pl-kos">)</span> <span class="pl-c1">&amp;&amp;</span> <span class="pl-c1">!</span><span class="pl-en">isAuthenticated</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-k">return</span> <span class="pl-en">navigateTo</span><span class="pl-kos">(</span><span class="pl-s">'/login'</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>This provides a clean, convention-based approach to route-level authorization without needing to add <code>definePageMeta</code> to every protected page.</p> <h2>๐ŸŽจ Layout Props with <code>setPageLayout</code></h2> <p>The <code>setPageLayout</code> composable now accepts a second parameter to pass props to your layout (<a href="https://github.com/nuxt/nuxt/pull/33805" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33805/hovercard">#33805</a>):</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtRouteMiddleware((to) =&gt; { setPageLayout('admin', { sidebar: true, theme: 'dark' }) })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtRouteMiddleware</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-s1">to</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> <span class="pl-en">setPageLayout</span><span class="pl-kos">(</span><span class="pl-s">'admin'</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">sidebar</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span> <span class="pl-c1">theme</span>: <span class="pl-s">'dark'</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <div class="highlight highlight-text-html-vue notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;script setup lang=&quot;ts&quot;&gt; defineProps&lt;{ sidebar?: boolean theme?: 'light' | 'dark' }&gt;() &lt;/script&gt;"><pre>&lt;<span class="pl-ent">script</span> setup lang="ts"&gt;<span class="pl-s1"></span> <span class="pl-s1"><span class="pl-en">defineProps</span>&lt;{</span> <span class="pl-s1"> sidebar<span class="pl-k">?</span><span class="pl-k">:</span> <span class="pl-c1">boolean</span></span> <span class="pl-s1"> theme<span class="pl-k">?</span><span class="pl-k">:</span> <span class="pl-s"><span class="pl-pds">'</span>light<span class="pl-pds">'</span></span> <span class="pl-k">|</span> <span class="pl-s"><span class="pl-pds">'</span>dark<span class="pl-pds">'</span></span></span> <span class="pl-s1">}&gt;()</span> <span class="pl-s1"></span>&lt;/<span class="pl-ent">script</span>&gt;</pre></div> <h2>๐Ÿ”ง <code>#server</code> Alias</h2> <p>A new <code>#server</code> alias provides clean imports within your server directory (<a href="https://github.com/nuxt/nuxt/pull/33870" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33870/hovercard">#33870</a>), similar to how <code>#shared</code> works:</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// Before: relative path hell import { helper } from '../../../../utils/helper' // After: clean and predictable import { helper } from '#server/utils/helper'"><pre><span class="pl-c">// Before: relative path hell</span> <span class="pl-k">import</span> <span class="pl-kos">{</span> <span class="pl-s1">helper</span> <span class="pl-kos">}</span> <span class="pl-k">from</span> <span class="pl-s">'../../../../utils/helper'</span> <span class="pl-c">// After: clean and predictable</span> <span class="pl-k">import</span> <span class="pl-kos">{</span> <span class="pl-s1">helper</span> <span class="pl-kos">}</span> <span class="pl-k">from</span> <span class="pl-s">'#server/utils/helper'</span></pre></div> <p>The alias includes import protection โ€“ you can't accidentally import <code>#server</code> code from client or shared contexts.</p> <h2>๐ŸชŸ Draggable Error Overlay</h2> <p>The development error overlay introduced in Nuxt 4.2 is now draggable and can be minimized (<a href="https://github.com/nuxt/nuxt/pull/33695" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33695/hovercard">#33695</a>). You can:</p> <ul> <li>Drag it to any corner of the screen (it snaps to edges)</li> <li>Minimize it to a small pill button when you want to keep working</li> <li>Your position and minimized state persist across page reloads</li> </ul> <p>This is a quality-of-life improvement when you're iterating on fixes and don't want the overlay blocking your view.</p> <p><a href="https://github.com/user-attachments/assets/nuxt_4-3_error_demo.mp4">https://github.com/user-attachments/assets/nuxt_4-3_error_demo.mp4</a></p> <h2>โš™๏ธ Async Plugin Constructors</h2> <p>Module authors can now use async functions when adding build plugins (<a href="https://github.com/nuxt/nuxt/pull/33619" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33619/hovercard">#33619</a>):</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtModule({ async setup() { // Lazy load only when actually needed addVitePlugin(() =&gt; import('my-cool-plugin').then(r =&gt; r.default())) // No need to load webpack plugin if using Vite addWebpackPlugin(() =&gt; import('my-cool-plugin/webpack').then(r =&gt; r.default())) } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtModule</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-k">async</span> <span class="pl-en">setup</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-c">// Lazy load only when actually needed</span> <span class="pl-en">addVitePlugin</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-k">import</span><span class="pl-kos">(</span><span class="pl-s">'my-cool-plugin'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">then</span><span class="pl-kos">(</span><span class="pl-s1">r</span> <span class="pl-c1">=&gt;</span> <span class="pl-s1">r</span><span class="pl-kos">.</span><span class="pl-en">default</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-c">// No need to load webpack plugin if using Vite</span> <span class="pl-en">addWebpackPlugin</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-k">import</span><span class="pl-kos">(</span><span class="pl-s">'my-cool-plugin/webpack'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">then</span><span class="pl-kos">(</span><span class="pl-s1">r</span> <span class="pl-c1">=&gt;</span> <span class="pl-s1">r</span><span class="pl-kos">.</span><span class="pl-en">default</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>This enables true lazy loading of build plugins, avoiding unnecessary code loading when plugins aren't needed.</p> <h2>๐Ÿš€ Performance Improvements</h2> <p>This release includes several performance optimizations for faster builds:</p> <ul> <li><strong>Hook filters</strong> - Internal plugins now use filters to avoid running hooks unnecessarily (<a href="https://github.com/nuxt/nuxt/pull/33898" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33898/hovercard">#33898</a>)</li> <li><strong>SSR styles optimization</strong> - The <code>nuxt:ssr-styles</code> plugin is now significantly faster (<a href="https://github.com/nuxt/nuxt/pull/33862" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33862/hovercard">#33862</a>, <a href="https://github.com/nuxt/nuxt/pull/33865" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33865/hovercard">#33865</a>)</li> <li><strong>Layer alias transform</strong> - Skipped when using Vite (it handles this natively) (<a href="https://github.com/nuxt/nuxt/pull/33864" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33864/hovercard">#33864</a>)</li> <li><strong>Route rules compilation</strong> - Route rules are now compiled into a client chunk using <code>rou3</code>, removing the need for <code>radix3</code> in the client bundle and eliminating app manifest fetches (<a href="https://github.com/nuxt/nuxt/pull/33920" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33920/hovercard">#33920</a>)</li> </ul> <h2>๐ŸŽจ Inline Styles for Webpack/Rspack</h2> <p>The <code>inlineStyles</code> feature now works with webpack and rspack builders (<a href="https://github.com/nuxt/nuxt/pull/33966" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33966/hovercard">#33966</a>), not just Vite. This enables critical CSS inlining for better Core Web Vitals regardless of your bundler choice.</p> <h2><g-emoji class="g-emoji" alias="warning">โš ๏ธ</g-emoji> Deprecations</h2> <h3><code>statusCode</code> โ†’ <code>status</code>, <code>statusMessage</code> โ†’ <code>statusText</code></h3> <p>In preparation for Nitro v3 and H3 v2, we're moving to use Web API naming conventions (<a href="https://github.com/nuxt/nuxt/pull/33912" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33912/hovercard">#33912</a>). The old properties still work but are deprecated in advance of v5:</p> <div class="highlight highlight-source-diff notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="- throw createError({ statusCode: 404, statusMessage: 'Not Found' }) + throw createError({ status: 404, statusText: 'Not Found' })"><pre><span class="pl-md"><span class="pl-md">-</span> throw createError({ statusCode: 404, statusMessage: 'Not Found' })</span> <span class="pl-mi1"><span class="pl-mi1">+</span> throw createError({ status: 404, statusText: 'Not Found' })</span></pre></div> <h2>๐Ÿ› Bug Fixes</h2> <p>Notable fixes in this release:</p> <ul> <li>Fixed head component deduplication using <code>key</code> attribute (<a href="https://github.com/nuxt/nuxt/pull/33958" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33958/hovercard">#33958</a>, <a href="https://github.com/nuxt/nuxt/pull/33963" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33963/hovercard">#33963</a>)</li> <li>Fixed async data properties not being reactive in Options API (<a href="https://github.com/nuxt/nuxt/pull/34119" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34119/hovercard">#34119</a>)</li> <li>Fixed <code>useCookie</code> unsafe number parsing during decode (<a href="https://github.com/nuxt/nuxt/pull/34007" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34007/hovercard">#34007</a>)</li> <li>Fixed <code>NuxtPage</code> not re-rendering when nested <code>NuxtLayout</code> has layouts disabled (<a href="https://github.com/nuxt/nuxt/pull/34078" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34078/hovercard">#34078</a>)</li> <li>Fixed client-side pathname decoding for non-ASCII route aliases (<a href="https://github.com/nuxt/nuxt/pull/34043" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34043/hovercard">#34043</a>)</li> <li>Fixed suspense remounting when navigating after pending state (<a href="https://github.com/nuxt/nuxt/pull/33991" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33991/hovercard">#33991</a>)</li> <li>Fixed clipboard copy in error overlay (<a href="https://github.com/nuxt/nuxt/pull/33873" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33873/hovercard">#33873</a>)</li> <li>Enabled <code>allowArbitraryExtensions</code> by default in TypeScript config (<a href="https://github.com/nuxt/nuxt/pull/34084" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34084/hovercard">#34084</a>)</li> <li>Added <code>noUncheckedIndexedAccess</code> to server tsconfig for safer typing (<a href="https://github.com/nuxt/nuxt/pull/33985" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33985/hovercard">#33985</a>)</li> </ul> <div class="markdown-alert markdown-alert-important"><p class="markdown-alert-title"><svg class="octicon octicon-report mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>Important</p><p>Enabling <code>noUncheckedIndexedAccess</code> in the Nitro server TypeScript config improves type safety but may surface new type errors in your server code. This change was necessary because Nuxt's app context performs type checks on server routes (<a href="https://nuxt.com/docs/4.x/guide/modules/recipes-advanced#known-limitations" rel="nofollow">learn more</a>).</p> <p>While we recommend keeping this enabled for better type safety, you can disable it if needed:</p> <div class="highlight highlight-source-ts notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="export default defineNuxtConfig({ nitro: { typescript: { tsConfig: { compilerOptions: { noUncheckedIndexedAccess: false } } } } })"><pre><span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineNuxtConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">nitro</span>: <span class="pl-kos">{</span> <span class="pl-c1">typescript</span>: <span class="pl-kos">{</span> <span class="pl-c1">tsConfig</span>: <span class="pl-kos">{</span> <span class="pl-c1">compilerOptions</span>: <span class="pl-kos">{</span> <span class="pl-c1">noUncheckedIndexedAccess</span>: <span class="pl-c1">false</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></pre></div> <p>Note that disabling this may allow type errors to slip through that could cause runtime issues with indexed access.</p> </div> <h2>๐Ÿ“š Documentation</h2> <ul> <li>Improved module author guides with clearer structure (<a href="https://github.com/nuxt/nuxt/pull/33803" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33803/hovercard">#33803</a>)</li> <li>Added MCP setup instructions for Claude Desktop (<a href="https://github.com/nuxt/nuxt/pull/33914" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33914/hovercard">#33914</a>)</li> <li>Added layers directory documentation (<a href="https://github.com/nuxt/nuxt/pull/33967" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33967/hovercard">#33967</a>)</li> <li>Added Deno package manager examples (<a href="https://github.com/nuxt/nuxt/pull/34070" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34070/hovercard">#34070</a>)</li> <li>Clarified type-checking context limitations for server routes (<a href="https://github.com/nuxt/nuxt/pull/33964" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33964/hovercard">#33964</a>)</li> </ul> <h2>๐ŸŽ‰ Nuxt 3.21.0</h2> <p>Alongside v4.3.0, we're releasing <strong>Nuxt v3.21.0</strong> with many of the same improvements backported to the 3.x branch. This release includes:</p> <ul> <li><strong>All the same features</strong>: Route rule layouts, ISR payload extraction, layout props with <code>setPageLayout</code>, <code>#server</code> alias, draggable error overlay, and more</li> <li><strong>All performance improvements</strong>: SSR styles optimization, hook filters, and route rules compilation</li> <li><strong>Module disabling</strong>: Disable layer modules by setting options to <code>false</code></li> <li><strong>Critical bug fixes</strong>: Async data reactivity in Options API, <code>useCookie</code> number parsing, head component deduplication, and more</li> </ul> <h2>โœ… Upgrading</h2> <p>Our recommendation for upgrading is to run:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="npx nuxt@latest upgrade --dedupe --channel=v3"><pre>npx nuxt@latest upgrade --dedupe --channel=v3</pre></div> <p>This will deduplicate your lockfile and help ensure you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.</p> <div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title"><svg class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>Tip</p><p>Check out our <a href="https://nuxt.com/docs/getting-started/upgrade" rel="nofollow">upgrade guide</a> if upgrading from an older version.</p> </div> <h2>๐Ÿ‘‰ Changelog</h2> <p><a href="https://github.com/nuxt/nuxt/compare/v3.20.2...v3.21.0">compare changes</a></p> <h3>๐Ÿš€ Enhancements</h3> <ul> <li><strong>kit:</strong> Support async constructor for adding plugins (<a href="https://github.com/nuxt/nuxt/pull/33619" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33619/hovercard">#33619</a>)</li> <li><strong>kit:</strong> Export Nuxt major version type (<a href="https://github.com/nuxt/nuxt/pull/33700" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33700/hovercard">#33700</a>)</li> <li><strong>schema:</strong> Add <code>#server</code> alias for server directory imports (<a href="https://github.com/nuxt/nuxt/pull/33870" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33870/hovercard">#33870</a>)</li> <li><strong>schema:</strong> Hoist nitro <code>crossws</code> types (<a href="https://github.com/nuxt/nuxt/commit/6ff79ea6c">6ff79ea6c</a>)</li> <li><strong>nitro,nuxt:</strong> Compile route rules into client chunk (<a href="https://github.com/nuxt/nuxt/pull/33920" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33920/hovercard">#33920</a>)</li> <li><strong>nuxt:</strong> Allow disabling modules by setting module options to <code>false</code> (<a href="https://github.com/nuxt/nuxt/pull/33883" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33883/hovercard">#33883</a>)</li> <li><strong>kit:</strong> Allow specifying <code>moduleDependencies</code> as an async function (<a href="https://github.com/nuxt/nuxt/pull/33504" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33504/hovercard">#33504</a>)</li> <li><strong>nuxt:</strong> Support <code>appLayout</code> in route rules (<a href="https://github.com/nuxt/nuxt/pull/31092" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/31092/hovercard">#31092</a>)</li> <li><strong>nuxt:</strong> Add route groups to page meta (<a href="https://github.com/nuxt/nuxt/pull/33460" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33460/hovercard">#33460</a>)</li> <li><strong>nuxt:</strong> Enable payload extraction for ISR/SWR routes (<a href="https://github.com/nuxt/nuxt/pull/33467" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33467/hovercard">#33467</a>)</li> <li><strong>nuxt:</strong> Allow updating props with <code>setPageLayout</code> (<a href="https://github.com/nuxt/nuxt/pull/33805" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33805/hovercard">#33805</a>)</li> <li><strong>nuxt:</strong> Enable dragging and minimizing for error overlay (<a href="https://github.com/nuxt/nuxt/pull/33695" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33695/hovercard">#33695</a>)</li> <li><strong>nitro,nuxt:</strong> Add support for payload extraction in dev (<a href="https://github.com/nuxt/nuxt/pull/30784" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/30784/hovercard">#30784</a>)</li> <li><strong>rspack,webpack:</strong> Add inline styles (<a href="https://github.com/nuxt/nuxt/pull/33966" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33966/hovercard">#33966</a>)</li> <li><strong>kit:</strong> Add forward-compatible nitro types (<a href="https://github.com/nuxt/nuxt/pull/34036" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34036/hovercard">#34036</a>)</li> </ul> <h3>๐Ÿ”ฅ Performance</h3> <ul> <li><strong>nuxt:</strong> Do not init layer alias transform when using vite (<a href="https://github.com/nuxt/nuxt/pull/33864" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33864/hovercard">#33864</a>)</li> <li><strong>vite:</strong> Add hook filters for ssr styles plugin (<a href="https://github.com/nuxt/nuxt/pull/33865" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33865/hovercard">#33865</a>)</li> <li><strong>vite:</strong> Optimize <code>nuxt:ssr-styles</code> plugin (<a href="https://github.com/nuxt/nuxt/pull/33862" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33862/hovercard">#33862</a>)</li> <li><strong>nuxt:</strong> Use filter for vfs plugin load (<a href="https://github.com/nuxt/nuxt/commit/5bd8e81ed">5bd8e81ed</a>)</li> <li><strong>nuxt,vite:</strong> Use filters to avoid running hooks unnecessarily (<a href="https://github.com/nuxt/nuxt/commit/e762a1e20">e762a1e20</a>)</li> <li><strong>nuxt,vite:</strong> Add more filters to internal plugins (<a href="https://github.com/nuxt/nuxt/pull/33898" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33898/hovercard">#33898</a>)</li> </ul> <h3>๐Ÿฉน Fixes</h3> <ul> <li><strong>kit:</strong> Normalize local layer paths with trailing slashes (<a href="https://github.com/nuxt/nuxt/pull/33858" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33858/hovercard">#33858</a>)</li> <li><strong>nuxt:</strong> Avoid overwriting multiple head input in island handler (<a href="https://github.com/nuxt/nuxt/pull/33849" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33849/hovercard">#33849</a>)</li> <li><strong>nuxt:</strong> Update meta instead of calling <code>router.replace</code> in page hmr (<a href="https://github.com/nuxt/nuxt/pull/33897" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33897/hovercard">#33897</a>)</li> <li><strong>nuxt:</strong> Don't call <code>page:loading:end</code> in cache if already called (<a href="https://github.com/nuxt/nuxt/commit/fbbe10133">fbbe10133</a>)</li> <li><strong>vite:</strong> Add error handling for parsing <code>NUXT_VITE_NODE_OPTIONS</code> (<a href="https://github.com/nuxt/nuxt/commit/8abb7ef5b">8abb7ef5b</a>)</li> <li><strong>nuxt:</strong> Do not skip middleware when <code>appMiddleware</code> references invalid key (<a href="https://github.com/nuxt/nuxt/commit/ed8bb68c5">ed8bb68c5</a>)</li> <li><strong>nitro:</strong> Clipboard copy in error overlay (<a href="https://github.com/nuxt/nuxt/pull/33873" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33873/hovercard">#33873</a>)</li> <li><strong>webpack,rspack:</strong> Resolve deep imports in virtual files (<a href="https://github.com/nuxt/nuxt/pull/33927" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33927/hovercard">#33927</a>)</li> <li><strong>webpack:</strong> Disable async chunks in dev mode (<a href="https://github.com/nuxt/nuxt/commit/c4bfd0a49">c4bfd0a49</a>)</li> <li><strong>webpack:</strong> Correctly evaluate sourcemap name (<a href="https://github.com/nuxt/nuxt/commit/93e3d92b9">93e3d92b9</a>)</li> <li><strong>nuxt:</strong> Handle node10 resolution for <code>nuxt/meta</code> (<a href="https://github.com/nuxt/nuxt/commit/b748840bc">b748840bc</a>)</li> <li><strong>nuxt:</strong> Do not early return if component priorities conflict (<a href="https://github.com/nuxt/nuxt/pull/33955" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33955/hovercard">#33955</a>)</li> <li><strong>nuxt:</strong> Use <code>key</code> for tag deduplication in <code>&lt;Head&gt;</code> component (<a href="https://github.com/nuxt/nuxt/pull/33958" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33958/hovercard">#33958</a>)</li> <li><strong>schema,vite:</strong> Resolve <code>build.transpile</code> when initialising vite (<a href="https://github.com/nuxt/nuxt/pull/33868" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33868/hovercard">#33868</a>)</li> <li><strong>nuxt,rspack,webpack:</strong> Inject module identifiers for webpack builders (<a href="https://github.com/nuxt/nuxt/pull/33962" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33962/hovercard">#33962</a>)</li> <li><strong>nuxt:</strong> Add key to head components for proper deduplication (<a href="https://github.com/nuxt/nuxt/pull/33963" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33963/hovercard">#33963</a>)</li> <li><strong>nitro:</strong> Check prettyResponse.body type before error overlay (<a href="https://github.com/nuxt/nuxt/pull/33977" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33977/hovercard">#33977</a>)</li> <li><strong>nuxt:</strong> Don't URI-encode static route paths (<a href="https://github.com/nuxt/nuxt/pull/33990" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33990/hovercard">#33990</a>)</li> <li><strong>nuxt:</strong> Skip internal stub routes from prerender (<a href="https://github.com/nuxt/nuxt/pull/34001" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34001/hovercard">#34001</a>)</li> <li><strong>kit,schema:</strong> Align module <code>onUpgrade</code> arguments with types (<a href="https://github.com/nuxt/nuxt/pull/33988" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33988/hovercard">#33988</a>)</li> <li><strong>nuxt:</strong> Handle unsafe number parsing in useCookie decode (<a href="https://github.com/nuxt/nuxt/pull/34007" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34007/hovercard">#34007</a>)</li> <li><strong>nuxt:</strong> Do not externalise <code>rou3</code> (<a href="https://github.com/nuxt/nuxt/commit/7da94e8c3">7da94e8c3</a>)</li> <li><strong>nitro:</strong> Add <code>noUncheckedIndexedAccess</code> to server tsconfig (<a href="https://github.com/nuxt/nuxt/pull/33985" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33985/hovercard">#33985</a>)</li> <li><strong>nuxt:</strong> Update global reference to globalThis in <code>useRequestFetch</code> (<a href="https://github.com/nuxt/nuxt/pull/33976" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33976/hovercard">#33976</a>)</li> <li><strong>vite:</strong> Configure hmr port for server build (<a href="https://github.com/nuxt/nuxt/pull/33929" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33929/hovercard">#33929</a>)</li> <li><strong>kit:</strong> Add forward compatible nitro v3 types (<a href="https://github.com/nuxt/nuxt/pull/34053" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34053/hovercard">#34053</a>)</li> <li><strong>nitro,nuxt:</strong> Do not import nitro deps in builders (<a href="https://github.com/nuxt/nuxt/pull/34054" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34054/hovercard">#34054</a>)</li> <li><strong>nitro:</strong> Add <code>h3</code> types to auto-imports (<a href="https://github.com/nuxt/nuxt/pull/34035" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34035/hovercard">#34035</a>)</li> <li><strong>schema:</strong> Add some more directories to ignore (<a href="https://github.com/nuxt/nuxt/commit/9cb9a19dd">9cb9a19dd</a>)</li> <li><strong>nitro:</strong> Also augment <code>nuxt/schema</code> (<a href="https://github.com/nuxt/nuxt/commit/9b40196a6">9b40196a6</a>)</li> <li><strong>nuxt:</strong> Make asyncData properties reactive in Options API (<a href="https://github.com/nuxt/nuxt/pull/34119" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34119/hovercard">#34119</a>)</li> <li><strong>nuxt:</strong> Rerender <code>NuxtPage</code> when nested <code>NuxtLayout</code> has explicitly disabled layouts (<a href="https://github.com/nuxt/nuxt/pull/34078" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34078/hovercard">#34078</a>)</li> <li><strong>nuxt,schema:</strong> Clean up types (<a href="https://github.com/nuxt/nuxt/commit/5ce351d0f">5ce351d0f</a>)</li> <li><strong>nuxt:</strong> Allow user augmentation of runtime config (<a href="https://github.com/nuxt/nuxt/commit/dd30410cb">dd30410cb</a>)</li> <li><strong>kit,nitro:</strong> Enable <code>allowArbitraryExtensions</code> by default (<a href="https://github.com/nuxt/nuxt/pull/34084" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34084/hovercard">#34084</a>)</li> <li><strong>nuxt:</strong> Decode client-side pathname for non-ASCII route aliases (<a href="https://github.com/nuxt/nuxt/pull/34043" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34043/hovercard">#34043</a>)</li> <li><strong>nuxt:</strong> Force remount suspense when navigating after pending (<a href="https://github.com/nuxt/nuxt/pull/33991" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33991/hovercard">#33991</a>)</li> <li><strong>nuxt:</strong> Add documentation link to server builder error message (<a href="https://github.com/nuxt/nuxt/pull/34122" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34122/hovercard">#34122</a>)</li> <li><strong>nuxt:</strong> Validate placeholder/fallback tags + warn about placeholder/fallback props (<a href="https://github.com/nuxt/nuxt/commit/f7912d3f3">f7912d3f3</a>)</li> <li><strong>nuxt:</strong> Force flush <code>useAsyncData</code> debounced execute post watcher flush (<a href="https://github.com/nuxt/nuxt/pull/34125" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34125/hovercard">#34125</a>)</li> <li><strong>nitro:</strong> Process isr/swr/cache keys (<a href="https://github.com/nuxt/nuxt/commit/7f2bf4d13">7f2bf4d13</a>)</li> <li><strong>nuxt:</strong> Add <code>typeFrom</code> support for <code>imports.d.ts</code> template exports (<a href="https://github.com/nuxt/nuxt/pull/34135" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34135/hovercard">#34135</a>)</li> <li><strong>nuxt:</strong> Ensure we inline styles for <code>hydrate-never</code> components (<a href="https://github.com/nuxt/nuxt/pull/34132" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34132/hovercard">#34132</a>)</li> </ul> <h3>๐Ÿ’… Refactors</h3> <ul> <li><strong>kit:</strong> Add explicit return types for kit utilities (<a href="https://github.com/nuxt/nuxt/commit/ec2239cb4">ec2239cb4</a>)</li> <li><strong>nitro,nuxt,schema,vite:</strong> Provide explicit return types (<a href="https://github.com/nuxt/nuxt/commit/2564002de">2564002de</a>)</li> <li><strong>kit,nuxt,schema:</strong> Use named imports from <code>defu</code> + <code>consola</code> (<a href="https://github.com/nuxt/nuxt/commit/e31668f67">e31668f67</a>)</li> <li>Add explicit <code>.ts</code> file extensions to relative imports (<a href="https://github.com/nuxt/nuxt/commit/458f3c9b6">458f3c9b6</a>)</li> <li><strong>kit,nitro,nuxt,schema:</strong> Reduce barrels + move <code>&lt;&gt;</code> to <code>as</code> (<a href="https://github.com/nuxt/nuxt/commit/08f72881e">08f72881e</a>)</li> <li><strong>nitro,nuxt:</strong> Use <code>~</code> prefix for internal ssrContext properties (<a href="https://github.com/nuxt/nuxt/pull/33896" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33896/hovercard">#33896</a>)</li> <li><strong>nitro:</strong> Add explicit return types for runtime utils (<a href="https://github.com/nuxt/nuxt/commit/74bb6ddeb">74bb6ddeb</a>)</li> <li><strong>nitro:</strong> Move tree-shaken flags from replace plugin -&gt; vfs (<a href="https://github.com/nuxt/nuxt/pull/33907" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33907/hovercard">#33907</a>)</li> <li><strong>nitro,nuxt,vite,webpack:</strong> Use <code>status</code>/<code>statusText</code> + deprecate old props (<a href="https://github.com/nuxt/nuxt/pull/33912" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33912/hovercard">#33912</a>)</li> <li><strong>webpack:</strong> Use RuntimeModule API for chunk preloads (<a href="https://github.com/nuxt/nuxt/pull/33930" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33930/hovercard">#33930</a>)</li> <li><strong>nuxt:</strong> Use AST-aware function key injection (<a href="https://github.com/nuxt/nuxt/pull/33446" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33446/hovercard">#33446</a>)</li> <li><strong>nitro,nuxt,schema:</strong> Use augments for nitro schema types (<a href="https://github.com/nuxt/nuxt/pull/34039" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34039/hovercard">#34039</a>)</li> <li><strong>nitro,rspack,vite,webpack:</strong> Move cors handling -&gt; nitro builder (<a href="https://github.com/nuxt/nuxt/pull/34048" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34048/hovercard">#34048</a>)</li> <li><strong>nitro:</strong> Move to <code>nitropack/runtime</code> namespace (<a href="https://github.com/nuxt/nuxt/commit/b06d53166">b06d53166</a>)</li> <li><strong>nitro,nuxt:</strong> Move to <code>nitropack/runtime</code> namespace (<a href="https://github.com/nuxt/nuxt/commit/897a2259f">897a2259f</a>)</li> </ul> <h3>๐Ÿ“– Documentation</h3> <ul> <li>Fix <code>useHead</code> return type (<a href="https://github.com/nuxt/nuxt/pull/33857" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33857/hovercard">#33857</a>)</li> <li>Add correct instructions to upgrade to latest Nuxt 3.x (<a href="https://github.com/nuxt/nuxt/pull/33866" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33866/hovercard">#33866</a>)</li> <li>Improve grammar (<a href="https://github.com/nuxt/nuxt/pull/34093" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34093/hovercard">#34093</a>)</li> <li>Use h2 for nuxt add command page (<a href="https://github.com/nuxt/nuxt/commit/a0a1763d5">a0a1763d5</a>)</li> <li>Update links to module guide (<a href="https://github.com/nuxt/nuxt/commit/c9c1282f8">c9c1282f8</a>)</li> <li>Split and improve <code>Module Author Guides</code> (<a href="https://github.com/nuxt/nuxt/pull/33803" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33803/hovercard">#33803</a>)</li> <li>Split directory structure and re-order guides (v4) (<a href="https://github.com/nuxt/nuxt/pull/33691" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33691/hovercard">#33691</a>)</li> <li>Add mcp server and llms.txt (<a href="https://github.com/nuxt/nuxt/pull/33371" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33371/hovercard">#33371</a>)</li> <li>Add note that middleware doesn't run when rendering islands (<a href="https://github.com/nuxt/nuxt/commit/d22cf7903">d22cf7903</a>)</li> <li>Add note on default branch for layers (<a href="https://github.com/nuxt/nuxt/pull/33919" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33919/hovercard">#33919</a>)</li> <li>Add mcp setup instructions for claude desktop (<a href="https://github.com/nuxt/nuxt/pull/33914" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33914/hovercard">#33914</a>)</li> <li>Mention deno as package manager (<a href="https://github.com/nuxt/nuxt/pull/33875" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33875/hovercard">#33875</a>)</li> <li>Clarify purpose of <code>statusText</code> (<a href="https://github.com/nuxt/nuxt/pull/32834" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32834/hovercard">#32834</a>)</li> <li>Update lychee config and remove medium article link (<a href="https://github.com/nuxt/nuxt/commit/36c19ce73">36c19ce73</a>)</li> <li>Update module count and fix typo (<a href="https://github.com/nuxt/nuxt/pull/33950" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33950/hovercard">#33950</a>)</li> <li>Add DeepWiki badge (<a href="https://github.com/nuxt/nuxt/pull/33508" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33508/hovercard">#33508</a>)</li> <li>Give example of usage of <code>defineWrappedResponseHandler</code> (<a href="https://github.com/nuxt/nuxt/pull/33952" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33952/hovercard">#33952</a>)</li> <li>Provide cleaner example code for vitest projects (<a href="https://github.com/nuxt/nuxt/pull/33960" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33960/hovercard">#33960</a>)</li> <li>Update yarn create command (<a href="https://github.com/nuxt/nuxt/commit/b30432979">b30432979</a>)</li> <li>Update roadmap with a11y (<a href="https://github.com/nuxt/nuxt/commit/7ea35137c">7ea35137c</a>)</li> <li>Add a11y release (<a href="https://github.com/nuxt/nuxt/pull/34041" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34041/hovercard">#34041</a>)</li> <li>Remove Nuxtr from recommendations (<a href="https://github.com/nuxt/nuxt/pull/34045" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34045/hovercard">#34045</a>)</li> <li>Remove duplicate feature (<a href="https://github.com/nuxt/nuxt/pull/34058" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34058/hovercard">#34058</a>)</li> <li>Provide deno package manager examples (<a href="https://github.com/nuxt/nuxt/pull/34070" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34070/hovercard">#34070</a>)</li> <li>Make custom wrapper recipe link more prominent (<a href="https://github.com/nuxt/nuxt/pull/34085" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34085/hovercard">#34085</a>)</li> <li><strong>nuxt:</strong> Mention custom serializers in <code>useState</code> docs (<a href="https://github.com/nuxt/nuxt/pull/34105" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34105/hovercard">#34105</a>)</li> <li>Clarify module setups in <code>.nuxtrc</code> example (<a href="https://github.com/nuxt/nuxt/pull/34107" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34107/hovercard">#34107</a>)</li> <li>Add layers directory documentation (<a href="https://github.com/nuxt/nuxt/pull/33967" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33967/hovercard">#33967</a>)</li> <li>Add a tip for <code>appLayout</code> (<a href="https://github.com/nuxt/nuxt/commit/9b78698c3">9b78698c3</a>)</li> <li>Add docs for disabling modules by passing <code>false</code> to its options (<a href="https://github.com/nuxt/nuxt/commit/18500730c">18500730c</a>)</li> <li>Add info about caching payloads with isr/swr (<a href="https://github.com/nuxt/nuxt/commit/4b055548e">4b055548e</a>)</li> <li>Add example for async addVitePlugin (<a href="https://github.com/nuxt/nuxt/commit/4407f6862">4407f6862</a>)</li> <li>Add example of passing props to layouts (<a href="https://github.com/nuxt/nuxt/commit/401aa90ab">401aa90ab</a>)</li> <li>Mark vite plugin as not typed (<a href="https://github.com/nuxt/nuxt/commit/25eae7699">25eae7699</a>)</li> <li>Add warning about <code>source</code> from <code>&lt;NuxtIsland&gt;</code> (<a href="https://github.com/nuxt/nuxt/commit/08778c98c">08778c98c</a>)</li> <li>Sync with main branch (<a href="https://github.com/nuxt/nuxt/commit/e8c04aaa6">e8c04aaa6</a>)</li> <li>Fix ai guide link (<a href="https://github.com/nuxt/nuxt/commit/01c173b78">01c173b78</a>)</li> </ul> <h3>๐Ÿ“ฆ Build</h3> <ul> <li>Remove babel debugging plugin from jiti stub options (<a href="https://github.com/nuxt/nuxt/commit/1ec010681">1ec010681</a>)</li> <li><strong>vite:</strong> Add build entries for <code>vite-node</code> entrypoints (<a href="https://github.com/nuxt/nuxt/pull/33893" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33893/hovercard">#33893</a>)</li> <li><strong>nuxt:</strong> Tidy up subpath export types (<a href="https://github.com/nuxt/nuxt/commit/fe92e9c17">fe92e9c17</a>)</li> <li>Use <code>obuild</code> except for nuxt + nitro-server packages (<a href="https://github.com/nuxt/nuxt/pull/34049" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34049/hovercard">#34049</a>)</li> <li><strong>schema:</strong> Fix <code>/builder-env</code> subpath types (<a href="https://github.com/nuxt/nuxt/commit/1951648fa">1951648fa</a>)</li> </ul> <h3>๐Ÿก Chore</h3> <ul> <li>Add return types to debug plugins (<a href="https://github.com/nuxt/nuxt/commit/1d4f9a3ae">1d4f9a3ae</a>)</li> <li>Add <code>build:stub</code> command for those that need it (<a href="https://github.com/nuxt/nuxt/commit/c682b2681">c682b2681</a>)</li> <li>Revert change to how type augments are inserted (<a href="https://github.com/nuxt/nuxt/commit/6a238b576">6a238b576</a>)</li> <li>Do not require aligned columns in tables (<a href="https://github.com/nuxt/nuxt/commit/d8a90b3d5">d8a90b3d5</a>)</li> <li>Update eslint config rule (<a href="https://github.com/nuxt/nuxt/commit/d87ed519a">d87ed519a</a>)</li> <li>Explicitly import <code>node:process</code> (<a href="https://github.com/nuxt/nuxt/pull/33982" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33982/hovercard">#33982</a>)</li> <li>Add root scripts to lint context (<a href="https://github.com/nuxt/nuxt/commit/ee83838b4">ee83838b4</a>)</li> <li>Tidy up configs (<a href="https://github.com/nuxt/nuxt/commit/ab131b464">ab131b464</a>)</li> <li>Add <code>.nuxtrc</code> with test-utils setup (<a href="https://github.com/nuxt/nuxt/commit/b5879351f">b5879351f</a>)</li> <li>Add eslint ignore (<a href="https://github.com/nuxt/nuxt/commit/87811234d">87811234d</a>)</li> <li>Upgrade <code>vite-node</code> separately from <code>vitest</code> (<a href="https://github.com/nuxt/nuxt/commit/8114e886f">8114e886f</a>)</li> <li>Lint docs with eslint (<a href="https://github.com/nuxt/nuxt/commit/d2d5f6733">d2d5f6733</a>)</li> <li>Lint (<a href="https://github.com/nuxt/nuxt/commit/b9df0e847">b9df0e847</a>)</li> <li>Lint (<a href="https://github.com/nuxt/nuxt/commit/0efcf01fa">0efcf01fa</a>)</li> </ul> <h3>โœ… Tests</h3> <ul> <li>Update tests for new version of nuxt/test-utils (<a href="https://github.com/nuxt/nuxt/pull/33842" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33842/hovercard">#33842</a>)</li> <li>Avoid unnecessary tick (<a href="https://github.com/nuxt/nuxt/commit/fb4720840">fb4720840</a>)</li> <li>Add regression test for asyncData HMR (<a href="https://github.com/nuxt/nuxt/pull/32182" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32182/hovercard">#32182</a>)</li> <li>Add test for page hmr resetting state (<a href="https://github.com/nuxt/nuxt/pull/32418" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/32418/hovercard">#32418</a>)</li> <li>Add reproduction for vite pre-transform error (<a href="https://github.com/nuxt/nuxt/pull/31574" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/31574/hovercard">#31574</a>)</li> <li>Add regression test for <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3073110088" data-permission-text="Title is private" data-url="https://github.com/nuxt/nuxt/issues/32154" data-hovercard-type="issue" data-hovercard-url="/nuxt/nuxt/issues/32154/hovercard" href="https://github.com/nuxt/nuxt/issues/32154">#32154</a> (<a href="https://github.com/nuxt/nuxt/issues/32154" data-hovercard-type="issue" data-hovercard-url="/nuxt/nuxt/issues/32154/hovercard">#32154</a>)</li> <li>Use <code>vi.hoisted</code> for klona mock (<a href="https://github.com/nuxt/nuxt/pull/34113" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34113/hovercard">#34113</a>)</li> <li>Update bundle size (<a href="https://github.com/nuxt/nuxt/commit/e6c8d10c6">e6c8d10c6</a>)</li> <li>Fix paths in hmr test (<a href="https://github.com/nuxt/nuxt/commit/3b8b2138a">3b8b2138a</a>)</li> <li>Update snapshots (<a href="https://github.com/nuxt/nuxt/commit/51c83b8ec">51c83b8ec</a>)</li> <li>Update bundle size (<a href="https://github.com/nuxt/nuxt/commit/22708c05c">22708c05c</a>)</li> </ul> <h3>๐Ÿค– CI</h3> <ul> <li>Directly call webhook url (<a href="https://github.com/nuxt/nuxt/commit/4eedbcae5">4eedbcae5</a>)</li> <li>Use new reusable triage workflows (<a href="https://github.com/nuxt/nuxt/pull/34072" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/34072/hovercard">#34072</a>)</li> <li>Use new shared dependency review workflow (<a href="https://github.com/nuxt/nuxt/commit/9e6770f18">9e6770f18</a>)</li> </ul> <h3>โค๏ธ Contributors</h3> <ul> <li>Daniel Roe (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/danielroe/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/danielroe">@danielroe</a>)</li> <li>Florian Heuberger (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Flo0806/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Flo0806">@Flo0806</a>)</li> <li>Octavio Araiza (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/8ctavio/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/8ctavio">@8ctavio</a>)</li> <li>Robin (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/OrbisK/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/OrbisK">@OrbisK</a>)</li> <li>shaheer-arbisoft (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/shaheer-arbisoft/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/shaheer-arbisoft">@shaheer-arbisoft</a>)</li> <li>Francesco Mussoni (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/solidusite/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/solidusite">@solidusite</a>)</li> <li>Danila Poyarkov (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/dannote/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dannote">@dannote</a>)</li> <li>Teages (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Teages/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Teages">@Teages</a>)</li> <li>Anthony Fu (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/antfu/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/antfu">@antfu</a>)</li> <li>Eli Sterken (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/eli-sterk/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/eli-sterk">@eli-sterk</a>)</li> <li>Ryota Watanabe (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/wattanx/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/wattanx">@wattanx</a>)</li> <li>edison (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/edison1105/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/edison1105">@edison1105</a>)</li> <li>Max (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/onmax/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/onmax">@onmax</a>)</li> <li>Rahul Dogra (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/rahuld109/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/rahuld109">@rahuld109</a>)</li> <li>abeer0 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iiio2/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iiio2">@iiio2</a>)</li> <li>Philipp Wagner (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/imphil/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/imphil">@imphil</a>)</li> <li>Maxime Pauvert (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/maximepvrt/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/maximepvrt">@maximepvrt</a>)</li> <li>Wind (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/productdevbook/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/productdevbook">@productdevbook</a>)</li> <li>Agatem (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/agatemosu/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/agatemosu">@agatemosu</a>)</li> <li>Pavel (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/eL1fe/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/eL1fe">@eL1fe</a>)</li> <li>Lucie (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/lihbr/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/lihbr">@lihbr</a>)</li> <li>Sergiu Ravliuc (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/YoSoySergio/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/YoSoySergio">@YoSoySergio</a>)</li> <li>Julien Huang (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/huang-julien/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/huang-julien">@huang-julien</a>)</li> <li>Saeid Zareie (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Saeid-Za/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Saeid-Za">@Saeid-Za</a>)</li> <li>Alireza Jahandideh (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Youhan/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Youhan">@Youhan</a>)</li> <li>kikuchan (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/kikuchan/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/kikuchan">@kikuchan</a>)</li> <li>Ragura (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Ragura/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Ragura">@Ragura</a>)</li> <li>Josh Deltener (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/hecktarzuli/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/hecktarzuli">@hecktarzuli</a>)</li> <li>Teena (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/franklin-tina/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/franklin-tina">@franklin-tina</a>)</li> <li>Matej ฤŒernรฝ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/cernymatej/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/cernymatej">@cernymatej</a>)</li> <li>Frederik BuรŸmann (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/freb97/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/freb97">@freb97</a>)</li> <li>Benjamin Oddou (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/BenjaminOddou/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/BenjaminOddou">@BenjaminOddou</a>)</li> <li>Mukund Shah (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/mukundshah/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/mukundshah">@mukundshah</a>)</li> <li>Jessรฉ Correia Lins (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/linspw/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/linspw">@linspw</a>)</li> <li>Jannik Sohn (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/janniksohn/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/janniksohn">@janniksohn</a>)</li> <li>Dawit (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oneminch/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oneminch">@oneminch</a>)</li> <li>Ali Sokkar (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/NyllRE/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/NyllRE">@NyllRE</a>)</li> <li>Horu (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/HigherOrderLogic/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/HigherOrderLogic">@HigherOrderLogic</a>)</li> <li>Hugo (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/HugoRCD/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/HugoRCD">@HugoRCD</a>)</li> <li>Sรฉbastien Chopin (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/atinux/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/atinux">@atinux</a>)</li> <li>David Stack (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/davidstackio/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/davidstackio">@davidstackio</a>)</li> <li>Ruslan Stelmachenko (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/xak2000/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/xak2000">@xak2000</a>)</li> <li>Harlan Wilton (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/harlan-zw/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/harlan-zw">@harlan-zw</a>)</li> <li>Alexander Lichter (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/TheAlexLichter/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/TheAlexLichter">@TheAlexLichter</a>)</li> <li>Ryan Wilson (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/rywils/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/rywils">@rywils</a>)</li> <li>yamachi4416 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/yamachi4416/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/yamachi4416">@yamachi4416</a>)</li> </ul> danielroe tag:github.com,2008:Repository/71995937/v4.2.2 2025-12-09T17:17:31Z v4.2.2 <blockquote> <p>4.2.2 is the next patch release.</p> </blockquote> <h2>โœ… Upgrading</h2> <p>Our recommendation for upgrading is to run:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="npx nuxt upgrade --dedupe"><pre>npx nuxt upgrade --dedupe</pre></div> <p>This will deduplicate your lockfile as well, and help ensure that you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.</p> <h2>๐Ÿ‘‰ Changelog</h2> <p><a href="https://github.com/nuxt/nuxt/compare/v4.2.1...v4.2.2">compare changes</a></p> <h3>๐Ÿฉน Fixes</h3> <ul> <li><strong>nitro:</strong> Do not show pretty error handler when testing (<a href="https://github.com/nuxt/nuxt/commit/243261edb">243261edb</a>)</li> <li><strong>nuxt:</strong> Generate valid references for component declaration items (<a href="https://github.com/nuxt/nuxt/pull/33388" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33388/hovercard">#33388</a>)</li> <li><strong>nuxt:</strong> Sync internal route before calling <code>page:finish</code> hook (<a href="https://github.com/nuxt/nuxt/pull/33707" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33707/hovercard">#33707</a>)</li> <li><strong>kit:</strong> Add TypeScript path alias support for test files (<a href="https://github.com/nuxt/nuxt/pull/33672" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33672/hovercard">#33672</a>)</li> <li><strong>nitro:</strong> Ensure html is a string before injecting error handler (<a href="https://github.com/nuxt/nuxt/commit/f70b70c97">f70b70c97</a>)</li> <li><strong>nitro:</strong> Include layer server directories in <code>tsconfig.server.json</code> (<a href="https://github.com/nuxt/nuxt/pull/33510" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33510/hovercard">#33510</a>)</li> <li><strong>nuxt:</strong> Ensure deduped async data executions return latest promise (<a href="https://github.com/nuxt/nuxt/pull/33740" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33740/hovercard">#33740</a>)</li> <li><strong>kit,nuxt:</strong> Type + respect <code>moduleDependencies</code> by meta name (<a href="https://github.com/nuxt/nuxt/pull/33774" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33774/hovercard">#33774</a>)</li> <li><strong>nuxt,schema:</strong> Ignore <code>.d.vue.ts</code> declarations (<a href="https://github.com/nuxt/nuxt/commit/1c73525a2">1c73525a2</a>)</li> <li><strong>kit,nuxt:</strong> Protect against resolved nuxt module subpath (<a href="https://github.com/nuxt/nuxt/pull/33767" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33767/hovercard">#33767</a>)</li> <li><strong>nuxt:</strong> Re-execute <code>callOnce</code> during HMR (<a href="https://github.com/nuxt/nuxt/pull/33810" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33810/hovercard">#33810</a>)</li> <li><strong>nuxt:</strong> Resolve watch callback after reactive key change in <code>useAsyncData</code> (<a href="https://github.com/nuxt/nuxt/pull/33802" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33802/hovercard">#33802</a>)</li> <li><strong>nuxt:</strong> Escape HTML in development error page stack trace (<a href="https://github.com/nuxt/nuxt/pull/33820" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33820/hovercard">#33820</a>)</li> <li><strong>kit:</strong> Do not add resolved <code>rootDir</code> to cached layer config (<a href="https://github.com/nuxt/nuxt/pull/33779" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33779/hovercard">#33779</a>)</li> <li><strong>kit,schema:</strong> Add <code>moduleDependencies</code> -&gt; <code>installModule</code> (<a href="https://github.com/nuxt/nuxt/pull/33689" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33689/hovercard">#33689</a>)</li> </ul> <h3>๐Ÿ’… Refactors</h3> <ul> <li><strong>nuxt:</strong> Improve type safety within <code>callOnce</code> function (<a href="https://github.com/nuxt/nuxt/pull/33825" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33825/hovercard">#33825</a>)</li> </ul> <h3>๐Ÿ“– Documentation</h3> <ul> <li>Split directory structure and re-order guides (v4) (<a href="https://github.com/nuxt/nuxt/pull/33691" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33691/hovercard">#33691</a>)</li> <li>Add hints release (<a href="https://github.com/nuxt/nuxt/pull/33701" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33701/hovercard">#33701</a>)</li> <li>Fix link to vitest globals config (<a href="https://github.com/nuxt/nuxt/pull/33702" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33702/hovercard">#33702</a>)</li> <li>Add mcp server and llms.txt (<a href="https://github.com/nuxt/nuxt/pull/33371" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33371/hovercard">#33371</a>)</li> <li>Fix 404 link (<a href="https://github.com/nuxt/nuxt/commit/98c2f1397">98c2f1397</a>)</li> <li>Text consistency (<a href="https://github.com/nuxt/nuxt/pull/33709" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33709/hovercard">#33709</a>)</li> <li>Type <code>error</code> as non-optional prop (<a href="https://github.com/nuxt/nuxt/pull/33763" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33763/hovercard">#33763</a>)</li> <li>Reformat tables (<a href="https://github.com/nuxt/nuxt/pull/33813" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33813/hovercard">#33813</a>)</li> </ul> <h3>๐Ÿก Chore</h3> <ul> <li>Update pnpm to 10.21 and enable trust policy (<a href="https://github.com/nuxt/nuxt/commit/d2c9711c0">d2c9711c0</a>)</li> <li>Revert pnpm trust policy and restore provenance action (<a href="https://github.com/nuxt/nuxt/commit/f9d0e0a3d">f9d0e0a3d</a>)</li> <li>Update markdownlint config to ignore mdc issues (<a href="https://github.com/nuxt/nuxt/commit/e7fff7132">e7fff7132</a>)</li> <li>Pin to single version of unstorage (<a href="https://github.com/nuxt/nuxt/commit/ec316eae8">ec316eae8</a>)</li> </ul> <h3>โœ… Tests</h3> <ul> <li>Add <code>patchProp</code> and <code>nodeOps</code> to excluded Vue helpers (<a href="https://github.com/nuxt/nuxt/pull/33754" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33754/hovercard">#33754</a>)</li> <li>Use fake timers for watch params test (<a href="https://github.com/nuxt/nuxt/commit/08d9d2f3b">08d9d2f3b</a>)</li> </ul> <h3>๐Ÿค– CI</h3> <ul> <li>Add <code>--pnpm</code> flag to correctly publish prerelease (<a href="https://github.com/nuxt/nuxt/pull/33688" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33688/hovercard">#33688</a>)</li> <li>Update action lint config (<a href="https://github.com/nuxt/nuxt/pull/33710" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33710/hovercard">#33710</a>)</li> </ul> <h3>โค๏ธ Contributors</h3> <ul> <li>Daniel Roe (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/danielroe/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/danielroe">@danielroe</a>)</li> <li>Florian Heuberger (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Flo0806/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Flo0806">@Flo0806</a>)</li> <li>Konstantin Telyakov (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/kTelyakov/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/kTelyakov">@kTelyakov</a>)</li> <li>abeer0 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iiio2/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iiio2">@iiio2</a>)</li> <li>Julien Huang (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/huang-julien/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/huang-julien">@huang-julien</a>)</li> <li>Matej ฤŒernรฝ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/cernymatej/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/cernymatej">@cernymatej</a>)</li> <li>Robin (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/OrbisK/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/OrbisK">@OrbisK</a>)</li> <li>Dheeraj Joshi (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/dheeraj3587/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dheeraj3587">@dheeraj3587</a>)</li> <li>Alexander Lichter (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/TheAlexLichter/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/TheAlexLichter">@TheAlexLichter</a>)</li> <li>Edwin Samodra (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/edwinsamodra/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/edwinsamodra">@edwinsamodra</a>)</li> <li>edison (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/edison1105/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/edison1105">@edison1105</a>)</li> <li>ๅฑฑๅน่‰ฒๅพกๅฎˆ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/KazariEX/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/KazariEX">@KazariEX</a>)</li> <li>Sรฉbastien Chopin (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/atinux/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/atinux">@atinux</a>)</li> <li>Hugo (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/HugoRCD/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/HugoRCD">@HugoRCD</a>)</li> <li>pierreoa (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/pierreoa/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/pierreoa">@pierreoa</a>)</li> <li>Maxime Pauvert (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/maximepvrt/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/maximepvrt">@maximepvrt</a>)</li> </ul> danielroe tag:github.com,2008:Repository/71995937/v3.20.2 2025-12-09T17:13:52Z v3.20.2 <blockquote> <p>3.20.2 is the next patch release.</p> </blockquote> <h2>โœ… Upgrading</h2> <p>Our recommendation for upgrading is to run:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="npx nuxt upgrade --dedupe --channel=v3"><pre>npx nuxt upgrade --dedupe --channel=v3</pre></div> <p>This will deduplicate your lockfile as well, and help ensure that you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.</p> <div class="markdown-alert markdown-alert-note"><p class="markdown-alert-title"><svg class="octicon octicon-info mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>Note</p><p>This will only work if you <em>already have</em> a version of <code>@nuxt/cli</code> which has the <code>--channel</code> flag. If this does not work, you can instead run <code>npx nuxi@latest</code> for the initial upgrade.</p> </div> <h2>๐Ÿ‘‰ Changelog</h2> <p><a href="https://github.com/nuxt/nuxt/compare/v3.20.1...v3.20.2">compare changes</a></p> <h3>๐Ÿฉน Fixes</h3> <ul> <li><strong>nitro:</strong> Do not show pretty error handler when testing (<a href="https://github.com/nuxt/nuxt/commit/cc75ce409">cc75ce409</a>)</li> <li><strong>nuxt:</strong> Generate valid references for component declaration items (<a href="https://github.com/nuxt/nuxt/pull/33388" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33388/hovercard">#33388</a>)</li> <li><strong>nuxt:</strong> Sync internal route before calling <code>page:finish</code> hook (<a href="https://github.com/nuxt/nuxt/pull/33707" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33707/hovercard">#33707</a>)</li> <li><strong>nitro:</strong> Ensure html is a string before injecting error handler (<a href="https://github.com/nuxt/nuxt/commit/6f51a25e9">6f51a25e9</a>)</li> <li><strong>nitro:</strong> Include layer server directories in <code>tsconfig.server.json</code> (<a href="https://github.com/nuxt/nuxt/pull/33510" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33510/hovercard">#33510</a>)</li> <li><strong>nuxt:</strong> Ensure deduped async data executions return latest promise (<a href="https://github.com/nuxt/nuxt/pull/33740" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33740/hovercard">#33740</a>)</li> <li><strong>kit,nuxt:</strong> Type + respect <code>moduleDependencies</code> by meta name (<a href="https://github.com/nuxt/nuxt/pull/33774" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33774/hovercard">#33774</a>)</li> <li><strong>nuxt,schema:</strong> Ignore <code>.d.vue.ts</code> declarations (<a href="https://github.com/nuxt/nuxt/commit/9a6a770ab">9a6a770ab</a>)</li> <li><strong>kit,nuxt:</strong> Protect against resolved nuxt module subpath (<a href="https://github.com/nuxt/nuxt/pull/33767" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33767/hovercard">#33767</a>)</li> <li><strong>nuxt:</strong> Re-execute <code>callOnce</code> during HMR (<a href="https://github.com/nuxt/nuxt/pull/33810" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33810/hovercard">#33810</a>)</li> <li><strong>nuxt:</strong> Resolve watch callback after reactive key change in <code>useAsyncData</code> (<a href="https://github.com/nuxt/nuxt/pull/33802" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33802/hovercard">#33802</a>)</li> <li><strong>nuxt:</strong> Escape HTML in development error page stack trace (<a href="https://github.com/nuxt/nuxt/pull/33820" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33820/hovercard">#33820</a>)</li> <li><strong>kit:</strong> Do not add resolved <code>rootDir</code> to cached layer config (<a href="https://github.com/nuxt/nuxt/pull/33779" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33779/hovercard">#33779</a>)</li> <li><strong>kit,schema:</strong> Add <code>moduleDependencies</code> -&gt; <code>installModule</code> (<a href="https://github.com/nuxt/nuxt/pull/33689" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33689/hovercard">#33689</a>)</li> </ul> <h3>๐Ÿ’… Refactors</h3> <ul> <li><strong>nuxt:</strong> Improve type safety within <code>callOnce</code> function (<a href="https://github.com/nuxt/nuxt/pull/33825" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33825/hovercard">#33825</a>)</li> </ul> <h3>๐Ÿ“– Documentation</h3> <ul> <li>Split directory structure and re-order guides (v3) (<a href="https://github.com/nuxt/nuxt/pull/33690" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33690/hovercard">#33690</a>)</li> <li>Fix link (<a href="https://github.com/nuxt/nuxt/commit/016ef66e3">016ef66e3</a>)</li> <li>Add hints release (<a href="https://github.com/nuxt/nuxt/pull/33701" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33701/hovercard">#33701</a>)</li> <li>Fix link to vitest globals config (<a href="https://github.com/nuxt/nuxt/pull/33702" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33702/hovercard">#33702</a>)</li> <li>Fix 404 link (<a href="https://github.com/nuxt/nuxt/commit/5543b7cf7">5543b7cf7</a>)</li> <li>Text consistency (<a href="https://github.com/nuxt/nuxt/pull/33709" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33709/hovercard">#33709</a>)</li> <li>Type <code>error</code> as non-optional prop (<a href="https://github.com/nuxt/nuxt/pull/33763" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33763/hovercard">#33763</a>)</li> </ul> <h3>๐Ÿก Chore</h3> <ul> <li>Update pnpm to 10.21 and enable trust policy (<a href="https://github.com/nuxt/nuxt/commit/1cb55efc0">1cb55efc0</a>)</li> <li>Revert pnpm trust policy and restore provenance action (<a href="https://github.com/nuxt/nuxt/commit/103ae1351">103ae1351</a>)</li> <li>Update markdownlint config to ignore mdc issues (<a href="https://github.com/nuxt/nuxt/commit/d4933e26e">d4933e26e</a>)</li> <li>Pin to single version of unstorage (<a href="https://github.com/nuxt/nuxt/commit/619956e7f">619956e7f</a>)</li> </ul> <h3>โœ… Tests</h3> <ul> <li>Add <code>patchProp</code> and <code>nodeOps</code> to excluded Vue helpers (<a href="https://github.com/nuxt/nuxt/pull/33754" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33754/hovercard">#33754</a>)</li> <li>Use fake timers for watch params test (<a href="https://github.com/nuxt/nuxt/commit/58607fbea">58607fbea</a>)</li> <li>Update test for v3 defaults (<a href="https://github.com/nuxt/nuxt/commit/daa002638">daa002638</a>)</li> </ul> <h3>๐Ÿค– CI</h3> <ul> <li>Add <code>--pnpm</code> flag to correctly publish prerelease (<a href="https://github.com/nuxt/nuxt/pull/33688" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33688/hovercard">#33688</a>)</li> <li>Update action lint config (<a href="https://github.com/nuxt/nuxt/pull/33710" data-hovercard-type="pull_request" data-hovercard-url="/nuxt/nuxt/pull/33710/hovercard">#33710</a>)</li> </ul> <h3>โค๏ธ Contributors</h3> <ul> <li>Daniel Roe (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/danielroe/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/danielroe">@danielroe</a>)</li> <li>Alexander Lichter (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/TheAlexLichter/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/TheAlexLichter">@TheAlexLichter</a>)</li> <li>Florian Heuberger (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Flo0806/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Flo0806">@Flo0806</a>)</li> <li>Konstantin Telyakov (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/kTelyakov/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/kTelyakov">@kTelyakov</a>)</li> <li>abeer0 (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iiio2/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iiio2">@iiio2</a>)</li> <li>Julien Huang (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/huang-julien/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/huang-julien">@huang-julien</a>)</li> <li>Robin (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/OrbisK/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/OrbisK">@OrbisK</a>)</li> <li>Dheeraj Joshi (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/dheeraj3587/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dheeraj3587">@dheeraj3587</a>)</li> <li>Edwin Samodra (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/edwinsamodra/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/edwinsamodra">@edwinsamodra</a>)</li> <li>edison (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/edison1105/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/edison1105">@edison1105</a>)</li> <li>ๅฑฑๅน่‰ฒๅพกๅฎˆ (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/KazariEX/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/KazariEX">@KazariEX</a>)</li> <li>Sรฉbastien Chopin (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/atinux/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/atinux">@atinux</a>)</li> <li>pierreoa (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/pierreoa/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/pierreoa">@pierreoa</a>)</li> <li>Maxime Pauvert (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/maximepvrt/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/maximepvrt">@maximepvrt</a>)</li> </ul> danielroe