Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Nuxt 4+ development patterns: server routes, file-based routing, middleware, composables, and h3 v1 / nitropack v2.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/nuxt-config.md
1# Nuxt Configuration23## When to Use45Configuring `nuxt.config.ts`, modules, auto-imports, runtime config, layers.67## Basic Structure89```ts10// nuxt.config.ts11export default defineNuxtConfig({12devtools: { enabled: true },1314modules: [15'@nuxtjs/tailwindcss',16'@pinia/nuxt'17],1819runtimeConfig: {20// Private (server-only)21apiSecret: process.env.API_SECRET,2223public: {24// Public (client + server)25apiBase: process.env.API_BASE || 'http://localhost:3000'26}27},2829app: {30head: {31title: 'My App',32meta: [33{ charset: 'utf-8' },34{ name: 'viewport', content: 'width=device-width, initial-scale=1' }35]36}37}38})39```4041## Runtime Config4243Access runtime config in app:4445```ts46// Server-side47const config = useRuntimeConfig()48console.log(config.apiSecret) // Available4950// Client-side51const config = useRuntimeConfig()52console.log(config.public.apiBase) // Available53console.log(config.apiSecret) // undefined (private)54```5556### Runtime Config Validation (Recommended)5758Use `nuxt-safe-runtime-config` for type-safe runtime config with build-time validation:5960```bash61npx nuxi module add nuxt-safe-runtime-config62```6364**Benefits:**6566- Build-time validation (catches missing env vars early)67- Optional runtime validation (validates when server starts)68- Auto-generated types (no manual type definitions needed)69- No manual env var checks required (schema handles validation)7071**Example with Valibot:**7273```ts74import { number, object, optional, string } from 'valibot'7576export default defineNuxtConfig({77modules: ['nuxt-safe-runtime-config'],7879runtimeConfig: {80databaseUrl: process.env.DATABASE_URL,81secretKey: process.env.SECRET_KEY,82port: Number.parseInt(process.env.PORT || '3000'),83public: {84apiBase: process.env.PUBLIC_API_BASE,85appName: 'My App',86},87},8889safeRuntimeConfig: {90$schema: object({91public: object({92apiBase: string(),93appName: optional(string()),94}),95databaseUrl: string(),96secretKey: string(),97port: optional(number()),98}),99validateAtRuntime: true, // Optional: validate when server starts100},101})102```103104**Usage:**105106```ts107// Auto-typed from schema - no generics needed108const config = useSafeRuntimeConfig()109// config.public.apiBase is string110// config.databaseUrl is string111```112113**No manual env checks needed:**114115```ts116// ❌ Don't do this with nuxt-safe-runtime-config117if (!config.databaseUrl) throw new Error('Missing DATABASE_URL')118119// ✅ Schema validation handles it automatically120// If env var is missing, build fails with detailed error121```122123Works with Zod, ArkType, or any Standard Schema library. See: https://github.com/onmax/nuxt-safe-runtime-config124125## Auto-Imports126127Nuxt auto-imports from these directories:128129- `components/` - Vue components130- `composables/` - Composition functions131- `utils/` - Utility functions132- `server/utils/` - Server utilities (server-only)133134### Custom Auto-Imports135136```ts137export default defineNuxtConfig({138imports: {139dirs: [140'stores',141'types'142]143}144})145```146147### Disable Auto-Import148149```ts150export default defineNuxtConfig({151imports: {152autoImport: false153}154})155```156157## Modules158159```ts160export default defineNuxtConfig({161modules: [162'@nuxtjs/tailwindcss',163'@pinia/nuxt',164'@vueuse/nuxt',165['@nuxtjs/google-fonts', {166families: {167Inter: [400, 700]168}169}]170]171})172```173174## App Config175176For non-sensitive config exposed to client:177178```ts179// app.config.ts180export default defineAppConfig({181theme: {182primaryColor: '#3b82f6',183borderRadius: '0.5rem'184}185})186```187188Access in app:189190```ts191const appConfig = useAppConfig()192console.log(appConfig.theme.primaryColor)193```194195## TypeScript196197```ts198export default defineNuxtConfig({199typescript: {200strict: true,201typeCheck: true,202shim: false203}204})205```206207## Build Configuration208209```ts210export default defineNuxtConfig({211build: {212transpile: ['some-package']213},214215vite: {216css: {217preprocessorOptions: {218scss: {219additionalData: '@use "@/assets/styles/variables" as *;'220}221}222}223}224})225```226227## Route Rules228229Pre-render, cache, or customize routes:230231```ts232export default defineNuxtConfig({233routeRules: {234'/': { prerender: true },235'/api/**': { cors: true },236'/admin/**': { ssr: false },237'/blog/**': { swr: 3600 } // Cache for 1 hour238}239})240```241242### ISR Route Rules243244Use `isr` for incremental static regeneration:245246```ts247export default defineNuxtConfig({248routeRules: {249'/': { prerender: true }, // Static at build time250'/**': { isr: 60 }, // Regenerate every 60s251'/package/**': { isr: 60 }, // ISR for dynamic routes252'/search': { isr: false, cache: false }, // No cache253}254})255```256257### Route Rule Layouts (Nuxt 4.3+)258259Apply layouts via route rules for centralized layout management:260261```ts262export default defineNuxtConfig({263routeRules: {264'/admin/**': { appLayout: 'admin' },265'/docs/**': { appLayout: 'docs' },266'/': { appLayout: 'default' }267}268})269```270271**Benefits:** Centralized layout control, no need for `setPageLayout()` in every page.272273## Inline Modules274275Add conditional logic during nuxt prepare:276277```ts278export default defineNuxtConfig({279modules: [280// Inline function module281function (_, nuxt) {282if (nuxt.options._prepare) {283// Disable expensive operations during prepare284nuxt.options.pwa ||= {}285nuxt.options.pwa.pwaAssets ||= { disabled: true }286}287},288'@nuxtjs/tailwindcss',289]290})291```292293## Provider-Specific Modules294295Use `std-env` to detect platform and configure accordingly:296297```ts298// modules/vercel-cache.ts299import { defineNuxtModule } from 'nuxt/kit'300import { provider } from 'std-env'301302export default defineNuxtModule({303meta: { name: 'vercel-cache' },304setup(_, nuxt) {305if (provider !== 'vercel') return306307nuxt.hook('nitro:config', (nitroConfig) => {308nitroConfig.storage ||= {}309nitroConfig.storage.cache = {310driver: 'vercel-runtime-cache',311...nitroConfig.storage.cache,312}313})314}315})316```317318Then register in nuxt.config.ts:319320```ts321export default defineNuxtConfig({322modules: ['~/modules/vercel-cache']323})324```325326## Experimental Features327328```ts329export default defineNuxtConfig({330future: {331compatibilityVersion: 4332},333334experimental: {335typedPages: true,336viewTransition: true,337payloadExtraction: true // Enable ISR/SWR payload extraction (Nuxt 4.3+)338}339})340```341342**Payload extraction** (Nuxt 4.3+): Enables cached payloads during client navigation for ISR/SWR routes, improving performance.343344## Nitro Config345346Server engine configuration:347348```ts349export default defineNuxtConfig({350nitro: {351preset: 'vercel',352compressPublicAssets: true,353routeRules: {354'/api/**': { cors: true }355}356}357})358```359360## Layers361362Extend or share configuration:363364```ts365export default defineNuxtConfig({366extends: [367'./base-layer'368]369})370```371372## Environment Variables373374Use `.env` file:375376```env377API_SECRET=secret123378API_BASE=https://api.example.com379```380381Access via runtimeConfig:382383```ts384export default defineNuxtConfig({385runtimeConfig: {386apiSecret: process.env.API_SECRET,387public: {388apiBase: process.env.API_BASE389}390}391})392```393394## Best Practices395396- **Use nuxt-safe-runtime-config** for runtime config with validation397- **Public vs private** - keep secrets in private runtimeConfig398- **App config** for non-sensitive client config399- **Route rules** for performance (prerender, cache, SWR)400- **Auto-imports** for cleaner code401- **TypeScript strict mode** for better DX402403## Common Mistakes404405| ❌ Wrong | ✅ Right |406| -------------------------- | ---------------------------- |407| Hardcoded API URLs | Use runtimeConfig.public |408| Secrets in app.config | Use runtimeConfig (private) |409| Import everything manually | Let Nuxt auto-import |410| process.env in client code | Use useRuntimeConfig() |411| Manual env var validation | Use nuxt-safe-runtime-config |412| if (!config.x) throw error | Schema validation handles it |413414## Resources415416- Nuxt config: https://nuxt.com/docs/api/nuxt-config417- Runtime config: https://nuxt.com/docs/guide/going-further/runtime-config418- App config: https://nuxt.com/docs/guide/directory-structure/app-config419- Modules: https://nuxt.com/modules420