Переход от Vuetify 2 к Vuetify 3 представляет собой не просто обновление компонентов, а фундаментальную переработку архитектуры библиотеки. Основой новой версии стал Vue 3, что привело к внедрению современных возможностей фреймворка:
Vuetify 3 построен с расчётом на модульность и гибкость, поэтому многие механизмы, ранее встроенные в ядро, теперь подключаются отдельно.
Ключевые изменения:
| Область | Vuetify 2 | Vuetify 3 |
|---|---|---|
| Базовый фреймворк | Vue 2 | Vue 3 |
| API компонентов | Options API | Composition API + Options API |
| Система тем | Sass переменные | CSS Variables |
| Система сетки | flex-based grid | переработанная grid-система |
| Установка | глобальная регистрация | createVuetify() |
| Tree-shaking | ограниченный | полноценный |
Эти изменения требуют адаптации существующего кода при миграции.
Перед миграцией необходимо обновить основные зависимости проекта.
Удаляются старые версии:
npm remove vuetify
Устанавливаются новые пакеты:
npm install vuetify@latest
npm install vue@latest
npm install vite-plugin-vuetify
Vuetify 3 изначально оптимизирован под Vite, поэтому многие проекты переходят с Webpack на Vite для упрощения конфигурации.
В Vuetify 2 библиотека подключалась напрямую к экземпляру Vue:
import Vue from 'vue'
import Vuetify from 'vuetify'
Vue.use(Vuetify)
export default new Vuetify({})
В Vuetify 3 используется фабричная функция
createVuetify.
import { createApp } from 'vue'
import { createVuetify } from 'vuetify'
import App from './App.vue'
const vuetify = createVuetify()
const app = createApp(App)
app.use(vuetify)
app.mount('#app')
Такой подход соответствует архитектуре Vue 3 и позволяет более гибко управлять плагинами.
Vuetify 2 автоматически регистрировал большинство компонентов.
Vuetify 3 предполагает явную регистрацию для уменьшения размера сборки.
import { createVuetify } from 'vuetify'
import { VBtn, VCard } from 'vuetify/components'
import { Ripple } from 'vuetify/directives'
export const vuetify = createVuetify({
components: {
VBtn,
VCard
},
directives: {
Ripple
}
})
Такой подход позволяет сборщику удалять неиспользуемые компоненты.
Vuetify 3 активно использует Composition API. Это влияет на работу с сервисами и утилитами библиотеки.
Пример использования темы:
Vuetify 2:
this.$vuetify.theme.dark = true
Vuetify 3:
import { useTheme } from 'vuetify'
const theme = useTheme()
theme.global.name.value = 'dark'
Сервисы теперь доступны через composable-функции.
Vuetify 2 использовал сетку на основе flexbox:
<v-container>
<v-row>
<v-col cols="6">
Content
</v-col>
</v-row>
</v-container>
В Vuetify 3 структура осталась похожей, но API компонентов обновлено и оптимизировано.
<v-container>
<v-row>
<v-col cols="6">
Content
</v-col>
</v-row>
</v-container>
Главные отличия:
Vuetify 2 использовал Sass-переменные для настройки темы.
Vuetify 3 перешёл на CSS variables, что позволяет изменять тему во время выполнения.
Конфигурация темы:
const vuetify = createVuetify({
theme: {
defaultTheme: 'light',
themes: {
light: {
colors: {
primary: '#1976D2',
secondary: '#424242'
}
}
}
}
})
Преимущества:
Некоторые компоненты были:
Примеры изменений:
| Vuetify 2 | Vuetify 3 |
|---|---|
| v-list-item-content | удалён |
| v-simple-table | заменён на v-table |
| v-app-bar-nav-icon | обновлён API |
| v-chip-group | изменён механизм выбора |
В Vue 3 изменился механизм v-model. Vuetify 3 использует
новый синтаксис.
Vuetify 2:
<v-text-field v-model="name"></v-text-field>
Vuetify 3:
<v-text-field
v-model="name"
/>
В большинстве случаев код остаётся прежним, но внутри компонентов используется новый контракт:
modelValueupdate:modelValueПример кастомного компонента:
defineProps({
modelValue: String
})
defineEmits(['update:modelValue'])
Часть компонентов была полностью исключена.
Наиболее заметные изменения:
| Компонент | Статус |
|---|---|
| v-data-iterator | переработан |
| v-calendar | временно отсутствует |
| v-treeview | переписан |
| v-virtual-scroll | новый API |
Некоторые функции были перенесены в сторонние библиотеки.
Vuetify 3 использует новую систему конфигурации иконок.
import { aliases, mdi } from 'vuetify/iconsets/mdi'
createVuetify({
icons: {
defaultSet: 'mdi',
aliases,
sets: {
mdi
}
}
})
В версии 2 иконки часто подключались через CDN или Sass.
Система display и breakpoint изменилась.
Vuetify 2:
this.$vuetify.breakpoint.mdAndUp
Vuetify 3:
import { useDisplay } from 'vuetify'
const display = useDisplay()
display.mdAndUp.value
Новая система полностью построена на Composition API.
Некоторые директивы получили новые API.
Vuetify 2:
<div v-ripple></div>
Vuetify 3 требует регистрации директивы:
import { Ripple } from 'vuetify/directives'
createVuetify({
directives: {
Ripple
}
})
Vuetify 3 уменьшает зависимость от Sass и активно использует CSS variables.
Подключение стилей:
import 'vuetify/styles'
При необходимости можно использовать Sass для дополнительной кастомизации.
В Vuetify 2 layout строился вокруг v-app.
<v-app>
<v-app-bar></v-app-bar>
<v-main></v-main>
</v-app>
В Vuetify 3 структура стала более предсказуемой:
<v-app>
<v-layout>
<v-app-bar></v-app-bar>
<v-main></v-main>
</v-layout>
</v-app>
Компонент v-layout теперь играет центральную роль в
построении интерфейса.
Процесс миграции обычно включает несколько этапов:
1. Обновление Vue до версии 3
Проверяется совместимость зависимостей проекта.
2. Установка Vuetify 3
Удаляется старая версия и добавляется новая.
3. Переписывание инициализации
Переход на createVuetify().
4. Исправление компонентов
Замена устаревших компонентов.
5. Обновление темизации
Переход с Sass на CSS variables.
6. Проверка реактивности
Использование Composition API для сервисов.
Несовместимость сторонних библиотек
Некоторые плагины поддерживают только Vuetify 2.
Изменение API компонентов
Часто требуется переписать props и события.
Проблемы со стилями
Sass-переменные больше не работают так же, как раньше.
Удалённые компоненты
Иногда приходится реализовывать альтернативы.
В крупных проектах используется постепенный переход:
Такой подход уменьшает риск регрессий и упрощает контроль изменений.