Vue,js Feed — Канал русскоговорящего сообщества
174 subscribers
3 photos
30 links
Канал Vue.js русскоговорящего сообщества: @vuejs_ru
Download Telegram
👩‍💻 WebStorm 2023.2 EAP #2: Volar Support for Vue

Одновременно преимущество и недостаток WebStorm - собственная реализация поддержки языков вместо использования общих LSP, в том числе для TS и Vue. Обычно это позволяло WebStorm иметь больше возможностей по поддержке кода, чем даёт общий LSP.

Но в последнее время с Vue с активно появляющимися новыми фичами это стало проблемой. Особенно с нестандартными для JS/TS возможностями, такими как макросы компиляции и другие возможности SFC setup. В результате поддержка Vue в платном WebStorm часто была хуже, чем в бесплатном VSCode с Volar. Поддержка улучшалась с каждым обновлением, но лишь догоняла Volar.

С 2023.2 EAP WebStorm внедряет поддержку Volar для связки Vue + TS 5+.
Пока фича экспериментальная, но, кажется, может решить проблему отставания WebStorm в поддержке новых фич SFC Setup и связки Vue + TS.
Надеюсь, это и не лишит WebStorm в будущем собственных уникальных фишек.

Блог JetBrains: https://blog.jetbrains.com/webstorm/2023/05/webstorm-2023-2-eap2/
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍6🎉5🔥3👏1
Vue 2.7 и Prettier 3

Если вы используете Vue 2.7 и Prettier - не спешите обновляться до Prettier 3.

При компиляции шаблона в дев режиме по умолчанию результат компиляции форматируется Prettier-ом. При этом в @vue/compiler-sfc в Vue 2.7 не указан Prettier в зависимостях, а совместимости с Prettier 3 нет.

Решения:
1. Отключить форматирование скомпилированного компонента. В параметрах loader-a укажите
options: {
prettify: false
}

2. Пока не обновляться до Prettier 3
😱7👍6🤯3😢2🤔1🙏1
Неочевидное поведение в наследовании атрибутов.

Может ли наследование атрибутов не применяться к каким-то обработчикам незадекларированных событий?

Согласно документации Vue, по умолчанию все обработчики событий компонента либо являются собственными событиями компонента (если они описаны в emits/defineEmits), либо попадают в $attrs и наследуются корневым элементом (если наследование не отключено с inheritAttrs). Но есть ли здесь не задокументированные исключения?

Да! Событие обновления параметра (update:*) не наследуется, если этот описан пропс вне зависимости от декларирования самого события.

В примере на скриншоте onUpdateBaz одновременно:
- Не считается обработчиком события Parent и попадёт в его $attrs
- Не наследуется как атрибут в Child и не будет вызыван из ребёнка

Ссылки:
- Песочника
- Пруф: runtime-core/src/componentRenderUtils.ts filterModelListeners
👍6😱4🔥2🤔1🤯1
🚀 Vue 3.4.0-alpha.1

Вышла
первая альфа Vue 3.4!

Самые интересные изменения в реактивности:

- 🏎 Упомянутое выше ускорение реактивности
- 🌼 Долгожданный once в watch. Теперь можно однократно среагировать на изменение значения без ручного вызова stop!
// before
const foo = ref(...)
const stop = watch(foo, () => {
// react
stop()
})

// After v3.4
watch(foo, () => {
// react
}, { once: true })

Также улучшили вывод ошибок компиляции шаблона в прод сборке и готовят почку для улучшения типизации в JSX.

Полный список изменений: https://github.com/vuejs/core/blob/minor/CHANGELOG.md
🔥12🎉4👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Для Vue разрабатываются новые vue-devtools, которые будут предоставлять возможности "похожие на новые Nuxt DevTools 1.0".

Источник: https://twitter.com/webfansplz/status/1726977545244152005
🔥9👍5😱2🤔1
Vue 3.4.alpha.2 + alpha.3

