Ретроспектива Vue 3

В этом тексте вспомним, что было выходило нового во Vue 3 при минорных обновлениях.

Содержание:

Vue 3.1.0

Версия 3.1 вышла через 8 месяцев после релиза 3 версии. Посмотрим что было интересного.

Миграция Vue 2 с помощью @vue/compat

Для совместимости с Vue 2, нужно установить @vue/compat вместо vue-template-compiler.

Vue 3 больше не поддерживает IE 11

IE 11 перестал поддерживаться во Vue 3.1.

SFC online playground

Добавлена онлайн площадка SFC (playground) для отладки и теста одно файловых компонентов на vue. https://play.vuejs.org/

Experimental setup

Добавлен экспериментальный синтаксис setup, который значительно сокращает код. Пример, как было:

<script>
  import { defineComponent, ref } from 'vue';
  export default defineComponent({
    name: 'NavBar',

    setup() {
      const navbarCollapsed = ref(true);
      function toggleNavbar() {
        navbarCollapsed.value = !navbarCollapsed.value;
      }

      return { navbarCollapsed, toggleNavbar };
    }
  });
</script>

Пример, как стало:

<script setup>
  import { ref } from 'vue';
  const navbarCollapsed = ref(true);
  function toggleNavbar() {
    navbarCollapsed.value = !navbarCollapsed.value;
  }
</script>

CSS variable injection

Переменные в блоке стилях. Экспериментальная фича позволяющая добавлять переменные в блоке style. Пример:

<script setup>
  import { computed, ref } from 'vue'
  const size = ref(16);
  const fontSize = computed(() => `${size.value}px`);
</script>

<style>
  h3 {
    font-size: v-bind('fontSize')
  }
</style>

onServerPrefetch функция жизненного цикла

Для работы с SSR позволяет дождаться запроса с сервера, чтобы сделать рендер компонента. Можно вызывать несколько функций, исполнение будет параллельно. Аналогичен serverPrefetch из Vue 2.6. Пример:

<script>
  import { defineComponent, onServerPrefetch, ref } from 'vue';
  import { getArchiveUsers } from './users';
  export default defineComponent({
    name: 'Main',

    setup() {
      const archiveUsers = ref(0);
      onServerPrefetch(async () => {
        archiveUsers.value = await getArchiveUsers()
      })
      return { archiveUsers };
    }
  });
</script>

BigInt

С текущей версии можно использовать BitInt. Типизировать в props и напрямую в шаблоне, как в примере:

<template>
  <h2>{{ size + BigInt(16) }}</h2>
</template>
<script>
  import { defineComponent } from 'vue';
  export default defineComponent({
    props: {
      size: BigInt
    }
  })
</script>

Ecosystem updates

Получили обновления практически вся экосистема Vue:

  • Router v4 работает стабильно уже несколько месяцев.
  • Devtools ещё в стадии бета тестирования, но уже предлагает удобный инструмент для работы.
  • Vue cli v4 поддерживает vue 3 и скоро появится v5
  • Volar VSCode стал ещё лучше при использовании (проверка типов при компиляции и др)
  • Vue Test Utils вот-вот станет доступной и выйдет из релиза-кандидата

TypeScript support

Началась поддержка TypeScript v4+. Можно теперь писать классный код на тайпскрипте! Пример:

import { RouterView } from 'vue-router'
declare module '@vue/runtime-core' {
  interface GlobalComponents {
    RouterView
  }
}

Vue 3.2.0

Релиз версии был 5 августа 2021.

New SFC Features

Экспериментальные фичи стали стабильными:

  • <script setup> — сокращенный синтаксис;
  • <style> v-bind — переменные в стилях.

Web Components

Создание нативных custom elements, пример:

import { defineCustomElement } from 'vue'

const MyVueElement = defineCustomElement({
  // Обычные опции компонента Vue
})

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

Этот API позволяет разработчикам создавать компоненты на базе Vue в любой платформе

Performance Improvements

