Vue Router предоставляет гибкие инструменты для управления загрузкой компонентов и маршрутов, что критически важно для оптимизации производительности приложений. Основные подходы к загрузке маршрутов можно разделить на синхронную загрузку, асинхронную (ленивую) загрузку и использование динамических импортов с разделением кода (code-splitting).
Синхронная загрузка является классическим способом, когда все компоненты импортируются при инициализации приложения:
import Home from './components/Home.vue';
import About from './components/About.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
];
const router = VueRouter.createRouter({
history: VueRouter.createWebHistory(),
routes
});
Особенности:
Синхронная загрузка подходит для небольших проектов или компонентов, которые используются на каждой странице.
Асинхронная загрузка позволяет загружать компоненты только при переходе на соответствующий маршрут, что уменьшает размер начального бандла.
const Home = () => import('./components/Home.vue');
const About = () => import('./components/About.vue');
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
];
Преимущества ленивой загрузки:
Важные моменты:
import(),
который возвращает промис.const About = () => import(/* webpackChunkName: "about" */ './components/About.vue');
Vue Router поддерживает динамические маршруты, которые в сочетании с ленивой загрузкой позволяют создавать масштабируемые приложения с большим количеством страниц.
const UserProfile = () => import('./components/UserProfile.vue');
const routes = [
{ path: '/user/:id', component: UserProfile, props: true }
];
Особенности использования:
:id) передаются в компонент через
props./user/123.Для улучшения пользовательского опыта можно комбинировать ленивую загрузку с предзагрузкой или отложенной загрузкой:
Пример с использованием Webpack:
const Dashboard = () =>
import(
/* webpackChunkName: "dashboard" */
/* webpackPrefetch: true */
'./components/Dashboard.vue'
);
Эффект:
dashboard не включается в основной бандл.Vue Router совместим с современными методами code-splitting, позволяющими:
chunk per route).Пример вложенного маршрута с ленивой загрузкой:
const AdminLayout = () => import('./layouts/AdminLayout.vue');
const Users = () => import('./components/admin/Users.vue');
const Settings = () => import('./components/admin/Settings.vue');
const routes = [
{
path: '/admin',
component: AdminLayout,
children: [
{ path: 'users', component: Users },
{ path: 'settings', component: Settings }
]
}
];
Преимущества:
Иногда компоненты требуют больших ресурсов (например, редакторы, визуализация графиков). Для них можно использовать стратегию ленивой загрузки с индикатором загрузки:
import { defineAsyncComponent } from 'vue';
const RichEditor = defineAsyncComponent({
loader: () => import('./components/RichEditor.vue'),
loadingComponent: () => import('./components/Spinner.vue'),
delay: 200
});
const routes = [
{ path: '/editor', component: RichEditor }
];
Особенности:
loadingComponent показывает пользователю индикатор
загрузки.delay задаёт время перед отображением индикатора, чтобы
избежать мигания при быстрой загрузке.Эти стратегии загрузки помогают оптимизировать Vue-приложения, снижая время старта и поддерживая плавную навигацию между страницами даже при увеличении размера проекта.