Breaking changes

В процессе развития библиотек и фреймворков неизбежно происходят изменения API. Часть из них может нарушать обратную совместимость. Такие изменения называются breaking changes — изменения, из-за которых существующий код перестаёт работать без модификаций.

Для библиотек пользовательского интерфейса, включая Vuetify, breaking changes особенно чувствительны, поскольку затрагивают:

  • структуру компонентов
  • имена пропсов
  • систему стилей
  • способы работы с темами
  • правила компоновки
  • синтаксис слотов
  • конфигурацию плагина

Наиболее заметные breaking changes произошли при переходе между крупными версиями библиотеки:

  • Vuetify 1 → Vuetify 2
  • Vuetify 2 → Vuetify 3

Каждая из этих миграций включала значительное обновление архитектуры.


Основные причины появления breaking changes

Breaking changes возникают по нескольким причинам.

Архитектурные изменения

По мере развития проекта появляются более эффективные архитектурные решения. Старые API становятся ограничивающими и требуют переработки.

Пример:

  • переход Vuetify 3 на Vue 3
  • использование Composition API
  • новая система реактивности

Это потребовало изменения внутренних механизмов компонентов.


Упрощение API

Иногда API становится перегруженным. Поддержка устаревших параметров усложняет библиотеку.

Breaking changes позволяют:

  • удалить устаревшие props
  • унифицировать имена
  • сделать поведение компонентов предсказуемым

Повышение производительности

Оптимизация рендеринга может потребовать изменения структуры компонентов или способа передачи данных.

Например:

  • изменение системы layout
  • переработка grid-системы
  • отказ от лишних DOM-обёрток

Переход на новые стандарты

Современные версии Vue, CSS и браузеров предоставляют новые возможности. Чтобы использовать их полноценно, иногда требуется отказаться от старых подходов.


Breaking changes при переходе на Vuetify 3

Версия Vuetify 3 стала самым масштабным обновлением библиотеки. Она полностью построена на Vue 3 и Composition API.

Основные изменения затронули:

  • систему компонентов
  • layout-механизм
  • систему тем
  • конфигурацию плагина
  • иконки
  • grid-систему

Изменение системы установки

Vuetify 2

В предыдущей версии установка происходила через создание экземпляра Vuetify:

import Vue from 'vue'
import Vuetify from 'vuetify'

Vue.use(Vuetify)

const vuetify = new Vuetify()

new Vue({
  vuetify,
  render: h => h(App)
}).$mount('#app')

Vuetify 3

В новой версии используется функция createVuetify.

import { createApp } from 'vue'
import { createVuetify } from 'vuetify'

const vuetify = createVuetify()

createApp(App)
  .use(vuetify)
  .mount('#app')

Изменения:

  • используется Vue 3 API
  • установка происходит через app.use
  • исчез класс new Vuetify()

Изменение layout-системы

Vuetify 2

Layout строился через компоненты:

  • v-app
  • v-content
  • v-container
  • v-layout
  • v-flex

Пример:

<v-container>
  <v-layout row>
    <v-flex xs12 md6>
      Content
    </v-flex>
  </v-layout>
</v-container>

Vuetify 3

Система layout была полностью переработана.

Удалены компоненты:

  • v-layout
  • v-flex

Используется современная CSS Grid / Flexbox-модель.

Новые компоненты:

  • v-row
  • v-col

Пример:

<v-container>
  <v-row>
    <v-col cols="12" md="6">
      Content
    </v-col>
  </v-row>
</v-container>

Основные изменения:

  • упрощённый API
  • более читаемая сетка
  • улучшенная адаптивность

Изменения в системе тем

Vuetify 2

Темы настраивались через объект theme.

new Vuetify({
  theme: {
    themes: {
      light: {
        primary: '#1976D2',
        secondary: '#424242'
      }
    }
  }
})

Vuetify 3

Темы создаются внутри createVuetify.

const vuetify = createVuetify({
  theme: {
    defaultTheme: 'light',
    themes: {
      light: {
        colors: {
          primary: '#1976D2',
          secondary: '#424242'
        }
      }
    }
  }
})

Breaking changes:

  • добавлено свойство colors
  • изменена структура темы
  • появилось defaultTheme

Изменение работы с иконками

Vuetify 2

Иконки часто подключались через глобальную настройку:

icons: {
  iconfont: 'mdi'
}

Использование:

<v-icon>mdi-home</v-icon>

Vuetify 3

Система стала более модульной.