Вчера вышло сразу две следующие альфы Vue 3.4.

🧹 Удалён Reactivity Transform ($ref сахар), который был deprecated в Vue 3.3

🫱 Добавлена сокращённая запись директивы v-bind, когда аргумент директивы совпадает со значением (аналогично { shorthand } в JS объектах ):
<input :disabled="disabled" />
<UiInput :model-value="modelValue" />

Теперь можно записывать как

<input :disabled />
<UiInput :model-value />

PR: https://github.com/vuejs/core/pull/9451

🕰 Добавлен oldValue для computed.
Подобно watch теперь можно получить старое значение вычисляемого свойства при перевычислении.
Это позволяет, например, избежать лишнего вычисления нового значения при иммутабельных изменениях
const dataObject = computed((oldValue) => {
const newValue = computeSomeObject()
// Если объект получился с тем же значением - возвращаем старый,
// чтобы не создавать новый объект по новой ссылке
// и не триггерить реактивность лишний раз
return isEqual(newValue, oldValue) ? oldValue : newValue
})

PR: https://github.com/vuejs/core/pull/9497

👀 Улучшен DX ошибок. Теперь в ошибке в рантайме будет ссылка на страницу ошибок в документации
https://deploy-preview-2515--vuejs.netlify.app/errors/

Полный список изменений: https://github.com/vuejs/core/compare/v3.3.9...v3.4.0-alpha.3
CHANGELOG: https://github.com/vuejs/core/blob/v3.4.0-alpha.3/CHANGELOG.md
🔥15👏3😱3🎉3🤔2👍1🙏1
🚀 Vue 3.4.0-beta.1

- defineModel макрос больше не экспериментальный, а его производительность улучшена

- Появилась поддержка MathML тегов для шаблона

- Добавился тип ComponentInstance, позволяющий из типа описания компонента получить тип экземпляра компонента

- В валидатор пропсов теперь приходят значения других пропсов
color: {
type: String,
validator: (value, props) =>
props.format === 'hex'
? HEX_RE.test(value)
: RGB_RE.test(value)
},


- defineSlots теперь поддерживает keyof от generic компонентов. Это позволяет описывать тип слотов в зависимости от типа пропсов, например, для типизации универсальной таблицы
<script lang="ts" setup generic="TRow extends Record<string, unknown>">
const props = defineProps<{
rows: TRow[] // тип объекта для каждой строки - из дженерика
cols: { name: keyof TRow; label: string }[]
}>()

const slots = defineSlots<{
// Тип слота для заголовкой каждой ячейки
[K in keyof TRow as `header:${K & string}`]: (props: {
col: { name: keyof TRow; label: string }
}) => any[]
}>()
</script>


А также множество фиксов и улучшений для SSR и Suspense и других изменений.
Полный CHANGELOG: https://github.com/vuejs/core/blob/v3.4.0-beta.1/CHANGELOG.md
🔥12👍3🎉3🤯2👏1😱1
Forwarded from Denis Chernov
https://github.com/vuejs/vue/blob/main/CHANGELOG.md
Финальный релиз для Vue2 2,7,16 с грустным именем: Swan Song
В релизе нет новых фичей, лишь последний набор правки багов

А 31 декабря мы попрощаемся с официальным EOL для Vue2 (Хотя есть компания которая продолжит выпускать Security-патчи, так что все не так плохо)
Кто-то останется до конца на 2ке
Для кого-то станет мотивацией уйти на 3ку
А кто-то попращается с экосистемой Vue

Press V to pay respect
👍3
В документации Vue появился глоссарий.

Может помочь как в изучении фреймворка при работе с незнакомыми терминами, так и разработчикам говорить на одном языке при упоминании термина.

https://vuejs.org/glossary/

Спасибо @mattersj за ссылочку.
🔥83😱2👍1🤔1
🚀 Релиз Vue 3.4.0 Slam Dunk

