18 сентября 2026 года команда Vue опубликовала Vue.js 3.6.0-rc.9 — девятую release candidate сборку ветки 3.6. В официальном changelog перечислены 53 исправления, и все они относятся к Vapor Mode: 22 затрагивают компилятор, 29 — runtime, ещё 2 — общую интеграцию Vapor.

Vue.js 3.6.0-rc.9 превратился в большую зачистку Vapor Mode
Официальная страница релиза помечает Vue.js 3.6.0-rc.9 как pre-release и указывает дату публикации 18 сентября. Для предварительных сборок команда Vue отправляет разработчиков к changelog ветки minor, где и раскрывается реальный масштаб изменений.
В changelog Vue Core у 3.6.0-rc.9 нет разделов с новыми функциями или отдельными улучшениями производительности. Запись целиком состоит из исправлений ошибок.
| Область | Количество исправлений |
compiler-vapor | 22 |
runtime-vapor | 29 |
vapor | 2 |
| Всего | 53 |
Для сравнения, предыдущая 3.6.0-rc.8 от 11 сентября содержала 11 исправлений и 3 пункта в разделе Performance Improvements. У rc.9 список заметно шире и охватывает сразу несколько сложных сценариев: SSR-гидратацию, v-for, KeepAlive, v-show, переходы, слоты, template refs и совместную работу Vapor-компонентов с привычным VDOM.
Vapor Mode — новая стратегия компиляции Vue, которая работает без Virtual DOM и сильнее опирается на встроенную реактивность фреймворка. Именно так её описывает официальная документация Vue. Поэтому ошибки в Vapor затрагивают сам механизм, через который шаблон превращается в реальные изменения DOM.
SSR-гидратация стала одной из главных зон исправлений
Несколько правок в rc.9 связаны с гидратацией — процессом, при котором JavaScript на клиенте подключается к HTML, уже сформированному сервером. Для SSR-приложений сбой в этой части может проявляться особенно неприятно: разметка на экране уже есть, а после запуска клиентского кода отдельные узлы пересоздаются, меняются местами или вызывают предупреждения о несовпадении.
Один из исправленных сценариев касался асинхронного компонента с несколькими корневыми элементами. В Vapor курсор гидратации мог остановиться на закрывающем маркере фрагмента. Следующий блок воспринимал эту позицию как собственное начало, из-за чего серверная разметка отбрасывалась и создавалась заново. В описании исправления разработчики приводят последствия: предупреждение о children mismatch и возможную ошибку при app.unmount().
В rc.9 исправлены и другие случаи гидратации: пустые текстовые блоки, отсутствующий текст среди дочерних элементов, null в привязках, состояние v-show при разрешённых несовпадениях и сохранение владения фрагментом при пустом тексте.
Общая картина здесь довольно показательная. Vapor уже умеет проходить сложные SSR-сценарии, а текущая стадия разработки вылавливает случаи, где несколько механизмов пересекаются одновременно: async-компоненты, фрагменты, ленивые стратегии гидратации и соседние динамические блоки.
v-for и пустые ветки больше не должны ломать порядок элементов
Ещё один заметный класс исправлений касается v-for. В одном из воспроизводимых примеров keyed-цикл вставлял новый элемент перед элементом, внутри которого v-if в текущий момент ничего не рисовал. Vapor помещал новый узел внутрь диапазона якорей пустой ветки. Когда эта ветка позже начинала отображаться, её содержимое появлялось раньше вставленного элемента, и итоговый порядок DOM расходился с порядком данных.
В тестовом сценарии ожидалась последовательность p3 b2 p1, а Vapor мог формировать b2 p3 p1. Для интерфейса со списками это уже видимая ошибка: строка, карточка или компонент оказывались в другой позиции после изменения реактивного состояния.
Исправление меняет выбор опорного узла для пустого фрагмента. Runtime теперь учитывает внутренний якорь вложенной пустой ветки и сохраняет порядок элементов после последующего появления содержимого.
Компилятор получил ещё несколько связанных правок. В rc.9 скорректировано использование селектора v-for при сравнении ключей, сохранение позиции индекса при отсутствии key, обработка значений параметров callback и разрешение alias-переменных через AST.
KeepAlive, v-show и переходы приблизили Vapor к поведению VDOM
Компонент KeepAlive тоже попал в список исправлений. При изменении include или exclude текущий Vapor-компонент мог попасть в новую конфигурацию кэширования, после чего переключение на другой компонент и возврат создавали новый экземпляр. Старый экземпляр оставался деактивированным даже после app.unmount().
Причина находилась в том, что Vapor-реализация KeepAlive при изменении параметров очищала кэш, но не сохраняла текущую ветку как кэшируемую. В rc.9 текущая ветка сохраняется после изменения include или exclude, а логика удаления ориентируется на состояние, с которым ветка реально была отрисована.
Параллельно runtime исправляет несколько деталей v-show: обработку вложенных динамических корней, поведение корневого slot outlet и восстановление видимого состояния при гидратации скрытого SSR-элемента.
Переходы получили отдельную правку для CSS-классов. При обновлении обычной привязки class Vapor теперь сохраняет классы, добавленные системой transition. Для интерфейсов с анимацией это устраняет ситуацию, когда реактивное изменение класса случайно сбивает состояние перехода.
Совместимость Vapor и VDOM получила отдельную серию правок
Vue 3.6 развивается в условиях, где Vapor-компоненты могут соседствовать с существующими VDOM-компонентами. Поэтому часть rc.9 посвящена interop — слою совместимости между двумя механизмами рендеринга.
В changelog перечислены исправления передачи attrs функциональным VDOM-компонентам, слотов в асинхронные VDOM-компоненты, чтения обработчиков событий из текущего vnode и корректного удаления вложенного VDOM-содержимого. Ещё одна правка гарантирует, что vnode hooks при interop вызываются ровно один раз.
Есть и более тонкий случай с KeepAlive: props кэшированного VDOM-дочернего компонента внутри Vapor теперь изолируются, чтобы последующие изменения не затрагивали сохранённое состояние неожиданным образом.
Эти исправления показывают, что совместимость оформлена как отдельный технический слой. Приложения и библиотеки переходят на новый рендерер постепенно, поэтому смешанные деревья компонентов остаются реальным сценарием.
Компилятор Vapor исправил кэширование выражений и сохранение значений
Самая большая группа компиляторных правок связана с тем, как Vapor анализирует шаблон и кэширует повторяющиеся выражения. Здесь исправлены optional chaining, бинарные выражения со скобками, локальные bindings и member expressions с неподдерживаемыми ключами.
Отдельные изменения сохраняют исходные значения там, где преобразование могло менять семантику шаблона: числовые литералы в props слотов и custom elements, raw-значения для v-model, специальные boolean-значения с .attr, а также leading newline в <pre> и <textarea>.
Такие детали определяют, совпадает ли результат работы нового компилятора с привычным Vue-шаблоном. Ошибка в одной оптимизации может проявиться в конкретной комбинации синтаксиса и привести к неверному значению props, пропавшему тексту или неожиданной реактивности.
Состав rc.9 показывает фокус на точности сгенерированного кода. На compiler-vapor приходится 22 из 53 исправлений, и значительная часть этих правок сохраняет исходную семантику шаблонов при оптимизации.
Vue 3.6.0-rc.9 остаётся предварительной сборкой с плотной фазой стабилизации
GitHub по-прежнему помечает 3.6.0-rc.9 как pre-release. В самой записи релиза нет даты стабильного Vue 3.6, а changelog rc.9 содержит только исправления.
При этом характер изменений уже отличается от ранней стадии разработки Vapor Mode. Большая часть работы касается пересечений зрелых механизмов Vue: SSR, async-компонентов, KeepAlive, переходов, слотов, v-for, template refs и VDOM interop. Это типичная зона, где ошибки проявляются только после сочетания нескольких функций в одном компонентном дереве.
Сколько подобных пограничных сценариев обнаружится до стабильного тега Vue 3.6, пока неизвестно. Девятая release candidate показывает, что команда всё ещё выравнивает поведение Vapor с существующей моделью Vue и закрывает расхождения, найденные в реальных комбинациях шаблонов и runtime-механизмов.