Vue-FAQ
923 subscribers
561 photos
90 videos
556 links
Канал сайта https://vue-faq.org
Информация о Vue.js, фронтенд разработке и не только

Contacts: @RuslanMakarov
Download Telegram
Вышла бетта версия новых Vue devtools

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

Пока заметен более читабельный UI и нормальные 'Настройки'

В версии браузерного расширения нет всех заявленных фич: Inspect, Graph и других. Только базовые.

В самом проекте используют unplugin-auto-import, unplugin-vue-components и UnoCSS, что как бы, как бы, как бы... ((( 😢

<template>
<div h-full w-full of-auto px8 py6>
<IconTitle
class="mb-5 text-xl op75"
icon="i-carbon-settings-adjust"
text="DevTools Settings"
/>
<div grid="~ md:cols-[repeat(auto-fit,minmax(16rem,1fr))] gap-x-10 gap-y-3" max-w-300>
<div flex="~ col gap-2">
<h3 text-lg>
Tabs
</h3>
<template v-for="[{ name, hidden }, tabs] of categories" :key="name">
<VueCard
v-if="tabs.length" p3 flex="~ col gap-1"
:class="hidden ? 'op50 grayscale' : ''"
>


#vuedevtools
29 и 30 июня 2024 года Certificates.dev бесплатно на 48 часов откроет доступ к тренировочным материалам на соискание ученой степени Certified Vue.js Developer.

Включает в себя теорию, задачи по кодированию и пробный экзамен.

#certification
CSS3 не позволяет использовать конкатенацию при нестинге классов:

.title {
/* не работает */
&--red {
color: red;
}
}


но для любителей BEM есть обходной путь:

.title {
& [class*='--red'] {
color: red;
}
}


#css #bem
Please open Telegram to view this post
VIEW IN TELEGRAM
Новый бандлер Эвана Rolldown еще не вышел, но уже появились бандлеры на его основе - tsdown

Меж тем работа над Rolldown идет активно.
Похоже, это основной проект команды Эвана сейчас.

#rolldown
Вчера в стриме по результатам опроса State of JS 2023 Илья Климов не справился с элементарной математикой, заявив, что недовольных своим фреймворком разработчиков во Vue почти в два раза меньше, чем в React.

На самом деле, исходя из диаграммы именно пользователей, получивших негативный опыт, у Vue больше - 24% против 23.5% у React

Что довольно странно.

Чем вы недовольны, ***?

#vue #react
Легкий, стильный, чисто-vue тоастер с красивой анимацией - vue-sonner

#toast #lib
Сегодня Nuxt 2 всё

End-of-Life

#nuxt
Media is too big
VIEW IN TELEGRAM
Немного воскресной фронтедерской эстетики

#video #offtop
На прошедших выходных можно было попробовать тренировочные материалы и пробный тест на Certified Vue.js Developer.

Как сам сайт (привет, Nuxt) глючный, так и вопросы-ответы подготовлены плохо.

У составителей (Vue School, между прочим!) проблемы как с английским, так и с Vue, в результате есть такие вот некорректные вопросы, в которых надо думать не над сутью вопроса, а тем, "что хотел сказать автор". Не верится, что Эван ревьюил этот тест, как они утверждают.

Тестирование требует для прохождения современный браузер, не Firefox. В последние годы титул тормоза прогресса в вебе от IE и Safari плавно перешел именно к Firefox.

Certified Senior Vue.js Developer еще не готов. Видимо, ихние маркетологи решили сперва содрать со всех за Certified Vue.js Developer, а потом за "сеньорский" титул. Кстати, цена за первый экзамен вроде упала до $50 в большинстве стран. Разработчик Middle- его пройдет без проблем и подготовки.

В экосистеме Vue много косяков, но сертификация, наверное, самый большой.

#certification
pnpm в бета версии 9.5 добавила поддержку синхронизации версий NPM пакетов catalog для монорепозиториев.

pnpm workspaces используются для многих монорепозиториев, например, Vite, Next.js, Vue, SvelteKit

#pnpm #monorepo
Во Vue реактивными могут быть не только обычные переменные, но также ссылка на функцию, что вполне в духе JS:

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

const f = ref(() => "Hello");

const v = computed(() => {
return f.value();
});

setTimeout(() => {
f.value = () => "World";
}, 3000 );
</script>

<template>
<h1>{{ v }}</h1>
</template>


Реактивность будет не глубокой (shallow)

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

Перед заменой функции происходит изменение некоего состояния компонента/приложения. Вот на него лучше и ориентироваться.

#reactivity
О-очень интересная картинка о динамике развития различных библиотек и фреймворков со State of JS

Интерактивная версия

Хотя релевантность выборки для составления статистики под большим вопросом. Как помнится, по этим опросам неудовлетворенных пользователей Vue у них получилось больше, чем неудовлетворенных пользователей React

#js
Для любителей FSD описание проекта на Vue на нем (тудушка)

В качестве выводов - констатация факта, что по FSD все сделать нельзя, даже такой маленький проект, и надо искать компромисс между FSD методами и не FSD методами в одном проекте.

#fsd #architecture
Задача:

Есть тяжелый сайт. Надо для хорошего UX показать какой-нибудь сплэш-скрин (глобальный прелоадер) в самом начале и отключить его после загрузки всех (по возможности) ресурсов и готовности сайта

Как это сделать без JS?

Задача имеет минимум два решения - через CSS и через HTML

#challenge #css #html
По задаче выше

Сплэш-скрин (стартовая заставка) значительно улучшает UX. Во Vue он ставится в index.html и отключается в onMounted() App.vue

В рамках задачи понятно, что показать сплэш-скрин в самом начале не проблема, нужно его убрать по условию. То есть, в конце загрузки сайта должно что-то прилететь, что его закроет.

CSS

Например, прилетит стиль (или в конце html файла, или css файла)

.splash-screen {
display: none;
}


Ещё вариант подсказали в комментариях - через :has(). Возможны и другие способы.

HTML

Интересней с HTML. Для этого можно использовать Declarative Shadow DOM (часть Web Components), который позволяет строить Shadow DOM без JS. У Shadow Root есть слоты. Слот будет показывать дефолтное значение ( в нашем случае блок на весь экран с лоадером), пока не прогрузится <div slot="splash-screen">, который его затрет.

<template shadowrootmode="open">
<slot name="splash-screen">
<div class="splash-screen">Loading...</div>
</slot>
</template>

<!-- additional content -->

<div slot="splash-screen">
<div />
</div>


#challenge #css #html
Варианты определения пропсов с дефолтными значениями во Vue:

// runtime declaration:

const props = defineProps({
foo: { type: String, required: true },
bar: { Type: Number, default: 0 },
});


// type-based declaration:

const props = withDefaults(defineProps<{
foo: string
bar?: number
}>(), {
bar: 0,
});


type Variant = "default" | "primary" | "secondary"

const props = defineProps({
variant: {
type: String as PropType<Variant>,
default: <Variant> "default"
}
})
На SPA тоже можно выбивать страйки в Web Vitals

C фронтом на бесплатном (= небыстром, плохо конфигурируемом) хостинге, с бэком на другом бесплатном (= небыстром) хостинге и реальным среднего размера веб приложением.

При повторных запусках сайта он будет открываться вообще мгновенно (за счет PWA кэширования)

#spa #pwa #webvitals #ssr
Vue Language Tool структура

SVG версия

#volar