Nuxt — The Vue Framework
You are an expert in Nuxt 3, the full-stack Vue framework with server-side rendering, auto-imports, file-based routing, API routes powered by Nitro, and 200+ modules. You help developers build production Vue applications with hybrid rendering (SSR/SSG/SPA per route), server components, middleware, state management with useState, data fetching with useFetch/useAsyncData, and deployment to 20+ platforms.
Core Capabilities
Pages and Routing
<!-- pages/index.vue — Auto-routed to / -->
<script setup lang="ts">
const { data: posts } = await useFetch('/api/posts')
</script>
<template>
<div>
<h1>Blog</h1>
<div v-for="post in posts" :key="post.id" class="post-card">
<NuxtLink :to="`/posts/${post.slug}`">
<h2>{{ post.title }}</h2>
<p>{{ post.excerpt }}</p>
</NuxtLink>
</div>
</div>
</template>
<!-- pages/posts/[slug].vue — Dynamic route -->
<script setup lang="ts">
const route = useRoute()
const { data: post, error } = await useAsyncData(
`post-${route.params.slug}`,
() => $fetch(`/api/posts/${route.params.slug}`)
)
if (error.value) {
throw createError({ statusCode: 404, message: 'Post not found' })
}
// SEO
useHead({
title: post.value?.title,
meta: [{ name: 'description', content: post.value?.excerpt }],
})
useSeoMeta({
ogTitle: post.value?.title,
ogImage: post.value?.coverImage,
})
</script>
<template>
<article v-if="post">
<h1>{{ post.title }}</h1>
<div v-html="post.content" />
</article>
</template>
Server API Routes
// server/api/posts/index.get.ts
export default defineEventHandler(async () => {
const posts = await db.posts.findMany({ orderBy: { createdAt: 'desc' } })
return posts
})
// server/api/posts/[slug].get.ts
export default defineEventHandler(async (event) => {
const slug = getRouterParam(event, 'slug')
const post = await db.posts.findUnique({ where: { slug } })
if (!post) throw createError({ statusCode: 404, message: 'Not found' })
return post
})
// server/api/posts/index.post.ts
export default defineEventHandler(async (event) => {
const body = await readBody(event)
const session = await requireAuth(event)
return db.posts.create({ data: { ...body, authorId: session.userId } })
})
// server/middleware/auth.ts
export default defineEventHandler(async (event) => {
const path = getRequestURL(event).pathname
if (!path.startsWith('/api/admin')) return
const session = await getSession(event)
if (!session) throw createError({ statusCode: 401 })
event.context.user = session.user
})
Composables and State
// composables/useAuth.ts — Auto-imported everywhere
export function useAuth() {
const user = useState<User | null>('user', () => null)
const isLoggedIn = computed(() => !!user.value)
async function login(email: string, password: string) {
user.value = await $fetch('/api/auth/login', { method: 'POST', body: { email, password } })
}
async function logout() {
await $fetch('/api/auth/logout', { method: 'POST' })
user.value = null
navigateTo('/login')
}
return { user, isLoggedIn, login, logout }
}
Installation
npx nuxi@latest init my-app
cd my-app && npm install
npm run dev
Best Practices
- Auto-imports — Components, composables, utils auto-imported; no import statements needed
- useFetch for data — SSR-safe data fetching; deduplicates requests, caches across navigation
- Hybrid rendering — Set per-route rendering in
nuxt.config.ts: SSR, SSG, SPA, or ISR
- useState — SSR-safe reactive state; shared across components, serialized server→client
- Server routes —
server/api/ directory; powered by Nitro; deploy to any platform
- SEO —
useHead() and useSeoMeta() for per-page meta tags; SSR-rendered for crawlers
- Modules — 200+ modules:
@nuxtjs/tailwindcss, @sidebase/nuxt-auth, @nuxt/image, etc.
- Nitro engine — Universal server deploys to Node, Vercel, Netlify, Cloudflare, Deno, Bun
1---2name: nuxt3description: You are an expert in Nuxt 3, the full-stack Vue framework with server-side rendering, auto-imports, file-based routing, API routes powered by Nitro, and 200+ modules. You help developers build production Vue applications with hybrid rendering (SSR/SSG/SPA per route), server components, middleware, state management with useState, data fetching with useFetch/useAsyncData, and deployment to 20+ platforms.4license: Apache-2.05---67# Nuxt — The Vue Framework89You are an expert in Nuxt 3, the full-stack Vue framework with server-side rendering, auto-imports, file-based routing, API routes powered by Nitro, and 200+ modules. You help developers build production Vue applications with hybrid rendering (SSR/SSG/SPA per route), server components, middleware, state management with useState, data fetching with useFetch/useAsyncData, and deployment to 20+ platforms.1011## Core Capabilities1213### Pages and Routing1415```vue16<!-- pages/index.vue — Auto-routed to / -->17<script setup lang="ts">18const { data: posts } = await useFetch('/api/posts')19</script>2021<template>22 <div>23 <h1>Blog</h1>24 <div v-for="post in posts" :key="post.id" class="post-card">25 <NuxtLink :to="`/posts/${post.slug}`">26 <h2>{{ post.title }}</h2>27 <p>{{ post.excerpt }}</p>28 </NuxtLink>29 </div>30 </div>31</template>32```3334```vue35<!-- pages/posts/[slug].vue — Dynamic route -->36<script setup lang="ts">37const route = useRoute()38const { data: post, error } = await useAsyncData(39 `post-${route.params.slug}`,40 () => $fetch(`/api/posts/${route.params.slug}`)41)4243if (error.value) {44 throw createError({ statusCode: 404, message: 'Post not found' })45}4647// SEO48useHead({49 title: post.value?.title,50 meta: [{ name: 'description', content: post.value?.excerpt }],51})5253useSeoMeta({54 ogTitle: post.value?.title,55 ogImage: post.value?.coverImage,56})57</script>5859<template>60 <article v-if="post">61 <h1>{{ post.title }}</h1>62 <div v-html="post.content" />63 </article>64</template>65```6667### Server API Routes6869```typescript70// server/api/posts/index.get.ts71export default defineEventHandler(async () => {72 const posts = await db.posts.findMany({ orderBy: { createdAt: 'desc' } })73 return posts74})7576// server/api/posts/[slug].get.ts77export default defineEventHandler(async (event) => {78 const slug = getRouterParam(event, 'slug')79 const post = await db.posts.findUnique({ where: { slug } })80 if (!post) throw createError({ statusCode: 404, message: 'Not found' })81 return post82})8384// server/api/posts/index.post.ts85export default defineEventHandler(async (event) => {86 const body = await readBody(event)87 const session = await requireAuth(event)88 return db.posts.create({ data: { ...body, authorId: session.userId } })89})9091// server/middleware/auth.ts92export default defineEventHandler(async (event) => {93 const path = getRequestURL(event).pathname94 if (!path.startsWith('/api/admin')) return95 const session = await getSession(event)96 if (!session) throw createError({ statusCode: 401 })97 event.context.user = session.user98})99```100101### Composables and State102103```typescript104// composables/useAuth.ts — Auto-imported everywhere105export function useAuth() {106 const user = useState<User | null>('user', () => null)107 const isLoggedIn = computed(() => !!user.value)108109 async function login(email: string, password: string) {110 user.value = await $fetch('/api/auth/login', { method: 'POST', body: { email, password } })111 }112113 async function logout() {114 await $fetch('/api/auth/logout', { method: 'POST' })115 user.value = null116 navigateTo('/login')117 }118119 return { user, isLoggedIn, login, logout }120}121```122123## Installation124125```bash126npx nuxi@latest init my-app127cd my-app && npm install128npm run dev129```130131## Best Practices1321331. **Auto-imports** — Components, composables, utils auto-imported; no import statements needed1342. **useFetch for data** — SSR-safe data fetching; deduplicates requests, caches across navigation1353. **Hybrid rendering** — Set per-route rendering in `nuxt.config.ts`: SSR, SSG, SPA, or ISR1364. **useState** — SSR-safe reactive state; shared across components, serialized server→client1375. **Server routes** — `server/api/` directory; powered by Nitro; deploy to any platform1386. **SEO** — `useHead()` and `useSeoMeta()` for per-page meta tags; SSR-rendered for crawlers1397. **Modules** — 200+ modules: `@nuxtjs/tailwindcss`, `@sidebase/nuxt-auth`, `@nuxt/image`, etc.1408. **Nitro engine** — Universal server deploys to Node, Vercel, Netlify, Cloudflare, Deno, Bun