Эта статья — перевод оригинальной статьи Evan You "Vue 3.2 Released!"

Также я веду телеграм канал “Frontend по-флотски”, где рассказываю про интересные вещи из мира разработки интерфейсов.

Вступление

Мы рады объявить о выпуске Vue.js 3.2 "Quintessential Quintuplets"! Этот релиз включает в себя множество значительных новых функций и улучшений производительности и не содержит критических изменений.

Новые фичи SFC

Две новые функции для однофайловых компонентов (SFC, также известные как файлы .vue) вышли из экспериментального статуса и теперь считаются стабильными:

  • <script setup> - это синтаксический сахар, который значительно улучшает эргономику при использовании Composition API внутри SFC.

  • <style> v-bind включает динамические значения CSS, управляемые через состояния компонентов, в теге <style>.

Вот пример компонента, использующего эти две новые функции вместе:

<script setup>
import { ref } from 'vue'

const color = ref('red')
</script>

<template>
  <button @click="color = color === 'red' ? 'green' : 'red'">
    Color is: {{ color }}
  </button>
</template>

<style scoped>
button {
  color: v-bind(color);
}
</style>

Попробуйте это на SFC Playground или прочтите соответствующую документацию:

Основываясь на <script setup> у нас также есть новый RFC для улучшения эргономики использования ref - пожалуйста, поделитесь своим мнением здесь.

Web Components

Vue 3.2 представляет новый метод defineCustomElement для простого создания собственных нативных веб компонентов с использованием API Vue компонентов:

import { defineCustomElement } from 'vue'

const MyVueElement = defineCustomElement({
  // поля обычного Vue компонента
})

// Зарегистрируйте свой компонент.
// После регистрации, все `<my-vue-element>` теги
// на на странице будут обновлены.
customElements.define('my-vue-element', MyVueElement)

Этот API позволяет разработчикам создавать библиотеки компонентов на основе Vue, которые можно использовать с любым фреймворком или же вообще без него. Мы также добавили в нашу документацию новый раздел, посвященный использованию и созданию веб-компонентов в Vue.

Улучшения производительности

3.2 включает в себя значительные улучшения производительности реактивности Vue, благодаря отличной работе @basvanmeurs. А именно:

Компилятор шаблонов также получил ряд улучшений:

Наконец, есть новая директива v-memo, которая дает возможность мемоизировать часть дерева шаблона. Директива v-memo позволяет Vue пропустить не только различие виртуального DOM, но и вообще создание новых VNodes. Несмотря на то, что эта директива понадобится вам довольно редко, но она обеспечивает обработку некоторых случаев для достижения максимальной производительности в определенных сценариях, например, в больших списках v-for.

Использование v-memo, которое представляет собой небольшое дополнение, помещает Vue в число самых быстрых фреймворков в js-framework-benchmark:

Server-side Rendering

Пакет @vue/server-renderer в версии 3.2 теперь включает сборку ES модуля, который также отделен от встроенных модулей Node.js. Это позволяет объединять и использовать @vue/server-renderer в средах выполнения, отличных от Node.js, таких как CloudFlare Workers или Service Workers.

Мы также улучшили streaming render APIs, добавив новые методы рендеринга в Web Streams API. Ознакомьтесь с документацией @vue/server-renderer для получения более подробной информации.

Effect Scope API

3.2 представляет новый Effect Scope API для прямого управления временем удаления реактивных эффектов (computed и watchers). Это упрощает использование API реактивности Vue вне контекста компонента, а также открывает некоторые расширенные варианты использования внутри компонентов.

Это низкоуровневый API, в основном предназначенный для авторов библиотек, поэтому рекомендуется прочитать RFC, чтобы узнать о мотивации и сценариях использования этой функции.

Заключение

Подробный список всех изменений в 3.2 смотрите в списке всех изменений.

