Performance: Async components for lazy loading
This affects the initial page load speed by deferring component loading until needed, improving time to interactive.
import { defineAsyncComponent } from 'vue'; export default { components: { LargeComponent: defineAsyncComponent(() => import('./LargeComponent.vue')) } };
import LargeComponent from './LargeComponent.vue'; export default { components: { LargeComponent } };
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Eager import of large component | High upfront DOM nodes | Multiple reflows during initial load | High paint cost due to large bundle | [X] Bad |
| Async component lazy loaded | DOM nodes added on demand | Single reflow when component loads | Lower initial paint cost | [OK] Good |
defineAsyncComponent in Vue?defineAsyncComponentdefineAsyncComponent with a function returning an import promise.defineAsyncComponent(() => import('...')).const AsyncComp = defineAsyncComponent(() => new Promise(resolve => {
setTimeout(() => resolve({ template: 'Loaded!' }), 2000)
}))
export default {
components: { AsyncComp },
template: `
Loading...
`
}import { defineAsyncComponent } from 'vue'
const AsyncComp = defineAsyncComponent(() => import('./MyComp.vue'))
export default {
components: { AsyncComp },
template: ``
}<Suspense> to show fallback during loading.<Suspense> wrapper, so no loading state is handled.CompA and CompB, but only show CompB after CompA finishes loading. How can you achieve this using Vue async components and Suspense?CompB to appear only after CompA finishes loading.CompA in Suspense; in CompA's mounted hook, dynamically render CompB (async) inside its own Suspense for true sequential loading.CompB in CompA's default slot loads it immediately upon CompA resolution.CompA in a Suspense with fallback, then in CompA's mounted hook, render CompB inside another Suspense -> Option DPass the test and this pattern moves unknown