Значительно увеличился перфоменс:

  • ref стали читаться быстрее на 260% и записываться на 50%
  • на 40% быстрее отслеживание зависимостей
  • на 17% меньше используется оперативной памяти

Компилятор тоже получил улучшение в 200% на создание plain element VNodes и др. улучшения

Bench

Server-side Rendering

Пакет @vue/server-renderer включает сборку ES, которая стала отделена от Node.js. Это позволит использовать @vue/server-renderer в других средах.

Effect Scope API

Низкоуровневое улучшение для Computed и Watch для библиотек. Подробнее: https://vuejs.org/api/reactivity-advanced.html#effectscope

Vue 3.3.0

И основные новинки в релизе 3.3 «Rurouni Kenshin». В основном улучшения коснулись <script setup> и typescript.

Импорт типов для props

Ранее defineProps  и defineEmits не могли использовать импортируемые типы, теперь это устранили и можно сделать вот так:

<script setup lang="ts">
import type { Props } from './bar'

defineProps<Props & { extraProp?: string }>()
</script>

Использование дженериков для компонентов

Теперь в конструкции <script setup> могут приниматься параметры дженерика:

<script setup lang="ts" generic="T">
defineProps<{
  items: T[]
  selected: T
}>()
</script>

Более удобный defineEmits

Раньше синтаксис defineEmits был такой:

const emit = defineEmits<{
  (e: 'bar', id: number): void
  (e: 'foo', name: string, ...rest: any[]): void
}>()

Теперь существует более короткий вызов:

const emit = defineEmits<{
  bar: [id: number]
  foo: [name: string, ...rest: any[]]
}>()

Типизация слотов в defineSlots

defineSlots можно теперь использовать при объявлении ожидаемых слотов:

<script setup lang="ts">
defineSlots<{
  default?: (props: { msg: string }) => any
  item?: (props: { id: string }) => any
}>()
</script>

Деструктуризация props

Экспериментальная фича — деструктуризация пропсов с сохранением реактивности:

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

const { msg = 'hello' } = defineProps(['msg'])

watchEffect(() => {
  console.log(`msg is: ${msg}`)
})
</script>

<template>{{ msg }}</template>

defineModel

Экспериментальная фича — уменьшить код при двустороннем связывании. Ранее пробрасываемый пропс надо было эмитом отправить обратно , сейчас возможно сделать так:

<script setup>
const modelValue = defineModel()
</script>

<template>
  <input v-model="modelValue" />
</template>

defineModel автоматически регистрирует пропс и возвращает ref.

Читайте также
Dev новости: Реакции разработчиков на изменения в React 19 и Рост популярности векторных БД
Dev новости: Реакции разработчиков на изменения в React 19 и Рост популярности векторных БД
Dev новости: Реакции разработчиков на изменения в React 19 и Рост популярности векторных БД

На прошлой неделе разработчики React столкнулись с потенциальной проблемой, связанной с новым обновлением React 19, которое могло замедлить работу существующих сайтов, построенных на этой платформе. Юджи из Code Miner объяснил, что проблема связана с компонентом Suspense и его обработкой в React 19 по сравнению с React 18.

Сокращение команд Flutter, Dart и Python в Google
Сокращение команд Flutter, Dart и Python в Google
Сокращение команд Flutter, Dart и Python в Google

Большое сокращение команд по ЯП Flutter, Dart, Python.

Локальные модели для IDE JetBrains
Локальные модели для IDE JetBrains
Локальные модели для IDE JetBrains

JetBrains представляет новую функцию для дополнения кода в соей IDE, работающую на AI. Технология позволит пользоваться подсказками локально, особенно актуально для сфер с высокими рисками и требований к безопасности, такими как — финансы, здравоохранение.

JetBrains запустила Writerside для документирования
JetBrains запустила Writerside для документирования
JetBrains запустила Writerside для документирования

Проекты создаются на базе HTML-проектов, которые можно развернуть как статические веб-сайты или опубликовать как GitHub Pages, GitLab или TeamCity Cloud.