What Causes This Warning?
This warning appears when Nuxt is configured to scan a components directory that doesn’t exist. By default, Nuxt looks for a components/ folder in your project root.
The Problem
[warn] Components directory not found: `/path/to/project/components`
This happens when:
- The
components/directory doesn’t exist - A custom components path is configured but points to a non-existent folder
- The path has a typo or wrong casing
The Fix
Fix 1: Create the Components Directory
# Create the default components directory
mkdir components
# Add a placeholder or your first component
touch components/.gitkeep
Fix 2: Disable Components Scanning
If you don’t need auto-imported components:
// nuxt.config.ts
export default defineNuxtConfig({
components: false
})
Or disable only for specific directories:
// nuxt.config.ts
export default defineNuxtConfig({
components: {
dirs: [] // Empty array disables default scanning
}
})
Fix 3: Configure Correct Path
If your components are in a different location:
// nuxt.config.ts
export default defineNuxtConfig({
components: {
dirs: [
'~/src/components', // Custom path
'~/ui/components', // Another custom path
]
}
})
Fix 4: Fix Path Typo
Check for common typos:
// nuxt.config.ts
// ❌ Wrong - typos
components: {
dirs: [
'~/componets', // Missing 'n'
'~/Components', // Case sensitivity on Linux
'./components', // Should use ~/
]
}
// ✅ Correct
components: {
dirs: [
'~/components'
]
}
Project Structure Examples
Default Structure
my-nuxt-app/
├── components/ ← Required by default
│ ├── Header.vue
│ └── Footer.vue
├── pages/
├── nuxt.config.ts
└── package.json
Custom Structure
my-nuxt-app/
├── src/
│ └── components/ ← Custom location
│ ├── Header.vue
│ └── Footer.vue
├── pages/
├── nuxt.config.ts
└── package.json
Configure in nuxt.config.ts:
export default defineNuxtConfig({
components: {
dirs: ['~/src/components']
}
})
Multiple Component Directories
You can scan multiple directories:
// nuxt.config.ts
export default defineNuxtConfig({
components: {
dirs: [
{ path: '~/components/global', global: true },
{ path: '~/components/ui', prefix: 'UI' },
{ path: '~/components/forms', prefix: 'Form' },
]
}
})
Usage:
<template>
<!-- From ~/components/global - globally available -->
<Header />
<!-- From ~/components/ui - prefixed -->
<UIButton />
<!-- From ~/components/forms - prefixed -->
<FormInput />
</template>
Layer Components
If using Nuxt layers:
// nuxt.config.ts
export default defineNuxtConfig({
extends: ['./base-layer'],
components: {
dirs: [
'~/components',
// Layer components are auto-included
]
}
})
Make sure the layer has its components directory:
base-layer/
├── components/ ← Must exist in layer
│ └── BaseButton.vue
└── nuxt.config.ts
Conditional Components Directory
Check if directory exists before adding:
// nuxt.config.ts
import { existsSync } from 'fs'
import { resolve } from 'path'
const customComponentsPath = resolve(__dirname, 'src/components')
export default defineNuxtConfig({
components: {
dirs: [
'~/components',
...(existsSync(customComponentsPath) ? ['~/src/components'] : [])
]
}
})
Lazy Loading Components
Configure lazy loading for specific directories:
// nuxt.config.ts
export default defineNuxtConfig({
components: {
dirs: [
{ path: '~/components', pathPrefix: false },
{ path: '~/components/heavy', prefix: 'Lazy', lazy: true }
]
}
})
Debugging
Check what components Nuxt finds:
// nuxt.config.ts
export default defineNuxtConfig({
hooks: {
'components:dirs'(dirs) {
console.log('Component directories:', dirs)
},
'components:extend'(components) {
console.log('Found components:', components.map(c => c.pascalName))
}
}
})
Module Components
If a module provides components:
// modules/my-module/index.ts
import { defineNuxtModule, createResolver, addComponentsDir } from '@nuxt/kit'
export default defineNuxtModule({
setup(options, nuxt) {
const { resolve } = createResolver(import.meta.url)
addComponentsDir({
path: resolve('./runtime/components'),
prefix: 'My'
})
}
})
Quick Checklist
-
components/directory exists in project root - Path in config matches actual directory location
- Check case sensitivity (Linux is case-sensitive)
- Use
~/prefix for project-relative paths - If not using components, set
components: false - Layer directories exist if using extends
- Run
npx nuxi prepareafter config changes