Относительно beta и rc релизов ничего нового, так что вспомним обо всех значимых изменениях в них.

Добавления и значимые улучшения

🏎 Ускорение реактивности PR#5912, включающее в себя множество оптимизаций. Например, ранее computed не был зависимостью как самостоятельное значение, использующий его эффект зависел от его вычисления. Теперь перевычисление computed с тем же результатом не будет триггерить использующие его эффекты.

🌼 Долгожданный once в watch. Теперь можно однократно среагировать на изменение значения без ручного вызова stop!
// before
const foo = ref(...)
const stop = watch(foo, () => {
// react
stop()
})

// After v3.4
watch(foo, () => {
// react
}, { once: true })


🫱 Добавлена сокращённая запись директивы v-bind, когда аргумент директивы совпадает со значением (аналогично { shorthand } в JS объектах ):

<input :disabled="disabled" />
<UiInput :model-value="modelValue" />

Теперь можно записывать как

<input :disabled />
<UiInput :model-value />


🕰 Добавлен oldValue для computed.
Подобно watch теперь можно получить старое значение вычисляемого свойства при перевычислении.
Это позволяет, например, избежать лишнего вычисления нового значения при иммутабельных изменениях

const dataObject = computed((oldValue) => {
const newValue = computeSomeObject()
// Если объект получился с тем же значением - возвращаем старый,
// чтобы не создавать новый объект по новой ссылке
// и не триггерить реактивность лишний раз
return isEqual(newValue, oldValue) ? oldValue : newValue
})


- defineModel макрос больше не экспериментальный, а его производительность улучшена
const modelValue = defineModel()
// Заменяет (но эффективнее)
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
const modelValue = computed({
get: () => props.modelValue,
set: (value) => emit('update:modelValue', value),
})


∫ Появилась поддержка MathML тегов для шаблона

🛡 В валидатор пропсов теперь приходят значения других пропсов

color: {
type: String,
validator: (value, props) =>
props.format === 'hex'
? HEX_RE.test(value)
: RGB_RE.test(value)
},


А также улучшения для TS

Добавился тип ComponentInstance, позволяющий из типа описания компонента получить тип экземпляра компонента

defineSlots теперь поддерживает keyof от generic компонентов. Это позволяет описывать тип слотов в зависимости от типа пропсов, например, для типизации универсальной таблицы
<script lang="ts" setup generic="TRow extends Record<string, unknown>">
const props = defineProps<{
rows: TRow[] // тип объекта для каждой строки - из дженерика
cols: { name: keyof TRow; label: string }[]
}>()

const slots = defineSlots<{
// Тип слота для заголовкой каждой ячейки
[K in keyof TRow as `header:${K & string}`]: (props: {
col: { name: keyof TRow; label: string }
}) => any[]
}>()
</script>


Удалены `deprecated`:

🧹 Reactivity Transform ($ref сахар), который был deprecated в Vue 3.3. Много горячих обсуждений было о разных вариантах его внедрения.

🧹 Директива v-is, вместо которой используется специальный атрибут is

🧹 app.config.unwrapInjectedRef, который включен по умолчанию с 3.3

🧹 Старые события жизненного цикла компонента @vnodeXXX, вместо которых есть @vue:xxx

Прочее:
- Улучшение вывода ошибок компиляции шаблона в проде
- Улучшение типизации, включая JSX
- Множество багфиксов в SSR и гидратации
- Багфиксы Suspense

Подробности в блоге: https://blog.vuejs.org/posts/vue-3-4
Changelog: https://github.com/vuejs/core/blob/main/CHANGELOG.md#340-slam-dunk-2023-12-29
🔥105🎉4😱3👍2
🤕 Vue 3.4.0 вышел в релиз только 2 недели назад, но за ним уже последовало 9 патчей, а на этой неделе патчи буквально каждый день. Иногда в них откатывают изменения. Пофикшено много багов с SSR, suspense, compiler-sfc, а также несколько багов нового defineModel, новой реализации реактивности, включая производительность, и другие.

