В современных веб-приложениях размер бандла напрямую влияет на скорость загрузки страницы и пользовательский опыт. Code splitting и lazy loading — ключевые техники оптимизации, которые позволяют загружать только необходимый код в момент его использования, снижая первоначальный вес приложения и ускоряя интерактивность.
Code splitting — это процесс разделения кода на отдельные чанки, которые могут загружаться асинхронно. В контексте Quasar и Vue.js это чаще всего достигается через динамический импорт компонентов и маршрутов.
const MyComponent = () => import('components/MyComponent.vue');
Такой компонент будет загружен только тогда, когда он действительно нужен в приложении, например при отображении определённого маршрута или условия рендеринга.
const routes = [
{
path: '/dashboard',
component: () => import('pages/Dashboard.vue')
},
{
path: '/settings',
component: () => import('pages/Settings.vue')
}
];
Каждая страница становится отдельным чанком, загружаемым по мере необходимости. Это снижает размер основного бандла и ускоряет первый рендер.
Lazy loading — подход к асинхронной подгрузке ресурсов, который тесно связан с code splitting. В Quasar lazy loading применяется для компонентов, страниц, изображений и даже библиотек.
В Quasar компоненты могут подгружаться динамически:
<template>
<q-btn @click="showModal = true">Открыть модальное окно</q-btn>
<q-dialog v-model="showModal">
<LazyModal />
</q-dialog>
</template>
<script>
export default {
components: {
LazyModal: () => import('components/Modal.vue')
},
data() {
return {
showModal: false
}
}
}
</script>
Компонент Modal.vue будет загружен только при первом
открытии модального окна, а не при начальной загрузке страницы.
Quasar предлагает встроенный компонент QImg, который
поддерживает ленивую загрузку:
<q-img src="large-image.jpg" lazy-src="placeholder.jpg" />
lazy-src — маленькое изображение-заглушка, отображается
до полной загрузки основного изображения.Применение динамического импорта к маршрутам позволяет не только экономить время загрузки, но и уменьшает расход памяти. В Quasar это делается через Vue Router:
const routes = [
{
path: '/profile',
component: () => import('pages/Profile.vue'),
children: [
{ path: 'edit', component: () => import('pages/ProfileEdit.vue') }
]
}
];
Каждый маршрут и подмаршрут формирует отдельный бандл. Браузер загружает код только при переходе на конкретный путь.
Совмещение с Webpack: Quasar CLI использует Webpack
под капотом, и динамический импорт автоматически создает отдельные
чанки. Можно дополнительно настраивать webpackChunkName для
удобного именования:
const Dashboard = () => import(/* webpackChunkName: "dashboard" */ 'pages/Dashboard.vue');
Это облегчает анализ бандлов и кеширование браузером.
Иногда сторонние библиотеки требуются не сразу, а только для отдельных функций:
async function loadChart() {
const { Chart } = await import('chart.js');
const ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, { type: 'bar', data: {...} });
}
Такой подход уменьшает размер основного бандла и ускоряет старт приложения.
Quasar предоставляет несколько возможностей для анализа:
quasar dev -m spa с включением анализа бандла.Code splitting и lazy loading в Quasar позволяют создавать быстрые, отзывчивые приложения, уменьшать вес начальной загрузки и оптимизировать работу с ресурсами без изменения архитектуры SPA. Эти техники эффективно сочетаются с динамическими компонентами, маршрутами и ресурсами, обеспечивая современный подход к разработке фронтенда.