Комментарии (30)


  1. js_n00b
    11.08.2021 00:45

    defineCustomElement — это конечно круто. Теперь Vue.js победит все остальные фреймворки.


    1. kotboriska
      11.08.2021 09:06
      +2

      А какие остальные? Ангуляр? У них просто разные задачи. У остальных использование чуть выше статистической погрешности. А Реакт - вообще не фреймворк.


      1. MaZaAa
        11.08.2021 10:40
        +1

        У них просто разные задачи

        У них у всех одна задача — пользовательский интерфейс. Так что не надо наивно полагать что якобы под разные проекты подходит тот или другой инструмент, они все подходят под любые задачи из реальной жизни.
        А Реакт — вообще не фреймворк.

        В этом его преимущество, ибо добавляешь к нему Typescript и MobX и он сразу превращается в шикарный инструмент. А без этих 2х аспектов он убогий, спору нет.


        1. kotboriska
          11.08.2021 15:41
          -1

          У автомобиля, поезда и самолёта тоже одна задача: транспортировка людей и предметов. Но об их взаимозаменяемости зачастую вопрос не стоит.

          Не, спорю, имея достаточно упорства, но недостаточно понимания, можно решить с помощью любого фронтенд фреймворка любые задачи пользовательского интерфейса, даже совершенно ему не свойственные. Вопрос в том, что фреймворк должен помогать разработчику достичь целей прилагая минимум усилий. Т.е. Реализовывать интерфейс (и всё, что с ним связано) нужно благодаря, а не вопреки фреймворку.

          По поводу доработки напильником - так если ещё добавить несколько библиотек уровня RxJs и выкинуть уродский синтаксис - то и ангуляр получится xD

          У Реакта есть только одно преимущество - порог входа: он написан РНРшниками для РНРшников. В остальном в сравнении с Vue полная безнадёга и упадок.


          1. MaZaAa
            12.08.2021 11:05

            У автомобиля, поезда и самолёта тоже одна задача

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

            React + MobX решает любые задачи UI.

            если ещё добавить несколько библиотек уровня RxJs

            Получится вырви глаз лапше код и непригодная для дальнейшего развития/поддержки кодовая база.

            выкинуть уродский синтаксис

            JSX великолепен

            У Реакта есть только одно преимущество — порог входа: он написан РНРшниками для РНРшников. В остальном в сравнении с Vue полная безнадёга и упадок.

            Голый react да, но его голым или +redux используют только недалекие. Он пригоден только в связке с MobX'ом, а тут уже это небо и земля.


            1. kotboriska
              12.08.2021 12:26

              Получится вырви глаз лапше код и непригодная для дальнейшего развития/поддержки кодовая база.

              Это получится при использовании любых инструментов, если руки растут оттуда, откуда ноги должны.

              Если человек не умеет ни во что кроме паттерна Flux и поделок мордокниги - это его проблемы. Кто слаще морковки ничего не ел и сложнее React'a ничего не осилил - ССЗБ.

              Отмечу, что даже этот паттерн во Vue реализован на голову удобнее, чем в православном Redux-e. За MobX не знаю - говорить не буду. В целом не фанат данного паттерна, но думаю этот холивар тут не уместен.

              React + MobX решает любые задачи UI.

              Angular или Vue решает те же задачи без MobX xD

              JSX великолепен

              Да-да, а CSS-in-JS прекрасен! (нет)

              Голый react да, но его голым или +redux используют только недалекие.

              Его используют по разным причинам, но выбирают как базовую библиотеку, как правило, недалёкие. Аргументы про процент использования из области "миллионы мух не могут ошибаться". Непродуманная архитектура еще долго будет вылезать боком. Хоть к 17 версии основные поводы для фейспалма закостылили, это всё в целом напоминает превозмогание собственноручно созданных трудностей.


              1. markelov69
                12.08.2021 12:46

                За MobX не знаю — говорить не буду

                Поэтому у вас такие суждения, MobX делает из React'a вообще абсолютно другой инструмент, управление состоянием становиться эталонным. React это только лишь view слой и ничего больше.


                1. kotboriska
                  12.08.2021 13:17

                  Заинтриговали... Глянул. Таки, да! С богомерзким Redux никакого сравнения. На первый взгляд даже может тягаться по удобству использования с Vuex'ом. Декораторы напомнили Angular>1, аж прослезился...

                  Но с появлением хуков, как мне кажется, все эти глобальные хранилища стали излишними. Функциональные компоненты и хуки способны решить большинство задач из коробки.


                  1. markelov69
                    12.08.2021 13:24

                    Но с появлением хуков, как мне кажется, все эти глобальные хранилища стали излишними. Функциональные компоненты и хуки способны решить большинство задач из коробки.

                    С помощью MobX это решается намного быстрее, проще, приятнее, гибче и красивее, про оптимизацию производительности из коробки я вообще молчу)


    1. c_kotik
      11.08.2021 09:38
      +2

      Да, да, ещё эпоха "похорон пхп" никак не завершится, а тут убийца JS-Фреймворков нарисовался. Никогда такого не было и вот опять!


      1. js_n00b
        11.08.2021 10:37

        Я не говорил, что он "убьет" всех других. Не надо передёргивать. Просто выйдет на первое место по использованию.

        Представьте, что теперь библиотеки компонентов можно писать на Vue, а использовать везде. Естественно, выгоднее писать их сразу для всех фреймворков и библиотек, используя эту фичу.


        1. eshimischi
          11.08.2021 10:58

          На первое место он не выйдет, по известной причине.. "прохайпенный" Реакт врядли уйдет в тень и сообщество до сих пор гораздо больше чем у всех остальных


          1. js_n00b
            11.08.2021 12:14
            +1

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


            1. eshimischi
              11.08.2021 12:16

              Фанаты Реакта тут поспорят, я кстати категорически не фанат этой библиотеки, никогда не был и не стану.


              1. js_n00b
                11.08.2021 12:22

                Конечно можно поспорить. Но интересно, что раньше Реакт был законодателем мод, и Вью равнялся на него, внедряя похожие фичи. Сейчас же Вью первый начинает применять новые возможности браузеров, такие как css-переменные и веб-компоненты.


                1. eshimischi
                  11.08.2021 12:29

                  Про css - переменные не согласен, это давно уже реализовано в CSS-to-JS библиотеках, например styled-components и применяется в Реакт. Про веб-компоненты, я какое то время наблюдал за Lit библиотекой, она появилась задолго до Vue 3 и изначально была создана для веб-компонентов, то есть идея сама по себе вообще не нова.


                  1. js_n00b
                    11.08.2021 12:44

                    Насколько я знаю styled-components не использует CSS переменные, а генерирует классы на основе props. Для разработчика это выглядит похоже, но под капотом совсем другая механика.


                    1. eshimischi
                      11.08.2021 12:57

                      Я привел styled-components как пример (Using Css Variables with Styled Components), есть еще emotion и много других CSS-to-JS библиотек с возможностью использования css vars. Я к тому, что это не про Vue/React как таковые..


                      1. js_n00b
                        11.08.2021 14:03

                        Значит я рано радуюсь) в любом случае, эта обнова как раз то, что мне нужно в решении моей проблемы, над которой я работаю.


                      1. eshimischi
                        11.08.2021 14:04

                        Дак вот так и надо было начинать статью ^_^ - это главное! Удачи!


                      1. js_n00b
                        11.08.2021 17:55

                        Я вот поигрался со обновой и мне очень понравилась реализация css-переменных. Они записываются в inline-стиле элемента (вроде даже если стиль не scoped) хотелось бы иметь возможность делать темы со списком переменных и расшаривать их для всего приложения. Надеюсь эту возможностьсделают в будущем


                      1. eshimischi
                        11.08.2021 17:59

                        Да пожалуйста, они ведь знают, что делают.. Меня больше впечатлил вот этот Pull Request #2345 . Занимаюсь глубоким погружением в изучение TS сейчас и работа инженеров по оптимизации кода TS и тд - всегда впечатляют, снимаю шляпу..


                      1. js_n00b
                        11.08.2021 18:23

                        Круто!


        1. justboris
          11.08.2021 13:11

          Использовать веб-компоненты как общую базу для всех фреймворков – это очень утопичная идея, в реальности не работает. Вместо использования всех возможностей Vue, вам придется искать общий знаменатель и бороться с причудами как других фреймворков, так и самих веб-компонентов. Пару лет назад я об этом написал цикл статей с детальным разбором: часть 1, часть 2 и еще один перевод на эту же тему.


        1. c_kotik
          11.08.2021 16:07

          Да не решит это весь ворох задач и требований, предъявляемых заказчиками в разной стадии упоротости и фанатизма. Никогда никаких серебряных пуль в мире фронта не было и не будет. Так что пока Vue сообщество будет рвать на элементы реакт и прочие, выйдет очередной новый фреймворк и разработчики получат очередное "свежее дыхание", пока не приестся. Вон недавно за свелт хайпили. И пока поутихли.


  1. eshimischi
    11.08.2021 10:53

    Положу здесь, очень классное интервью Evan Y


  1. Xtray
    11.08.2021 13:01
    +1

    Вышла?


    1. mariner
      11.08.2021 15:33

      Вышла библиотека Vue 3.2


      1. Xtray
        11.08.2021 16:57
        +2

        На сайте "библиотеки" большими буквами написано The Progressive JavaScript Framework.


      1. nikober
        13.08.2021 09:06

        дык Vue не библиотека)