import { aliases, mdi } from 'vuetify/iconsets/mdi'

createVuetify({
  icons: {
    defaultSet: 'mdi',
    aliases,
    sets: {
      mdi
    }
  }
})

Изменения:

  • модульная регистрация
  • поддержка нескольких наборов
  • более гибкая конфигурация

Изменения props компонентов

Во многих компонентах были изменены имена props.

Пример: v-btn

Vuetify 2

<v-btn color="primary" dark>
  Button
</v-btn>

Vuetify 3

<v-btn color="primary" variant="elevated">
  Button
</v-btn>

Breaking changes:

  • удалены props dark и light
  • введено свойство variant

Возможные варианты:

  • elevated
  • outlined
  • text
  • tonal
  • flat
  • plain

Изменения слотов

Во многих компонентах был изменён синтаксис слотов.

Vuetify 2

<v-data-table>
  <template v-slot:item.name="{ item }">
    {{ item.name }}
  </template>
</v-data-table>

Vuetify 3

Некоторые слоты были переименованы или изменили структуру параметров.

<v-data-table>
  <template #item.name="{ value }">
    {{ value }}
  </template>
</v-data-table>

Изменения:

  • упрощённые параметры
  • унификация названий
  • более строгая типизация

Изменение системы CSS-утилит

В старых версиях Vuetify активно использовались утилиты:

  • pa-4
  • ma-2
  • text-xs-center

Часть утилит была пересмотрена или заменена современными CSS-подходами.

Пример:

class="d-flex align-center justify-center"

Некоторые классы были удалены или переименованы.


Изменение системы форм

Компоненты форм получили обновлённый API.

Vuetify 2

<v-text-field
  label="Name"
  outlined
  dense
></v-text-field>

Vuetify 3

<v-text-field
  label="Name"
  variant="outlined"
  density="compact"
></v-text-field>

Breaking changes:

  • outlinedvariant="outlined"
  • densedensity="compact"

Это сделало API более единообразным.


Изменения в системе директив

Некоторые директивы были удалены или изменены.

Например:

  • обновлена директива v-ripple
  • изменены параметры конфигурации

Пример:

<v-btn v-ripple>
  Click
</v-btn>

Изменения в системе плагинов

Vuetify 3 активно использует tree-shaking. Это означает, что компоненты могут импортироваться выборочно.

import { VBtn, VCard } from 'vuetify/components'

Преимущества:

  • уменьшение размера бандла
  • улучшение производительности

Однако это также изменяет структуру импорта компонентов.


Изменение структуры пакета

Vuetify 3 разделён на модули:

  • vuetify/components
  • vuetify/directives
  • vuetify/styles
  • vuetify/iconsets

Это breaking change для проектов, использующих старые импорты.


Изменения в системе типизации

Vuetify 3 получил глубокую интеграцию с TypeScript.

Это привело к:

  • строгой типизации props
  • улучшенной поддержке IDE
  • изменению сигнатур некоторых методов

В старых проектах могут появляться ошибки типов.


Стратегии миграции при breaking changes

При обновлении крупных версий обычно применяются несколько подходов.

Пошаговая миграция

  1. обновление Vue
  2. обновление Vuetify
  3. исправление ошибок компиляции
  4. постепенная адаптация компонентов

Использование migration guide

Разработчики Vuetify публикуют подробные руководства миграции, содержащие:

  • список удалённых API
  • замену props
  • новые паттерны

Рефакторинг компонентов

Многие компоненты требуют переписывания:

  • layout
  • формы
  • таблицы
  • диалоги

Автоматические инструменты

В некоторых случаях используются codemod-скрипты, которые автоматически:

  • переименовывают props
  • изменяют синтаксис

Однако полностью автоматическая миграция обычно невозможна.


Типичные ошибки после обновления

После перехода на новую версию Vuetify часто возникают проблемы:

Не найден компонент

Причина:

  • компонент не импортирован
  • изменилось имя

Ошибка props

Причина:

  • устаревший prop
  • изменение типа значения

Проблемы со стилями

Причина:

  • изменение CSS-утилит
  • изменение layout

Нарушение работы слотов

Причина:

  • изменение API слотов
  • изменение структуры параметров

Практическое значение breaking changes

Несмотря на сложности миграции, breaking changes позволяют библиотеке:

  • развиваться архитектурно
  • улучшать производительность
  • упрощать API
  • внедрять современные стандарты

Для долгосрочных проектов понимание этих изменений становится важной частью работы с экосистемой Vue и Vuetify.