Treeshaking — это процесс удаления неиспользуемого кода из финального бандла, что позволяет существенно уменьшить размер сборки и ускорить загрузку приложения. В контексте Vuetify, особенно начиная с версии 3, treeshaking играет критически важную роль, так как библиотека включает большое количество компонентов, утилит и стилей, которые по умолчанию могут попасть в сборку, даже если они не используются.
В основе treeshaking лежат ES-модули (ESM). Для корректной работы необходимо, чтобы сборщик (Webpack, Vite, Rollup) мог анализировать импорты и исключать те части кода, которые не вызываются в приложении.
Ключевой момент treeshaking в Vuetify — импорт только нужных компонентов, а не всей библиотеки. Например:
// Плохо для treeshaking — подключает все компоненты
import Vuetify from 'vuetify';
// Хорошо — подключение только нужных компонентов
import { VApp, VBtn, VCard } from 'vuetify/components';
import { createVuetify } from 'vuetify';
Использование полного импорта приводит к тому, что весь набор компонентов попадает в финальный бандл, даже если используются только кнопки и карточки.
Vuetify предоставляет ряд утилит (useDisplay,
useTheme, useLocale) и директив
(v-ripple, v-scroll). Для treeshaking
необходимо импортировать их отдельно:
import { useDisplay } from 'vuetify';
import { Ripple } from 'vuetify/directives';
Директивы можно подключать при инициализации Vuetify:
const vuetify = createVuetify({
directives: {
Ripple,
},
});
Для Webpack важно использовать ESM-бандлы Vuetify. В
webpack.config.js необходимо убедиться, что:
resolve: {
alias: {
'vuetify/lib': 'vuetify/es',
},
},
Использование vuetify/es вместо vuetify/lib
позволяет сборщику анализировать импорты и исключать неиспользуемые
модули. Также стоит включить sideEffects: false в
package.json, чтобы указать, что большинство файлов
библиотеки безопасны для treeshaking:
{
"sideEffects": false
}
Vite автоматически работает с ESM, поэтому в большинстве случаев достаточно:
import { createVuetify } from 'vuetify';
import * as components from 'vuetify/components';
import * as directives from 'vuetify/directives';
export default createVuetify({
components,
directives,
});
Важно проверять, что в vite.config.js установлен плагин
Vue 3 и включен optimizeDeps:
optimizeDeps: {
include: ['vuetify/components', 'vuetify/directives']
}
Vuetify использует Sass-переменные и темы, и по умолчанию весь CSS может попасть в бандл. Для минимизации размера подключаются только нужные стили:
// main.scss
@use 'vuetify/styles' with (
$body-font-family: 'Roboto, sans-serif',
$theme: light
);
При этом vuetify/styles предоставляет доступ к функциям
и миксинам без включения всех стилей компонентов. В компонентах
подключение CSS через import 'vuetify/styles' должно быть
централизованным, чтобы сборщик мог исключить лишние правила.
Vuetify тесно интегрируется с Composition API. Для эффективного
treeshaking стоит использовать defineComponent и явные
импорты:
import { defineComponent } from 'vue';
import { VBtn } from 'vuetify/components';
export default defineComponent({
components: { VBtn },
setup() {
// Логика компонента
},
});
Это гарантирует, что сборщик видит прямое использование компонента и исключает всё остальное.
Использование этих инструментов позволяет подтвердить, что конфигурация корректна и сборка минимальна.
@use 'vuetify/styles'.Эти принципы позволяют создавать оптимизированные и быстрые приложения, используя полный потенциал Vuetify без перегрузки бандла.