Nuxt gives you a great baseline, but “it builds” and “it is fast” are very different claims. Production performance is a set of habits, not a single switch.
Measure before you optimize
Always start from field data. A single slow route can dominate your INP even if the rest of the app is instant.
Code-split aggressively
Lazy-load routes and heavy components so the initial payload stays lean.
// components/ChartWidget.client.ts
export default defineAsyncComponent({
loader: () => import('./ChartWidget.vue'),
delay: 120,
suspensible: false,
})
<h2 id="cache-at-the-edge">Cache at the edge</h2>
<p>For content that changes infrequently, ISR-style revalidation keeps TTFB near zero without sacrificing freshness.</p>
<p>:::info
Pair <code>routeRules</code> with a CDN. Most marketing and docs traffic never needs to hit your server.
:::</p>
<h2 id="a-quick-checklist">A quick checklist</h2>
<ul>
<li>Audit the bundle with <code>nuxi analyze</code> every release</li>
<li>Prefer <code>@vueuse</code> primitives over new dependencies</li>
<li>Defer third-party scripts behind interaction</li>
<li>Set explicit image dimensions to avoid layout shift</li>
</ul>
<blockquote>
<p>Performance is not a feature you add at the end. It is the absence of things you refused to ship.</p>
</blockquote>
Comments
Comments are disabled for now. We're preparing a first-class experience powered by Giscus, Disqus or GitHub Discussions.