> Как мигрировать на Vue 3 с Composition API (Vue.js)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: TradeLink
Стек: Vue.js
> Пример ответа
Короткий ответ
Миграция на Vue 3 с Composition API включает установку пакета vue@3, замену глобального API (например, Vue.mixin на app.mixin), переход на defineComponent и setup(). Composition API позволяет группировать логику по функциям вместо опций, улучшая переиспользование и типизацию. Для постепенной миграции используйте @vue/compat или плагин vue-router@4 и vuex@4. Ключевой trade-off - отказ от this в setup и замена lifecycle hooks на onMounted и аналоги.
Подробное объяснение
Миграция на Vue 3 с Composition API - это не просто обновление версии, а смена парадигмы организации кода. Основные изменения:
- Глобальный API: вместо
new Vue()используйтеcreateApp(). Все глобальные плагины и миксины регистрируются черезapp.use()иapp.mixin(). - Composition API: логика выносится в
setup()или отдельные composables.thisвнутри setup недоступен, вместо него - props, context и refs. - Lifecycle hooks:
createdиbeforeCreateзаменяются на самsetup(), остальные - наonMounted,onUnmountedи т.д. - Reactivity:
Vue.observableзаменён наreactive,refиcomputed.this.someDataстановитсяsomeData.valueдля ref. - TypeScript: Composition API лучше интегрируется с TypeScript, так как типы выводятся из возвращаемых значений.
- Фрагменты: компоненты могут иметь несколько корневых элементов без обёртки.
Для миграции используйте @vue/compat (режим совместимости) или обновляйте компоненты по одному. Плагины (vue-router, vuex) требуют версий 4.x.
На практике
Начните с аудита зависимостей: проверьте совместимость библиотек с Vue 3. Затем:
- Установите
vue@3и обновите сборщик (Vite или webpack с vue-loader@17). - Замените
new Vue()наcreateApp()в main.js. - Для каждого компонента решите: переписывать на Composition API или оставить Options API (Vue 3 поддерживает оба).
- Для сложной логики создайте composables - функции, возвращающие реактивные данные и методы.
- Замените
$emitнаemitизsetup(props, { emit }), а$refs- на template refs черезref().
Пример кода
<template> <div> <p>{{ count }}</p> <button @click="increment">+1</button> </div> </template> <script setup> import { ref } from 'vue' const count = ref(0) const increment = () => count.value++ </script>
Сравните с Options API:
<script> export default { data() { return { count: 0 } }, methods: { increment() { this.count++ } } } </script>
Как отвечать на собеседовании
Начните с ключевых изменений: createApp, setup, ref/reactive. Подчеркните, что Composition API решает проблему "mixins hell" и улучшает переиспользование через composables. Упомяните, что миграция может быть постепенной - Vue 3 поддерживает Options API. Приведите пример типичной замены: mounted → onMounted, computed → computed(). Если спросят про сложности, скажите о необходимости обновления сторонних библиотек и изменении паттернов с this.
Что проверяет интервьюер
- Понимание разницы между Options и Composition API.
- Знание breaking changes:
createApp, удаление$listeners, изменениеv-model. - Умение объяснить trade-off: Composition API сложнее для новичков, но лучше для масштабирования.
- Практический опыт: как обрабатывать
provide/inject,watch,nextTickв новом API. - Навык рефакторинга: как разбить большой компонент на composables.
Типичные ошибки
- Использование
thisвнутриsetup()- это приводит к undefined. - Забывание
.valueпри работе сrefв шаблоне (хотя в шаблоне это не нужно, но в JS-коде - обязательно). - Попытка использовать
Vue.observableвместоreactive. - Необновление плагинов (vue-router@3 несовместим с Vue 3).
- Смешивание Options и Composition API в одном компоненте без понимания приоритетов (setup выполняется раньше data).
> Похожие задачи по frontend
Вызывается ли watchEffect сразу или только при изменении данных во Vue
Какие проблемы встречаются при работе с Nuxt
Что такое двустороннее связывание в Vue
Почему Vue удобен для разбивки кода на компоненты и переиспользования по сравнению с чистым JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью