Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Nuxt 3.x reference covering SSR, file-based routing, auto-imports, server routes, and Nitro deployment.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/core-directory-structure.md
1---2name: directory-structure3description: Nuxt project folder structure, conventions, and file organization4---56# Directory Structure78Nuxt uses conventions-based directory structure. Understanding it is key to effective development.910## Standard Project Structure1112```13my-nuxt-app/14├── app/ # Application source (can be at root level)15│ ├── app.vue # Root component16│ ├── app.config.ts # App configuration (runtime)17│ ├── error.vue # Error page18│ ├── components/ # Auto-imported Vue components19│ ├── composables/ # Auto-imported composables20│ ├── layouts/ # Layout components21│ ├── middleware/ # Route middleware22│ ├── pages/ # File-based routing23│ ├── plugins/ # Vue plugins24│ └── utils/ # Auto-imported utilities25├── assets/ # Build-processed assets (CSS, images)26├── public/ # Static assets (served as-is)27├── server/ # Server-side code28│ ├── api/ # API routes (/api/*)29│ ├── routes/ # Server routes30│ ├── middleware/ # Server middleware31│ ├── plugins/ # Nitro plugins32│ └── utils/ # Server utilities (auto-imported)33├── content/ # Content files (@nuxt/content)34├── layers/ # Local layers (auto-scanned)35├── modules/ # Local modules36├── nuxt.config.ts # Nuxt configuration37├── package.json38└── tsconfig.json39```4041## Key Directories4243### `app/` Directory4445Contains all application code. Can also be at root level (without `app/` folder).4647```ts48// nuxt.config.ts - customize source directory49export default defineNuxtConfig({50srcDir: 'src/', // Change from 'app/' to 'src/'51})52```5354### `app/components/`5556Vue components auto-imported by name:5758```59components/60├── Button.vue → <Button />61├── Card.vue → <Card />62├── base/63│ └── Button.vue → <BaseButton />64├── ui/65│ ├── Input.vue → <UiInput />66│ └── Modal.vue → <UiModal />67└── TheHeader.vue → <TheHeader />68```6970**Lazy loading**: Prefix with `Lazy` for dynamic import:7172```vue73<template>74<LazyHeavyChart v-if="showChart" />75</template>76```7778**Client/Server only**:7980```81components/82├── Comments.client.vue → Only rendered on client83└── ServerData.server.vue → Only rendered on server84```8586### `app/composables/`8788Vue composables auto-imported (top-level files only):8990```91composables/92├── useAuth.ts → useAuth()93├── useFoo.ts → useFoo()94└── nested/95└── utils.ts → NOT auto-imported96```9798Re-export nested composables:99100```ts101// composables/index.ts102export { useHelper } from './nested/utils'103```104105### `app/pages/`106107File-based routing:108109```110pages/111├── index.vue → /112├── about.vue → /about113├── blog/114│ ├── index.vue → /blog115│ └── [slug].vue → /blog/:slug116├── users/117│ └── [id]/118│ └── profile.vue → /users/:id/profile119├── [...slug].vue → /* (catch-all)120├── [[optional]].vue → /:optional? (optional param)121└── (marketing)/ → Route group (not in URL)122└── pricing.vue → /pricing123```124125**Pages are optional**: Without `pages/`, no vue-router is included.126127### `app/layouts/`128129Layout components wrapping pages:130131```132layouts/133├── default.vue → Default layout134├── admin.vue → Admin layout135└── blank.vue → No layout136```137138```vue139<!-- layouts/default.vue -->140<template>141<div>142<TheHeader />143<slot />144<TheFooter />145</div>146</template>147```148149Use in pages:150151```vue152<script setup>153definePageMeta({154layout: 'admin',155// layout: false // Disable layout156})157</script>158```159160### `app/middleware/`161162Route middleware:163164```165middleware/166├── auth.ts → Named middleware167├── admin.ts → Named middleware168└── logger.global.ts → Global middleware (runs on every route)169```170171### `app/plugins/`172173Nuxt plugins (auto-registered):174175```176plugins/177├── 01.analytics.ts → Order with number prefix178├── 02.auth.ts179├── vue-query.client.ts → Client-only plugin180└── server-init.server.ts → Server-only plugin181```182183### `server/` Directory184185Nitro server code:186187```188server/189├── api/190│ ├── users.ts → GET /api/users191│ ├── users.post.ts → POST /api/users192│ └── users/[id].ts → /api/users/:id193├── routes/194│ └── sitemap.xml.ts → /sitemap.xml195├── middleware/196│ └── auth.ts → Runs on every request197├── plugins/198│ └── db.ts → Server startup plugins199└── utils/200└── db.ts → Auto-imported server utilities201```202203### `public/` Directory204205Static assets served at root URL:206207```208public/209├── favicon.ico → /favicon.ico210├── robots.txt → /robots.txt211└── images/212└── logo.png → /images/logo.png213```214215### `assets/` Directory216217Build-processed assets:218219```220assets/221├── css/222│ └── main.css223├── images/224│ └── hero.png225└── fonts/226└── custom.woff2227```228229Reference in components:230231```vue232<template>233<img src="~/assets/images/hero.png" />234</template>235236<style>237@import '~/assets/css/main.css';238</style>239```240241## Special Files242243| File | Purpose |244|------|---------|245| `app.vue` | Root component (optional with pages/) |246| `app.config.ts` | Runtime app configuration |247| `error.vue` | Custom error page |248| `nuxt.config.ts` | Build-time configuration |249| `.nuxtignore` | Ignore files from Nuxt |250| `.env` | Environment variables |251252## File Naming Conventions253254| Pattern | Meaning |255|---------|---------|256| `[param]` | Dynamic route parameter |257| `[[param]]` | Optional parameter |258| `[...slug]` | Catch-all route |259| `(group)` | Route group (not in URL) |260| `.client.vue` | Client-only component |261| `.server.vue` | Server-only component |262| `.global.ts` | Global middleware |263264<!--265Source references:266- https://nuxt.com/docs/directory-structure267- https://nuxt.com/docs/directory-structure/app268- https://nuxt.com/docs/directory-structure/server269-->270