---
name: composables-auto-imports
description: Auto-imported Vue APIs, Nuxt composables, and custom utilities
---
# Composables Auto-imports
Nuxt automatically imports Vue APIs, Nuxt composables, and your custom composables/utilities.
## Built-in Auto-imports
### Vue APIs
```vue
```
### Nuxt Composables
```vue
```
## Custom Composables (`app/composables/`)
### Creating Composables
```ts
// composables/useCounter.ts
export function useCounter(initial = 0) {
const count = ref(initial)
const increment = () => count.value++
const decrement = () => count.value--
return { count, increment, decrement }
}
```
```ts
// composables/useAuth.ts
export function useAuth() {
const user = useState('user', () => null)
const isLoggedIn = computed(() => !!user.value)
async function login(credentials: Credentials) {
user.value = await $fetch('/api/auth/login', {
method: 'POST',
body: credentials,
})
}
async function logout() {
await $fetch('/api/auth/logout', { method: 'POST' })
user.value = null
}
return { user, isLoggedIn, login, logout }
}
```
### Using Composables
```vue
```
### File Scanning Rules
Only top-level files are scanned:
```
composables/
├── useAuth.ts → useAuth() ✓
├── useCounter.ts → useCounter() ✓
├── index.ts → exports ✓
└── nested/
└── helper.ts → NOT auto-imported ✗
```
Re-export nested composables:
```ts
// composables/index.ts
export { useHelper } from './nested/helper'
```
Or configure scanning:
```ts
// nuxt.config.ts
export default defineNuxtConfig({
imports: {
dirs: [
'composables',
'composables/**', // Scan all nested
],
},
})
```
## Utilities (`app/utils/`)
```ts
// utils/format.ts
export function formatDate(date: Date) {
return date.toLocaleDateString()
}
export function formatCurrency(amount: number) {
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
}).format(amount)
}
```
```vue
```
## Server Utils (`server/utils/`)
```ts
// server/utils/db.ts
export function useDb() {
return createDbConnection()
}
// server/utils/auth.ts
export function verifyToken(token: string) {
return jwt.verify(token, process.env.JWT_SECRET)
}
```
```ts
// server/api/users.ts
export default defineEventHandler(() => {
const db = useDb() // Auto-imported
return db.query('SELECT * FROM users')
})
```
## Third-party Package Imports
```ts
// nuxt.config.ts
export default defineNuxtConfig({
imports: {
presets: [
{
from: 'vue-i18n',
imports: ['useI18n'],
},
{
from: 'date-fns',
imports: ['format', 'parseISO', 'differenceInDays'],
},
{
from: '@vueuse/core',
imports: ['useMouse', 'useWindowSize'],
},
],
},
})
```
## Explicit Imports
Use `#imports` alias when needed:
```vue
```
## Composable Context Rules
Nuxt composables must be called in valid context:
```ts
// ❌ Wrong - module level
const config = useRuntimeConfig()
export function useMyComposable() {}
```
```ts
// ✅ Correct - inside function
export function useMyComposable() {
const config = useRuntimeConfig()
return { apiBase: config.public.apiBase }
}
```
**Valid contexts:**
- `