Если используете Vue 3 в проде, где критичны ошибки, или не хотите разбираться, вылезхает ли у вас ошибка из-за бага в Vue или вашего бага - возможно, стоит не обновляться на 3.4 пока он не стабилизируется, и хотя бы несколько недель не будет новых патчей и активного появления новых issue.

FULL CHANGELOG
😢5👍2😱21🤔1🤯1🤬1🥴1
Ещё одна интересная статья об опыте миграции на Vitest.
1🔥1🤔1
Vitest: 9 месяцев спустя

Напомню, мы в Авиасейлс переехали с Jest на Vitest и были (ну, я уж точно) не очень довольны результатом. Прошло 9 месяцев, вышла Vitest 1.0 (а актуальная версия уже и 1.2.1) и мы научились с ним как-то жить.

Во-первых, я оказался прав на счёт шардирования. В синтетических тестах (только vitest в пайплайне, это существенно ускоряет тесты) используя 12 тредов, тесты проходили за ~3 минуты. 4 шарда по 3 треда в каждом (с меньшим количеством тредов тесты начинали зависать) мы укладываемся в ~2 минуты. Сайд-эффект шардов — теперь у нас 4 разных отчёта, а не один единый. Неудобно. Команда Vitest открыта к blob репортерам, как в playwright. Их можно склеить после и получить единый отчёт. Осталось написать ишью и реализовать, хех.
Касательно перформанса тредов вот моё ишью — The performance of threads doesn't scale much after 8 threads.

Во-вторых, нам удалось стабилизировать тесты и избавиться от залипаний и случайных падений. С тех пор мы обновились до node v18.19.0 и vitest v1.1.3, удалили любые исключения из poolMatchGlobs и используем threads пул (стандартный и не самый быстрый).

В-третьих, нестабильность витеста породила особенный подход обновлению его самого и ноды. Мы запускаем 100+ пайплайнов по крону, смотрим fail rate и принимаем решение об обновлении или включении каких-то опций. Как я сказал выше, на v1.1.3 нам удалось добиться 100% стабильности, но вот уже с v1.2.1 (latest) один из тестов начинает отваливаться в трети случаев.

В-четвёртых, я был не особо прав, когда сравнивал типы пулов. С тех пор в витесте появился пул vmThreads, который полностью копирует подход из джеста. Он действительно быстрее (в нашем случае срезает ~30 секунд), но менее стабильный и течёт по памяти (как и джест).

В общем, кажется мы научились его готовить, но иногда процесс готовки становится, прямо скажем, неприятным.
👍1😱1
Forwarded from Vue-FAQ
Vue.js Nation конференция началась с часовой рекламы курсов и сертификаций (скоро появится по Nuxt и JS)

Затем Evan You отвечал на вопросы ведущей:

- Поддержка TypeScript во Vue 3 нормальная
- В феврале будет Vuenniversary - 10 лет Vue
- В 3.5 и 3.6 изменения будут небольшие, типа сomponent types и uuid для SSR
- Во второй половине года объявит о чем-то интересном (exciting)
- Если Signals будут стандартизованы, то Vue может использовать это
- Elk (клиент Mastodon) - пример крутого нетривиального приложения на Vue (Nuxt)
- Vue украл был вдохновлен разными моментами в Angular 1, React, Knockout, Svelte
- Options API убирать не собираются
- Evan сомневается, что React идет куда-то туда с RSC
- Объяснил, почему не рекомендуется мутировать пропс-объект (не так явно видно, кто и как его меняет)
- VitePress 1.0.0 готов, но в конце декабря они погрязли в другой работе и не релизнулись. Скоро выпустят с фанфарами.
- AI сильно фронтенд не изменит в ближайшем времени. Пока это просто помощник

