[Перевод] Вышел Vue 3.5
Эта статья — перевод оригинальной статьи «Announcing Vue 3.5».
Также я веду телеграм канал «Frontend по‑флотски», где рассказываю про интересные вещи из мира разработки интерфейсов.
Вступление
Сегодня мы рады сообщить о выходе Vue 3.5 «Tengen Toppa Gurren Lagann»!
Этот минорный релиз не содержит кардинальных изменений и включает в себя как внутренние улучшения, так и новые полезные функции. Мы расскажем о некоторых основных моментах в этом блоге — полный список изменений и новых возможностей можно найти в полном журнале изменений на GitHub.
Оптимизация системы реактивности
В версии 3.5 система реактивности Vue подверглась очередному масштабному рефакторингу, который позволил добиться более высокой производительности и значительно улучшить использование памяти (-56%) без каких-либо изменений в поведении. Рефакторинг также решает проблемы с устаревшими computed и памятью, вызванные зависанием computed во время SSR.
Кроме того, в 3.5 оптимизировано отслеживание реактивности для больших, глубоко реактивных массивов, что в некоторых случаях ускоряет такие операции до 10 раз.
Подробности: PR#10397, PR#9511
Реактивная деструктуризация props
Реактиваная деструктуризация props была стабилизирована в 3.5. Теперь эта функция включена по умолчанию, и переменные, деструктурированные в результате вызова defineProps в
Подробнее: PR#11404
data-allow-mismatch
В случаях, когда клиентское значение неизбежно отличается от своего серверного аналога (например, даты), мы теперь можем подавлять возникающие предупреждения о несоответствии гидратация с помощью атрибутов data-allow-mismatch:
{{ data.toLocaleString() }}
Вы также можете ограничить допустимые типы несоответствий, указав значение атрибута, где возможными значениями являются text, children, class, style иattribute .
Улучшения пользовательских элементов
В версии 3.5 исправлено множество давних проблем, связанных с API defineCustomElement(), и добавлен ряд новых возможностей для создания пользовательских элементов с помощью Vue:
Поддержка конфигураций приложений для пользовательских элементов с помощью опции
configureApp.Добавьте
useHost(),useShadowRoot()иthis.$hostдля доступа к элементу host и shadow root пользовательского элемента.Поддержка установки пользовательских элементов без Shadow DOM путем передачи
shadowRoot: false.Поддержка предоставления опции nonce, которая будет прикрепляться к тегам
, вводимым пользовательскими элементами.
Эти новые опции, предназначенные только для пользовательских элементов, могут быть переданы в defineCustomElement через второй аргумент:
import MyElement from './MyElement.ce.vue'
defineCustomElements(MyElement, {
shadowRoot: false,
nonce: 'xxx',
configureApp(app) {
app.config.errorHandler = ...
}
})
Другие примечательные особенности
useTemplateRef ()
В версии 3.5 появился новый способ получения ссылок на шаблоны с помощью API useTemplateRef():
До версии 3.5 мы рекомендовали использовать обычные ссылки с именами переменных, совпадающими со статическими атрибутами ссылок. Старый подход требовал, чтобы атрибуты ссылок были анализируемы компилятором, и поэтому был ограничен статическими атрибутами ссылок. В отличие от этого, useTemplateRef() сопоставляет рефссылки по идентификаторам строк времени выполнения, поэтому поддерживает динамическое привязывание рефссылки к изменяющимся идентификаторам.
В @vue/language-tools 2.1 также реализована специальная поддержка нового синтаксиса, поэтому при использовании useTemplateRef() вы получите автодополнение и предупреждения, основанные на наличии атрибутов ref в вашем шаблоне:

Deferred Teleport
Известное ограничение встроенного компонента заключается в том, что его целевой элемент должен существовать в момент установки компонента телепортации. Это не позволяло пользователям телепортировать содержимое в другие элементы, отрисованные Vue после телепортации.
В 3.5 мы добавили свойство defer для , которое монтирует его после текущего цикла рендеринга, так что теперь это будет работать:
...
Это поведение требует prop defer, потому что поведение по умолчанию должно быть обратно совместимым.
Подробнее: PR#11387
onWatcherCleanup ()
В версии 3.5 появился глобально импортируемый API, onWatcherCleanup (), для регистрации обратных вызовов очистки в наблюдателях:
import { watch, onWatcherCleanup } from 'vue'
watch(id, (newId) => {
const controller = new AbortController()
fetch(`/api/${newId}`, { signal: controller.signal }).then(() => {
// callback logic
})
onWatcherCleanup(() => {
// abort stale request
controller.abort()
})
})
Связано: новый раздел документации по очистке побочных эффектов
