Nadchodzący Vapor Mode w Vue 3.6 zadebiutuje tej jesieni i zrobi coś, czego ten framework nigdy wcześniej nie zrobił: skompiluje komponenty jednofajlowe (single-file components) bezpośrednio do aktualizacji DOM, całkowicie omijając wirtualny DOM.
Dlaczego Vue odwraca się od wirtualnego DOM
Od wersji Vue 2 wirtualny DOM stanowił rdzeń modelu reaktywności frameworka. Gdy stan ulega zmianie, Vue buduje lekkie drzewo w pamięci, porównuje je (diffing) z poprzednią wersją i aktualizuje tylko te części, które się różnią. Ta pośredniość pozwala programistom pisać deklaratywny kod bez martwienia się o to, który element faktycznie wymaga aktualizacji. Ceną za to jest fakt, że każde renderowanie wciąż wiąże się z kosztem budowania i porównywania tego wirtualnego drzewa.
Vapor Mode eliminuje ten pośredni krok. Podczas budowania kompilator Vue analizuje szablon i generuje JavaScript wywołujący natywne metody DOM — element.textContent = …, element.setAttribute(...) — bezpośrednio tam, gdzie zmiana jest potrzebna. Żadne węzły wirtualne nie są tworzone, nie działa też pętla porównywania. Pakiet (bundle) zawiera ostatecznie tylko kod wymagany do konkretnych aktualizacji, które napisałeś, plus runtime niezbędny do reaktywności.
Wpływ na rozmiar i szybkość w rzeczywistych zastosowaniach
- Rozmiar pakietu – Dzięki usunięciu runtime'u wirtualnego DOM i jego struktur danych, generowany kod staje się mniejszy. W projektach z dużymi siatkami (grids) lub płótnami (canvases), które aktualizują się dziesiątki razy na sekundę, oszczędności te sumują się, szczególnie przy połączeniach o niskiej przepustowości.
- Wydajność – Bezpośrednie wywołania DOM omijają narzut związany z porównywaniem (diffing), co staje się zauważalne, gdy interfejs użytkownika zmienia się z dużą częstotliwością. W zestawie moich osobistych gier przeglądarkowych — nonogramie, klonie pasjansa saper oraz wizualizatorze kostki Rubika 3D — napisałem logikę renderowania ręcznie, aktualizując DOM tylko tam, gdzie było to konieczne.
- Ergonomia programisty – Kompilator wykonuje najcięższą pracę. Nadal piszesz zwykłe szablony Vue; nie musisz ręcznie tworzyć wywołań
document.querySelector. Wygenerowany kod odzwierciedla podejście pisane ręcznie, które zapewniło mi najlepszą wydajność w tych grach.
Kiedy Vapor Mode faktycznie pomaga
- Częste aktualizacje dużych struktur – Gry, intensywne pod względem danych pulpity nawigacyjne (dashboards) lub dowolny interfejs, który odświeża wiele komórek w każdym cyklu (tick), zyskują najwięcej. Porównywanie dużej siatki w każdym cyklu może zdominować budżet klatki (frame budget); bezpośrednie aktualizacje sprawiają, że praca jest liniowa i przewidywalna.
- Wdrożenia ograniczone rozmiarem pakietu – Strony typu mobile-first, które muszą ładować się w zaledwie kilkuset kilobajtach, odnotowują wymierną redukcję, gdy znika runtime wirtualnego DOM.
- Czysty, przewidywalny stan – Vapor Mode zakłada, że stan pozostaje niezmienny (immutable), a DOM jest traktowany jako czysta projekcja tego stanu. Jeśli Twój kod miesza efekty uboczne lub mutuje DOM poza systemem reaktywności Vue, wygenerowane aktualizacje mogą przestać być zsynchronizowane, co spowoduje błędy wizualne.
Gdzie stare podejście wciąż wygrywa
- Interfejsy o niskiej częstotliwości zmian – Proste formularze, statyczne strony lub panele administracyjne, które renderują się ponownie tylko przy sporadycznych działaniach użytkownika, zyskują niewiele na wydajności. Dodatkowy wysiłek związany z budowaniem wirtualnego drzewa jest pomijalny w porównaniu z opóźnieniem sieciowym lub czasem przetwarzania przez serwer.
- Złożone hierarchie komponentów – Gdy w głębokim drzewie zmienia się tylko węzeł liścia, wirtualny DOM może automatycznie pominąć duże jego części. Bezpośrednie aktualizacje zmuszają kompilator do generowania precyzyjnych poprawek (patches) dla każdej możliwej zmiany, co w przypadkach brzegowych może zwiększyć rozmiar kodu.
- Narzędzia i ekosystem – Wiele wtyczek Vue, narzędzi deweloperskich (devtools) i przydatnych narzędzi do testowania jest powiązanych z warstwą wirtualnego DOM. Integracje te mogą wymagać aktualizacji, aby współpracować z komponentami w trybie Vapor, dopóki ekosystem nie nadrobi zaległości.
Na co warto zwrócić uwagę w następnej kolejności
- Stabilna wersja – Vue 3.6 znajduje się obecnie w fazie release-candidate. Zespół planuje ostateczne, stabilne wydanie tej jesieni. Wcześni użytkownicy powinni poczekać na tę wersję przed wdrażaniem kodu produkcyjnego.
- Ścieżka migracji – Istniejące projekty Vue mogą korzystać z Vapor Mode na poziomie poszczególnych komponentów.
- Narzędzia wydajnościowe – Benchmarki porównujące wersje oparte na wirtualnym DOM oraz na trybie Vapor w rzeczywistych aplikacjach pomogą zespołom zdecydować, kiedy warto dokonać takiej zmiany.
Podsumowanie
Vapor Mode daje programistom Vue to, co najlepsze z dwóch światów: deklaratywną składnię, którą uwielbiają, oraz surową szybkość ręcznie tworzonych aktualizacji DOM. Doskonale sprawdza się w aplikacjach, które odświeżają duże fragmenty UI wiele razy na sekundę, oraz w wdrożeniach, gdzie liczy się każdy kilobajt. W przypadku interfejsów o niskim natężeniu ruchu, tradycyjny virtual DOM pozostaje w pełni wykonalnym, prostszym wyborem. W miarę jak funkcja ta przechodzi z fazy release candidate do wersji stabilnej, społeczność Vue będzie musiała zestawić oszczędności w rozmiarze paczki z gotowością ekosystemu oraz specyficznym profilem wydajności swoich aplikacji.