#evanyou #vuejsnation
👍7😁2🤔1
Forwarded from artalog (artalar)
Зачем реатом во vue?

У нас там апдейты подъехали, стоит рассказать о мотивации.

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

- Реатом лучше позволяет описывать логику полностью отделенную от компонента, которую потом еще и легче дебажить. Проявляется это в наличии лайфсайкл хуков у каждого атома (можно инициировать ресурс на первую подписку - использование в компоненте, и уничтожить ресурс при последней отписке) и выделенной сущности “экшен”, для удобного разделения кода на логические блоки. Т.к. все эти сущности именованны (автоматически еслинтом), в последствии можно наблюдать полезные логи того что поменялось и по какой причине (уникальная фича реатома).

- За счет первого пункта реатом можно использовать как ядро микрофронтовой системы, у нас уже есть адаптеры для vue, react, solid, svelte, и в разработке адаптеры для lit и angular.

- У реатома есть очень мощные примитивы для описания асинхронной логики, собравшие все самое лучшее с rxjs, redux-saga и TanStack Query. Тут впринципе альтернатив, вроде, нет.

- У реатома одна из самых больших экосистем среди всех стейт менеджеров и, посмею сказать, самая сбалансированная. При этом, каждый пакет разрабатывается с маниакальным фокусом на бандлсайзе и перфе.

Если стало интересно, вот видосики по реатому: https://www.youtube.com/playlist?list=PLXObawgXpIfxERCN8Lqd89wdsXeUHm9XU
👍5🤔1
Forwarded from Denis Chernov
vue-vapor обзавелся своим плейграундом.

Для тех кто не знает что это:
На данный момент Vue используем механизм VDOM (виртуальный DOM), но у него есть свои недостатки: избыточность по памяти, непрямое изменение и тд
Так вот Vapor это вдохновленный Solid-ом подход к механизму рендеринга без использования VDOM. Все происходит чисто на работе реактивности и счедуллингу эффектов. Более подробно можно ознакомиться тут

Мы можем вполне оценить то что уже сделано в плейграунде:
https://vapor-repl.netlify.app

выглядит действительно многообещающе
Для того, чтобы увидеть результат работы заходим во вкладку: JS / SSR
там можно обратить внимание как меняется результат билда между vapor режимом и обыкновенным (кликаем VAPOR ON/OFF в правой части шапки плейграунда)

На что я обратил внимание:
1) более агрессивно берется все из контекста рендеринга (например, Array сейчас будет браться из _ctx.Array). В исходники не заглядывал, но возможно исправят
2) Часть функционала ожидаемо нереализована (ее можно посмотреть на чеклисте репозитория )
3) Багов хватает :D Любая попытка потестить перф выходила каким-то багом

В целом решение пока сыроватое и прям сильно его не оценить. Но первые шаги уже видны явно, а не на словах
🤔6🔥3👍21
Forwarded from Denis Chernov
Ого какая новость пролетела мимо:
Vue опять нехило импрувнули перф реактивности (в этот раз поменяли структуры данных используемые внутри системы реактивности на манер сигналов Preact)

Это дало перф:
- на ~56% уменьшено потребление памяти системой реактивности 🤯
- случай когда 1 реф вызыввает несколько эффектов (+118%-185% прирост производительности)
- чтение множества invalidated computed-ов (+176%+244% прирост производительности)

Дополнительно:
- Обнова обещает никак не афектить поведение и вся реализация прячется лишь в @vue/reactivity
- Закрывает некоторые специфичные баги/корнер-кейсы для системы реактивности
- Компьютеды стали гораздо дешевле и теперь еще более ленивые
- теперь если компьютед не имеет подписчиков на него то он сбрасывает все свои зависимости
- компьютед теперь в целом не может иметь зависимостей если от него никто не зависит
- Противный варнинг из 3.4.19 о грязных компьютедах удален!
- Обещают что сборка мусора в режиме SSR будет работать лучше (как это будет аффектить в реальности пока неизвестно)

