Code splitting — это метод оптимизации загрузки веб-приложений, позволяющий делить код на отдельные части (чанки), которые загружаются по мере необходимости. В Vue.js данный подход особенно эффективен для крупных приложений с множеством компонентов и маршрутов. Основная цель — уменьшить время первоначальной загрузки и повысить отзывчивость интерфейса.
Наиболее распространённая стратегия в Vue.js — route-based code splitting. Она основана на динамическом импорте компонентов, подключаемых к маршрутам.
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
{
path: '/home',
name: 'Home',
component: () => import('@/views/Home.vue') // динамический импорт
},
{
path: '/about',
name: 'About',
component: () => import('@/views/About.vue')
}
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
Ключевые моменты:
Для крупных компонентов внутри маршрута применяют component-level splitting. Если компонент содержит тяжёлые подкомпоненты или сторонние библиотеки, их можно загружать динамически:
export default {
components: {
HeavyComponent: () => import('@/components/HeavyComponent.vue')
}
}
Webpack поддерживает magic comments, которые позволяют объединять несколько динамических импортов в один чанк:
const routes = [
{
path: '/dashboard',
component: () => import(/* webpackChunkName: "dashboard" */ '@/views/Dashboard.vue')
},
{
path: '/analytics',
component: () => import(/* webpackChunkName: "dashboard" */ '@/views/Analytics.vue')
}
]
Особенности:
webpackChunkName будут
объединены в один файл.Code splitting можно расширить на ресурсы и ассеты, подключаемые по требованию:
<template>
<img v-if="imageVisible" :src="imageSrc" />
</template>
<script>
export default {
data() {
return {
imageVisible: false,
imageSrc: null
}
},
methods: {
loadImage() {
import('@/assets/large-image.jpg').then(module => {
this.imageSrc = module.default
this.imageVisible = true
})
}
}
}
</script>
Webpack поддерживает специальные директивы для оптимизации загрузки чанков:
component: () => import(
/* webpackPrefetch: true */
/* webpackPreload: true */
'@/views/LazyPage.vue'
)
В крупных проектах целесообразно выделять vendor chunks — сторонние библиотеки:
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all'
}
}
}
}
Эффективная комбинация этих стратегий позволяет достичь баланса между скоростью начальной загрузки и отзывчивостью приложения, обеспечивая плавный опыт для пользователей даже на сложных Vue-приложениях.