# Do Not Use defineAsyncComponent with Vue Router ## Rule Never use `defineAsyncComponent` when configuring Vue Router route components. Vue Router has its own lazy loading mechanism using dynamic imports directly. ## Why This Matters Vue Router's lazy loading is specifically designed for route-level code splitting. Using `defineAsyncComponent` for routes adds unnecessary overhead and can cause unexpected behavior with navigation guards, loading states, and route transitions. ## Bad Code ```javascript import { defineAsyncComponent } from 'vue' import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ history: createWebHistory(), routes: [ { path: '/dashboard', // WRONG: Don't use defineAsyncComponent here component: defineAsyncComponent(() => import('./views/Dashboard.vue') ) }, { path: '/profile', // WRONG: This also won't work as expected component: defineAsyncComponent({ loader: () => import('./views/Profile.vue'), loadingComponent: LoadingSpinner }) } ] }) ``` ## Good Code ```javascript import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ history: createWebHistory(), routes: [ { path: '/dashboard', // CORRECT: Use dynamic import directly component: () => import('./views/Dashboard.vue') }, { path: '/profile', // CORRECT: Simple arrow function with import component: () => import('./views/Profile.vue') } ] }) ``` ## Handling Loading States with Vue Router For route-level loading states, use Vue Router's navigation guards or a global loading indicator: ```vue ``` ## When to Use defineAsyncComponent Use `defineAsyncComponent` for: - Components loaded conditionally within a page - Heavy components that aren't always needed - Modal dialogs or panels that load on demand Use Vue Router's lazy loading for: - Route-level components (views/pages) - Any component configured in route definitions ## Key Points 1. Vue Router and `defineAsyncComponent` are separate lazy loading mechanisms 2. Route components should use direct dynamic imports: `() => import('./View.vue')` 3. Use navigation guards for route-level loading indicators 4. `defineAsyncComponent` is for component-level lazy loading within pages ## References - [Vue Router Lazy Loading Routes](https://router.vuejs.org/guide/advanced/lazy-loading.html) - [Vue.js Async Components Documentation](https://vuejs.org/guide/components/async)