---
name: components-auto-imports
description: Auto-imported components, lazy loading, and hydration strategies
---
# Components Auto-imports
Nuxt automatically imports Vue components from `app/components/` directory.
## Basic Auto-imports
```
components/
├── Button.vue →
├── Card.vue →
└── AppHeader.vue →
```
```vue
```
## Naming Conventions
### Nested Directory Names
Component names include directory path:
```
components/
├── base/
│ └── Button.vue →
├── form/
│ ├── Input.vue →
│ └── Select.vue →
└── ui/
└── modal/
└── Dialog.vue →
```
### Disable Path Prefix
```ts
// nuxt.config.ts
export default defineNuxtConfig({
components: [
{
path: '~/components',
pathPrefix: false, // Use filename only
},
],
})
```
With `pathPrefix: false`:
```
components/base/Button.vue →
```
## Lazy Loading
Prefix with `Lazy` for dynamic imports:
```vue
```
Benefits:
- Reduces initial bundle size
- Code-splits component into separate chunk
- Loads on-demand
## Lazy Hydration Strategies
Control when lazy components become interactive:
### `hydrate-on-visible`
Hydrate when component enters viewport:
```vue
```
### `hydrate-on-idle`
Hydrate when browser is idle:
```vue
```
### `hydrate-on-interaction`
Hydrate on user interaction:
```vue
```
### `hydrate-on-media-query`
Hydrate when media query matches:
```vue
```
### `hydrate-after`
Hydrate after delay (milliseconds):
```vue
```
### `hydrate-when`
Hydrate on condition:
```vue
```
### `hydrate-never`
Never hydrate (static only):
```vue
```
### Hydration Event
```vue
```
## Client/Server Components
### Client-only (`.client.vue`)
```
components/
└── BrowserChart.client.vue
```
```vue
```
### Server-only (`.server.vue`)
```
components/
└── ServerMarkdown.server.vue
```
```vue
```
Requires experimental flag:
```ts
// nuxt.config.ts
export default defineNuxtConfig({
experimental: {
componentIslands: true,
},
})
```
### Paired Components
```
components/
├── Comments.client.vue # Browser version
└── Comments.server.vue # SSR version
```
Server version renders during SSR, client version takes over after hydration.
## Dynamic Components
```vue
```
## Direct Imports
Bypass auto-imports when needed:
```vue
```
## Custom Directories
```ts
// nuxt.config.ts
export default defineNuxtConfig({
components: [
{ path: '~/components/ui', prefix: 'Ui' },
{ path: '~/components/forms', prefix: 'Form' },
'~/components', // Default, should come last
],
})
```
## Global Components
Register globally (creates async chunks):
```ts
// nuxt.config.ts
export default defineNuxtConfig({
components: {
global: true,
dirs: ['~/components'],
},
})
```
Or use `.global.vue` suffix:
```
components/
└── Icon.global.vue → Available globally
```
## Disabling Component Auto-imports
```ts
// nuxt.config.ts
export default defineNuxtConfig({
components: {
dirs: [], // Disable auto-imports
},
})
```
## Library Authors
Register components from npm package:
```ts
// my-ui-lib/nuxt.ts
import { addComponentsDir, createResolver, defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup() {
const resolver = createResolver(import.meta.url)
addComponentsDir({
path: resolver.resolve('./components'),
prefix: 'MyUi',
})
},
})
```