Эта статья — перевод оригинальной статьи Andy Li из Vue Mastery «Vue 3 Migration Build: safely upgrade your app to Vue 3 (Pt. 1)».
Также я веду телеграм канал “Frontend по-флотски”, где рассказываю про интересные вещи из мира разработки интерфейсов.
Вступление
Команда Vue недавно выпустила долгожданный билд миграции для Vue 3. Если вы думали об обновлении своего приложения с Vue 2 до Vue 3, это то, что вам нужно.
Процесс обновления приложения до последней версии фреймворка может оказаться непростой задачей. Эта серия статей создана, чтобы упростить этот процесс.
Серия миграции на Vue 3 состоит из двух частей:
-
Билд для миграции на Vue 3 (эта статья)
Наряду с этой статьей мы также создали наглядный альбом для наиболее распространенных изменений.
Что такое билд миграции?
Билд миграции Vue 3.1 — это «специальная» версия Vue 3, которая позволяет вашему существующему приложению Vue 2 работать в режиме Vue 2 (или в режиме, совместимом с Vue 2). Этот режим Vue 2 является частью Vue 3, но его поведение почти идентично обычному Vue 2.

Основное отличие состоит в том, что он будет выдавать вам предупреждения всякий раз, когда ваш код использует устаревшие функции (вещи, которые не поддерживаются в Vue 3).
Билд миграции — это не инструмент, который автоматически переписывает ваш код, чтобы он был совместим с Vue 3, вам все равно придется делать это вручную (чтобы узнать об изменениях кода списка, которые вы должны внести для Vue 3, ознакомьтесь со статьей Vue 3 Migration Changes). Смысл билда миграции — предоставить «безопасную» среду, в которой вы можете постепенно исправлять свой код, чтобы сделать его совместимым с Vue 3.
Процесс миграции
Вот общий рабочий процесс обновления вашего приложения с Vue 2 до Vue 3 с помощью билда миграции:

-
Установите Vue 3 и билд миграции (называемую @vue/compat) в существующее приложение Vue 2.
-
Исправьте ошибки, вызванные использованием функций, несовместимых с билдом миграции. Я объясню это немного позже.
-
После исправления ошибок ваше приложение Vue 2 должно работать нормально. Теперь нам просто нужно исправить код, следующий за предупреждениями, которые выдает нам билд миграции.
-
И, наконец, полностью переключитесь на Vue 3, удалив билд миграции.
Об ошибках на шаге 2… Режим Vue 2 в Vue 3 не полностью совместим с приложением Vue 2. Есть несколько несовместимых функций и несколько частично совместимых. (повторю — ознакомьтесь со статьей Vue 3 Migration Changes для получения более подробной информации).
Чтобы получить некоторый практический опыт работы с этим билдом миграции, мы собираемся использовать простое приложение Vue 2 в качестве примера и обновим его до Vue 3. Этот образец приложения содержит вещи, которые больше не поддерживаются в Vue 3, поэтому запуск его вместе с билдом миграции определенно даст нам ошибки и предупреждения. Но это хорошо, потому что это означает, что билд миграции работает, и нам просто нужно исправлять эти ошибки и предупреждения, одно за другим.
Пример приложения
Вы можете скачать пример приложения с github следующим образом:
git clone <https://github.com/Code-Pop/blog.git> my-vue-app cd my-vue-app git checkout compat-app-starting
Тег compat-app-start — это место, где приложение работает в режими Vue 2. Есть еще один тег compat-app-end, это наш финальный код, в котором приложение работает в режиме Vue 3. Но чтобы следовать этому руководству, мы начнем с compat-app-start.
Чтобы запустить приложение:
npm install npm run serve
Теперь вы можете проверить приложение на localhost: 8080

