Асинхронные компоненты — это мощный механизм Vue.js для отложенной (ленивой) загрузки компонентов, который значительно улучшает производительность приложений, особенно крупных.
Асинхронный компонент — это компонент, который:
// Ранние версии Vue 2
Vue.component('async-component', function(resolve, reject) {
setTimeout(() => {
resolve({
template: '<div>Я асинхронный!</div>'
})
}, 1000)
})
// Современный синтаксис (Vue 2/3)
const AsyncComponent = () => ({
component: import('./MyComponent.vue'),
loading: LoadingComponent,
error: ErrorComponent,
delay: 200,
timeout: 3000
})
components: {
'async-component': () => import('./AsyncComponent.vue')
}
const AsyncComponent = () => ({
component: import('./AdminPanel.vue'),
loading: {
template: '<div>Загрузка...</div>'
},
error: {
template: '<div>Ошибка загрузки</div>'
},
delay: 200, // Задержка перед показом loading
timeout: 3000 // Таймаут для ошибки
})
const router = new VueRouter({
routes: [
{
path: '/admin',
component: () => import('./views/Admin.vue')
}
]
})
Уменьшение начального размера bundle:
Улучшение производительности:
Оптимизация пользовательского опыта:
components: {
AdminPanel: () => import(/* webpackChunkName: "admin" */ './AdminPanel.vue')
}
() => import(/* webpackPrefetch: false */ './Component.vue')
ssr: false
для исключения компонента из SSRconst UserComponents = () => import('./UserComponents.js')
components: {
AdminPanel: () => user.isAdmin ? import('./AdminPanel.vue') : import('./UserPanel.vue')
}
const retry = (fn, retriesLeft = 3, interval = 1000) => {
return new Promise((resolve, reject) => {
fn()
.then(resolve)
.catch(() => {
setTimeout(() => {
if (retriesLeft === 1) {
reject()
return
}
retry(fn, retriesLeft - 1, interval).then(resolve, reject)
}, interval)
})
})
}
components: {
HeavyComponent: () => retry(() => import('./HeavyComponent.vue'))
}
Асинхронные компоненты — это ключевая функция Vue.js для оптимизации производительности, позволяющая разбивать приложение на меньшие части и загружать их только когда они действительно нужны. Они особенно полезны для крупных приложений, административных панелей и компонентов, которые могут не понадобиться большинству пользователей.