Lazy loading — это метод оптимизации загрузки веб-приложений, при котором компоненты подгружаются только тогда, когда они действительно нужны. В контексте Naive UI это позволяет значительно уменьшить первоначальный размер бандла, ускорить рендеринг страницы и снизить нагрузку на клиентские устройства.
Naive UI предоставляет модульные компоненты, которые можно подгружать
динамически с использованием стандартного синтаксиса
import(). Например, если необходимо подгрузить
NButton только при необходимости:
import { defineAsyncComponent } from 'vue'
const AsyncButton = defineAsyncComponent(() => import('naive-ui').then(module => module.NButton))
В данном случае компонент NButton не
будет включен в основной бандл. Он подгружается только в момент первого
рендеринга AsyncButton.
Suspense для обработки загрузкиДля корректной работы lazy loaded компонентов важно оборачивать их в
Suspense, чтобы обработать состояния загрузки и ошибки:
<template>
<Suspense>
<template #default>
<AsyncButton @click="handleClick">Кликни меня</AsyncButton>
</template>
<template #fallback>
<div>Загрузка кнопки...</div>
</template>
</Suspense>
</template>
<script setup>
import { defineAsyncComponent } from 'vue'
const AsyncButton = defineAsyncComponent(() => import('naive-ui').then(module => module.NButton))
function handleClick() {
console.log('Кнопка нажата')
}
</script>
Здесь #fallback отображается до тех пор, пока компонент
не будет полностью загружен.
Naive UI содержит множество компонентов, включая NInput, NCard, NModal и другие. Lazy loading особенно полезен для крупных компонентов, например, модальных окон или таблиц с большим количеством функционала:
const AsyncModal = defineAsyncComponent(() => import('naive-ui').then(m => m.NModal))
При таком подходе основной бандл остаётся легким, а ресурсы загружаются только при открытии модального окна.
defineAsyncComponentФункция defineAsyncComponent поддерживает дополнительные
опции:
loadingComponent.Пример с настройками:
import { NSpin } from 'naive-ui'
const AsyncTable = defineAsyncComponent({
loader: () => import('naive-ui').then(m => m.NDataTable),
loadingComponent: NSpin,
errorComponent: {
template: '<div>Ошибка загрузки таблицы</div>'
},
delay: 200,
timeout: 5000
})
В этом примере показывается индикатор загрузки NSpin
после 200 мс, а при превышении 5 секунд выводится сообщение об
ошибке.
При использовании Vue Router lazy loading можно комбинировать с компонентами Naive UI для динамической подгрузки страниц:
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
{
path: '/dashboard',
component: () => import('../views/Dashboard.vue') // Здесь можно использовать Async компоненты Naive UI внутри Dashboard.vue
}
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
Такой подход снижает начальный размер бандла и ускоряет загрузку критического контента.
loadingComponent или #fallback.delay) помогает избежать кратковременных вспышек
индикаторов при быстрой загрузке.Lazy loading компонентов Naive UI позволяет:
Этот подход является стандартной практикой для крупных приложений на Vue 3 с Naive UI, особенно при работе с модальными окнами, таблицами данных и сложными формами.