Приложение очень простое. Он просто отображает заголовок и список чисел. Кнопка Pop будет удалять число из списка при каждом нажатии.
Если вы посмотрите код на main.js, App.vue и Heading.vue, то увидите, что в нем используются некоторые функции, которые не рекомендуются в Vue 3.
Способ рендеринга корневого компонента:
/src/main.js
new Vue({ render: h => h(App), }).$mount('#app')
Использование watch для массива без параметра deep:
/src/App.vue
export default { name: 'App', ... data() { return { items: [1,2,3,4,5] } }, watch: { items: { handler(val, oldVal) { console.log(oldVal + ' --> ' + val) } } },
Watch здесь наблюдает за массивом items, и всякий раз, когда он изменяется, срабатывает обработчик. Мы используем его для вывода сообщения в консоль браузера.
Использование такого функционального компонента:
/src/components/Heading.vue
<template functional> <h1>{{ props.msg }}</h1> </template>
Функциональный компонент по-прежнему разрешен в Vue 3, но он использует другой синтаксис.
Есть много других функций Vue 2, которые не рекомендуются в Vue 3. Вышеупомянутые функции используются только для демонстрации в этом руководстве.
Затем давайте установим билд миграции.
Установка билда миграции

Поскольку Vue-CLI является наиболее распространенным инструментом, который люди используют для создания приложений Vue 2, это руководство будет посвящено обновлению приложения Vue-CLI. Если вы используете Vite или другие системы сборки, вы можете ознакомиться с файлом readme на GitHub, посвященном миграции, для получения дополнительной информации.
Во-первых, мы собираемся убедиться, что @vue/cli-service находится в новейшей версии:
vue upgrade
(запустите указанную выше команду в каталоге примера приложения)
Затем измените package.json, чтобы установить Vue 3, билд миграции (@vue/compat) и компилятор для компонентов (@vue/compiler-sfc).
"dependencies": { "vue": "^3.1.0-0", // ADD "@vue/compat": "^3.1.0-0" // ADD "vue": "^2.6.11", // REMOVE ... }, "devDependencies": { "@vue/compiler-sfc": "^3.1.0-0" // ADD "vue-template-compiler": "^2.6.11" // REMOVE ... }
(Нам пришлось удалить Vue 2 и vue-template-compiler из package.json, потому что они больше не нужны.)
Установите добавленные зависимости:
npm install
Остался только один шаг, чтобы заставить билд миграции работать.
Нам нужно создать файл vue.config.js, чтобы настроить некоторые параметры компилятора:
/vue.config.js
module.exports = { chainWebpack: config => { config.resolve.alias.set('vue', '@vue/compat') config.module .rule('vue') .use('vue-loader') .tap(options => { return { ...options, compilerOptions: { compatConfig: { MODE: 2 } } } }) } }
(создайте этот файл в корневом каталоге)
Теперь мы можем перезапустить дев сервер:
npm run serve
И вы должны увидеть такую ошибку:

Не волнуйся. Это просто означает, что билд миграции работает!
Затем давайте исправим эту ошибку.
Исправление ошибок

Как я уже сказал ранее, есть функции, несовместимые с билдом миграции, и они просто выдадут вам ошибки вместо дружественных предупреждений.

Источником именно этой ошибки является функциональный компонент Heading.vue:
/src/components/Heading.vue
<template functional> <h1>{{ props.msg }}</h1> </template>
Все, что нам нужно сделать, это удалить атрибут functional и использовать msg вместо props.msg:
/src/components/Heading.vue
<template> <h1>{{ msg }}</h1> </template>
Теперь ошибка должна исчезнуть.
Но если вы проверите браузер, вы должны увидеть список предупреждений в консоли браузера.

Исправление предупреждений

Поскольку наше приложение использует некоторые функции, устаревшие в Vue 3, мы получаем три предупреждения:

-
Один жалуется, что мы не можем использовать метод mount в main.js
-
Один жалуется, что мы не можем использовать render в том же файле
-
И один говорит нам, что нам нужно добавить параметр deep для watch, который мы использовали в App.vue.
Мы можем исправить первые два, инициализировав приложение с помощью createApp:
/src/main.js
import Vue, { createApp } from 'vue' // ИЗМЕНИТЬ import App from './App.vue' // УДАЛИТЬ // Vue.config.productionTip = false // new Vue({ // render: h => h(App), // }).$mount('#app') // ДОБАВИТЬ createApp(App).mount('#app')
Обновите приложение, и вы должны увидеть только одно предупреждение.
Все, что нам нужно сделать, это добавить параметр deep, как указано в предупреждении:
/src/App.vue
watch: { items: { handler(val, oldVal) { console.log(oldVal + ' --> ' + val) }, deep: true } },
И мы закончили.
Конфигурации
Если по какой-то причине вы не можете изменить код в данный момент, но все же хотите избавиться от предупреждений, вы можете сделать это, установив конфигурации предупреждений.
Например, если мы не добавили deep в наш watch, мы можем перейти на main.js и отключить предупреждение для этой функции:
/src/main.js
import Vue, { createApp } from 'vue' import App from './App.vue' Vue.configureCompat({ WATCH_ARRAY: false })
WATCH_ARRAY — это идентификатор конфигурации для этой конкретной устаревшей функции. Вы можете увидеть полный список идентификаторов предупреждений об устаревании в файле readme для билда миграции.
Удаление билда миграции

На данный момент наше приложение полностью совместимо с Vue 3. Таким образом, билд миграции нам больше не нужен; он сделал свое дело.
Чтобы приложение работало в режиме Vue 3 вместо режима Vue 2 билда миграции, мы должны удалить @vue/compat.
Удалите его из package.json:
/package.json
"dependencies": { // "@vue/compat": "^3.1.0-0", УДАЛИТЬ "core-js": "^3.6.5", "vue": "^3.1.0-0" },
После изменения package.json нам нужно снова запустить npm install:
npm install
Затем удалите импорт Vue и configuration из main.js:
import /* Vue,*/ { createApp } from 'vue' // ИЗМЕНИТЬ import App from './App.vue' // Vue.configureCompat({ WATCH_ARRAY: false }) УДАЛИТЬ createApp(App).mount('#app')
И, наконец, удалите файл vue.config.js, который мы создали ранее.
Перезагрузите сервер:
npm run serve
Прочие соображения
На практике вы, вероятно, столкнетесь с гораздо большим количеством ошибок и предупреждений, чем то, что мы видели здесь, в этой простой демонстрации. Но рабочий процесс тот же: 1) установите Vue 3 с билдом миграции, 2) исправьте ошибки, 3) исправьте предупреждения и 4) удалите билд миграции.

Если вы используете Vue Router или Vuex, вам придется обновить их до версии 4. (подробнее в следующей части)
Кроме того, Vue 3 отказывается от поддержки IE 11. Так что, если вам нужно поддерживать IE 11, лучше всего подождать, пока различные функции Vue 3 будут перенесены в Vue 2. Функции обратного переноса будут доступны в Vue 2.7. около 2021Q3.
В следующей части этой мини-серии мы подробно рассмотрим все предупреждения об устаревании, с которыми вы, скорее всего, столкнетесь. Приложение теперь работает в актуальной версии Vue 3.
ссылка на оригинал статьи https://habr.com/ru/articles/570184/
Добавить комментарий