Фабрика асинхронных компонентов — это функция, которая возвращает конфигурационный объект для динамической загрузки компонента. Рассмотрим детальную структуру этой фабрики.
const AsyncComponent = () => ({
// Обязательные свойства
component: Promise<Component>,
// Опциональные свойства
loading?: Component,
error?: Component,
delay?: number,
timeout?: number
})
component: import('./MyComponent.vue')
// или
component: new Promise((resolve) => {
setTimeout(() => {
resolve(import('./MyComponent.vue'))
}, 1000)
})
loading: {
template: '<div>Loading...</div>'
}
// или
loading: LoadingSpinner
delay
error: {
template: '<div>Failed to load component</div>'
}
// или
error: ErrorComponent
delay: 200 // миллисекунды
timeout: 3000 // миллисекунды
const AsyncModal = () => ({
component: import('./ComplexModal.vue')
.then(comp => {
// Можно модифицировать компонент перед разрешением
comp.default.beforeMount = () => console.log('Loading modal')
return comp
})
.catch(err => {
console.error('Modal load failed', err)
throw err
}),
loading: {
template: '<div class="loading-spinner"></div>',
mounted() {
console.log('Loading started')
}
},
error: {
template: `
<div class="error">
<p>Failed to load modal</p>
<button @click="retry">Retry</button>
</div>
`,
methods: {
retry() {
this.$emit('retry')
}
}
},
delay: 150,
timeout: 5000
})
Контекст выполнения:
this
родителя (если не стрелочная функция)Повторные попытки:
retry
в error-компонентеWebpack-специфичные возможности:
component: import(
/* webpackChunkName: "modal" */
/* webpackPrefetch: true */
'./ComplexModal.vue'
)
let cachedPromise
const AsyncCachedComponent = () => ({
component: cachedPromise || (cachedPromise = import('./HeavyComponent.vue')),
loading: LoadingComponent
})
const DynamicLoader = (featureFlag) => ({
component: featureFlag
? import('./NewComponent.vue')
: import('./OldComponent.vue')
})
const ComponentWithDeps = () => ({
component: Promise.all([
import('./MainComponent.vue'),
import('./utils.js')
]).then(([component, utils]) => {
component.default.methods = {
...component.default.methods,
...utils
}
return component
})
})
Фабрика асинхронных компонентов в Vue — это гибкий механизм, позволяющий тонко контролировать процесс загрузки компонентов. Ее структура включает обязательное свойство component
и ряд опциональных свойств для управления состояниями загрузки и ошибки. Правильное использование фабрик позволяет значительно улучшить производительность и UX крупных приложений.