--- 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:** - `