Для любителей копаться в тонкостях:
- Больше никакого ручного счедуллинга:
- pauseScheduling, pauseTracking, resetScheduling больше недоступны (впрочем они и не были задокументированной возможностью)
- теперь зависимости в deps это не Map/Set а самостоятельная структура Dep с версионированием и на базе двусвязанного списка
- код стал читаться как-то проще :D
- еще не копался на в Dev режиме включили какой-то трекинг по типу действия сигнала и как его трекают

Обновление попало в минорную ветку, так что пока неизвестно когда оно попадет в наши приложения. Однако остается только порадоваться, как много сил было вложено в последнее время в повышение перфа во Vue за последние месяцы
👍43🔥1
Forwarded from Denis Chernov
Такс ребятушки. Новый исторический момент в мире Vue.js: Vue language tools v2

- Что это такое и как оно нас касается?
не так давно вы могли слышать о обнове Volar.js. Если нет, то не страшно. Команда Vue очень заточена под улучшения экосистемы целиком, а не только Vue-разработчиков. Поэтому Джонсон (которого вы можете знать по тем самым обновлениям с перфом реактивности во Vue3) закорешился с мейнтенейром Astro и мейнтейнером MDX. Что этих крутышей связывает? Им нужно встраивать несколько языков в рамках одного файла и поддерживать при этом высокий DX. На самом деле это задача не из простых. И во Vue это проявлялось в VSC тем, что был злополучный Takeover Mode. Это особый режим который перекрывает плагин TS и вынуждал нас включать 2 плагина и отключать родной от TS.

Конечно все это пугало новичков. Но полтора месяца назад было объявляено, что эту проблему смогли побороть в рамках Volar 2. Теперь плагин использует возможности самого lsp от TS и не требует перекрытия плагином. С этого момента я оч ждал обновы language-tools.

https://github.com/vuejs/language-tools/releases/tag/v2.0.0
И вот час назад этот релиз вышел:
БОЛЬШЕ НИКАКОГО TAKEOVER MODE

+ к этому
- мы получаем родные для TS преобразования от TS плагина
- правит множество багов связанных с интеграцией и кастомным языком для VSC
- Больше нет плагина Volar - так как это более глобальный проект о фреймворке для поддержания авторов фреймворков. Теперь плагин это "Vue - Official"
- можете смело удалять расширение "TypeScript Vue Plugin"

Как это отразится на пользователях JetBrains? Пока сказать сложно, но буквально недавно была конференция у брейнсов, где скорее всего эту тему поднимали. Очень хочется верить, что это отразится на DX в IDE у JetBrains, так как они уже почти год переехали на Vue language server

PS. Вышло всего час назад, так что вполне возможны баги :D
PPS. Багов выше крыши. Советую переждать недельку!
6👍4
Документация Vue наконец получила долгожданный обновленный перевод на русский язык, который теперь доступен по ссылке ниже, а также в шапке основной англоязычной версии в блоке переводов:

https://ru.vuejs.org/

До этого на русском языке была доступна только устаревшая документация, написанная практически сразу после первоначального релиза Vue 3, но с тех пор многое изменилось, поэтому теперь рекомендуется читать именно обновленную документацию.

Переведены все основные разделы, но в документации все еще есть ошибки и неточности, например, на странице “Component v-model” описана работа функции toValue.

Если вы встретили ошибку/опечатку/неточность, о которой еще не написано в issues - можно создать его, либо исправить самому, прислав Pull Request.

Спасибо всем, кто помогал и принимал участие в переводе!
🔥326👍4🎉3🙏1
Через пол часа начинается митап от MSK Vue.js

Смотреть онлайн трансляцию можно по ссылке: https://youtube.com/live/7SWzCjDPtoQ
🔥64🌚1