Поговорим о Shared composables
Страшный термин, который многие понимают, как хотят.
Во
1. Composable
Это технически (
2. "Модульный реф" / Pinia store
Тоже можно считать объектом в смысле
3. Shared composable как в примерах в документации во VueUse и Vue
Рождается как
Некоторые разработчики (не будем показывать пальцем) уверены, что использование
Не обладая знаниями Мурыча, тем не менее давайте намного порассуждаем.
Вот у нас есть модульный реф с рефом. Вот он используется, потом все компоненты со ссылкой на него, уничтожаются. Что происходит? Ничего. У него нет внешних зависимостей, он просто лежит мертвым грузом в памяти, занимая свои несчастные пару килобайт. Появился использующий его компонент - он заработал.
Как с
Так для чего нужен shared composable?
Посмотрим на примеры в документациях. Мы создаем реф с отслеживанием движения мышки. А вот это уже важно - если мы в каждом требующем координаты мышки компоненте будем создавать
Таким образом,
состояние в shared composable выполняет не самостоятельную функцию, а является просто адаптером для некого внешнего сервиса / Web API.
И суть
Даже чисто логически если подумать (по описанному выше юз-кейсу в пункте 3), то
Но, опять же, если подумать, то данная логика (оптимизация работы с внешним сервисом) очень похожа на логику работы глобального лоадера. И реализована может быть так же в несколько строк, безо всяких
#composable #reactivity
Страшный термин, который многие понимают, как хотят.
Во
Vue 3
у компонента есть, по большому счету, три варианта работы с внешними реактивными данными1. Composable
Это технически (
JS closure
) и по факту (ООП
) объект с данными и поведением. Компонент его создает, пользуется, при уничтожении компонента обнуляется ссылка на объект, и он подлежит уборке Garbage Collector
-ом (GC
).2. "Модульный реф" / Pinia store
Тоже можно считать объектом в смысле
ООП
, но реализующим паттерн Singleton
. Создается при первом вызове его кем-либо, затем ссылка на него записывается в некий глобальный реестр, и любой другой компонент, обращающийся к этой структуре, получает эту ссылку и работает с тем же самым инстансом.3. Shared composable как в примерах в документации во VueUse и Vue
Рождается как
стор
, умирает как обычный composable
. При первом обращении создается один объект, который затем используется всеми компонентами, которым он нужен. Но как только не остается ни одного такого компонента, этот объект "умирает". В дальнейшем если он понадобится, он создается опять в одном экземпляре.Некоторые разработчики (не будем показывать пальцем) уверены, что использование
shared composable
именно как реактивного стейта вместо модульного рефа/стора помогает сделать программу эффективней.Не обладая знаниями Мурыча, тем не менее давайте намного порассуждаем.
Вот у нас есть модульный реф с рефом. Вот он используется, потом все компоненты со ссылкой на него, уничтожаются. Что происходит? Ничего. У него нет внешних зависимостей, он просто лежит мертвым грузом в памяти, занимая свои несчастные пару килобайт. Появился использующий его компонент - он заработал.
Как с
shared composable
? Вот он создается, используется, потом все компоненты, его использующие, кончаются - и он должен типа уничтожиться. Вызывается код по обнулению, но у Garbage Collector
-а JS VM
своя логика работы, и он не будет чистить эту память сразу. А если и будет - потратит на это ресурсы CPU
. Затем снова появляется компонент, которому нужен этот объект - и он снова создается, тратятся ресурсы CPU
, выделяется новая память. И так по кругу. В итоге, через 10 циклов у нас в куче памяти в 10 раз больше, чем нам надо, зарезервированного места, и мы потратили в десять раз больше ресурсов на создание/уничтожение структуры.Так для чего нужен shared composable?
Посмотрим на примеры в документациях. Мы создаем реф с отслеживанием движения мышки. А вот это уже важно - если мы в каждом требующем координаты мышки компоненте будем создавать
composable
с этой логикой, мы будем множить слушателей этого события, и это дорогая операция. Держать слушателя постоянно в глобальном сторе - тоже ненужная трата ресурсов.Таким образом,
состояние в shared composable выполняет не самостоятельную функцию, а является просто адаптером для некого внешнего сервиса / Web API.
И суть
shared composable
- создать единую реактивную точку доступа к внешнему сервису.Даже чисто логически если подумать (по описанному выше юз-кейсу в пункте 3), то
shared composable
не может использоваться для непосредственного обмена данными между компонентами. Он может только передавать данные во внешний сервис, и получать их оттуда. Даже vueuse/useLocalStorage
так работает. И если передача не удалась - это ошибка выполнения программы.Но, опять же, если подумать, то данная логика (оптимизация работы с внешним сервисом) очень похожа на логику работы глобального лоадера. И реализована может быть так же в несколько строк, безо всяких
effectScope
и прочих заморочек - простым и понятным кодом. Нету там ничего из Composition API
, что надобилось бы для реализации данной логики. Обычный модульный реф и синхронный код для отслеживания числа подписчиков с подключением/отключением этого рефа к внешнему сервису.Ref
, reactive
, shallowRef
, watch
и computed
должны покрывать 99.9% потребностей прикладного программирования на Vue.js
. Не надо делать простое сложным.Shared composable
как он есть - изначально неудачное название и ненужная структура. Предлагается не использовать.#composable #reactivity
Как же это близко...
Иногда хочется перед отправкой промпта встать на колени и сложить молитвенно ладони. Не потому что религия, а в качестве такого символического гагаринского "Поехали!".
Хотя... Если в
#ai
Иногда хочется перед отправкой промпта встать на колени и сложить молитвенно ладони. Не потому что религия, а в качестве такого символического гагаринского "Поехали!".
Хотя... Если в
LLM
используют квазислучайность для придания большей естественности ответам, почему бы психо-энергетически не попытаться направить ее в нужное тебе русло?#ai
Еще одно интервью Эвана о
#evanyou #video #interview
Vue
, Vite
, VoidZero
и будущем JavaScript Tooling
#evanyou #video #interview
YouTube
Evan You - Vue, Vite, VoidZero and the Future of JavaScript Tooling
This week Evan You joins us again to talk about his new company, VoidZero, and the future of JavaScript tooling. Evan build Vite and ushered in a new era of JavaScript tooling, but thinks he can do better now by building up new rust based tooling. Rolldown…
FilePond
Подсказали красивый
15K+ звезд, много плагинов,, правда, довольно увесистый - 100Кб+
На
Вот, кстати, один из вариантов использовать динамические импорты/роуты - в мобильной версии
#lib
Подсказали красивый
file uploader
компонент15K+ звезд, много плагинов,, правда, довольно увесистый - 100Кб+
На
JS
. Подключается монтированием к элементу.<script setup lang="ts">
import * as FilePond from "filepond";
import FilePondPluginFileValidateType from "filepond-plugin-file-validate-type";
import { onMounted, ref, useTemplateRef } from "vue";
import "filepond/dist/filepond.min.css";
const fileInput = useTemplateRef("fileInput");
FilePond.registerPlugin(FilePondPluginFileValidateType);
onMounted(() => {
FilePond.setOptions({
acceptedFileTypes: ["image/*", "application/pdf"],
server: "api/upload/",
});
FilePond.create(fileInput.value);
});
</script>
<template>
<div class="analysis-view">
<h2>Analysis upload</h2>
<p></p>
<input
ref="fileInput"
type="file"
class="filepond"
name="filepond"
multiple
data-allow-reorder="true"
data-max-file-size="3MB"
data-max-files="3"
/>
</div>
</template>
Вот, кстати, один из вариантов использовать динамические импорты/роуты - в мобильной версии
drag-n-drop
не нужен, поэтому можно обойтись более простым file input
и сэкономить на бандле.#lib
pqina.nl
Easy File Uploading With JavaScript | FilePond
A JavaScript library that can upload anything you throw at it, optimizes images for faster uploads, and offers a great, accessible, silky smooth user experience.
Довольно свежие
Vue 3 VS Code Snippets
#vscode #tip
Vue
сниппеты для VS Code
, среди большого количества хлама.Vue 3 VS Code Snippets
#vscode #tip
Visualstudio
Vue 3 VS Code Snippets - Visual Studio Marketplace
Extension for Visual Studio Code - Vue 3 snippets for VS Code
Как правильно?
Anonymous Poll
28%
VITE_APP_API_URL: "https://yourdomain.com/api/",
72%
VITE_APP_API_URL: "https://yourdomain.com/api",
В команде
Дело настолько деликатное, что ветку даже закрыли для просмотра посторонними.
Автоимпорты имеют существенные проблемы:
- не весь тулинг (
- код с ними выглядит гораздо менее явным, чем с обычными импортами в
- полная нечитабельность на площадках типа
#goodpractices #nuxt
Nuxt
-а при выводе Nitro
на внешний рынок внезапно осознали, что автоимпорты - плохо. И попытались их сделать опциональными. Но вход - рубль, выход - два.Дело настолько деликатное, что ветку даже закрыли для просмотра посторонними.
Автоимпорты имеют существенные проблемы:
- не весь тулинг (
IDE
, Volar
etc) их понимает, не всегда будут подсказки;- код с ними выглядит гораздо менее явным, чем с обычными импортами в
IDE
;- полная нечитабельность на площадках типа
GitHub
;#goodpractices #nuxt
GitHub
Depend less on auto imports · Issue #2232 · nitrojs/nitro
The history of auto import idea probably backs to Nuxt Components (an amazing initiative by @kevinmarrec) and then same time as Nuxt 3 development, thanks to @antfu, we adopted unimport. Auto impor...
Случайно нашел неплохой бесплатный хостинг для бэка
alwaysdata.net
До 100Mb,
Год использую - всё ровно.
#webhosting
alwaysdata.net
До 100Mb,
MySQL/PostgreSQL
с портом наружу, PHP, Python, Ruby, Node.js, Elixir, Java, Deno, .NET
, SSH
, подключение кастомного доменаГод использую - всё ровно.
#webhosting
Сегодня этому каналу 1 год.
Время вспомнить первый пост
По сей день это лучший учебник для изучения
#vuefaq #learning #architecture #book
Время вспомнить первый пост
По сей день это лучший учебник для изучения
Vue.js
на русском языке.#vuefaq #learning #architecture #book
Telegram
Vue-FAQ
📖
Закончен перевод книги "Vue.js 3 Design Patterns and Best Practices"
Лучший материал для самостоятельного изучения Vue.js
https://vue-faq.org/ru/book/
#learning #architecture #book
Закончен перевод книги "Vue.js 3 Design Patterns and Best Practices"
Лучший материал для самостоятельного изучения Vue.js
https://vue-faq.org/ru/book/
#learning #architecture #book
Для реализации своих
Их
В данном случае содержимое тултипа является ребенком элемента, на котором его надо показать. Возможны другие варианты реализации, включая кастомную директиву.
Обертывать в
#lib #tooltip #dropdown
tooltip
-ов и "выпадашек", наверное, самым оптимальный вариантом является использование современной и минималистичной библиотеки Floating UIИх
Vue
адаптер мне не подошел. Вот простой вариант своего тултипа на их чистом js
пакете.В данном случае содержимое тултипа является ребенком элемента, на котором его надо показать. Возможны другие варианты реализации, включая кастомную директиву.
Обертывать в
Tooltip
компонент то, на чем его надо показать, имхо, извращение.<script setup lang="ts">
import { computePosition, flip, offset, shift } from "@floating-ui/dom";
import { onMounted, ref, useTemplateRef } from "vue";
const popover = useTemplateRef("popover");
onMounted(() => {
popover.value.showPopover();
computePosition(popover.value.parentElement, popover.value, {
placement: "left",
middleware: [flip(), shift({ padding: 5 }), offset(10)],
}).then(({ x, y }) => {
Object.assign(popover.value.style, {
left: `${x}px`,
top: `${y}px`,
});
});
});
</script>
<template>
<div
ref="popover"
class="popover"
popover
role="tooltip"
>
<div class="tooltip-body">Hello</div>
</div>
</template>
<style scoped>
.popover {
position: fixed;
width: max-content;
top: 0;
left: 0;
margin: 0;
padding: 1em;
text-align: left;
border: 1px solid var(--bbl-c-border);
border-radius: 5px;
max-width: 400px;
box-shadow:
0 14px 44px rgba(0, 0, 0, 0.12),
0 3px 9px rgba(0, 0, 0, 0.12);
border-color: #bbb;
}
</style>
#lib #tooltip #dropdown
Floating-Ui
Floating UI - Create tooltips, popovers, dropdowns, and more
A JavaScript library to position floating elements and create interactions for them.
Что для вас TypeScript?
Anonymous Poll
29%
Язык программирования
22%
Препроцессор
3%
Библиотека
1%
Фреймворк
29%
Язык описания интерфейсов (IDL)
16%
Непонятная хрень
27%
Счастье
17%
Горе
Автор русского перевода документации
#vite #i18n
VitePress
перевел и Vite
документацию и просит сделать ревью его PR , чтобы его пропустили.#vite #i18n
GitHub
feat: add Russian translation by dragomano · Pull Request #18684 · vitejs/vite
Description
Add Russian translation for the docs site
Repository: https://github.com/dragomano/vite-docs
Preview: https://dragomano.github.io/vite-docs/
Add Russian translation for the docs site
Repository: https://github.com/dragomano/vite-docs
Preview: https://dragomano.github.io/vite-docs/
Вышел
Из примечательного - по инициативе Эвана на
Анимацию которого можно кастомизировать
Может быть быстрее вьюшного
#router #animation #css
vue-router 4.5.0
Из примечательного - по инициативе Эвана на
router-link
появился prop view-transition
, который задействует нативный View Transitions API для перехода между роутами.<template>
<RouterLink to="/some-page" view-transition>
Go to some page
</RouterLink>
</template>
Анимацию которого можно кастомизировать
CSS
стилямиМожет быть быстрее вьюшного
<Transition>
и уж точно удобней в записи (по сравнению с конструкцией с router-view
). Но не такой функциональный, для простых переходов.#router #animation #css
MDN Web Docs
View Transition API - Web APIs | MDN
The View Transition API provides a mechanism for easily creating animated transitions between different website views. This includes animating between DOM states in a single-page app (SPA), and animating the navigation between documents in a multi-page app…
Неожиданно вышел Vite 6.0
Больших и даже просто значимых изменений практически нет. Предполагается, что это последний мажорный стабильный релиз перед заносом в
#vite
Больших и даже просто значимых изменений практически нет. Предполагается, что это последний мажорный стабильный релиз перед заносом в
Vite
Rolldown
-a и прочей Voidzero
-шной машинерии.#vite
GitHub
vite/packages/vite/CHANGELOG.md at v6.0.0 · vitejs/vite
Next generation frontend tooling. It's fast! Contribute to vitejs/vite development by creating an account on GitHub.
Вышел отчет State of Frontend 2024
Кроме того, что
#stats #survey
Кроме того, что
JQuery
еще использует пятая часть опрошенных (а основная часть jq
разрабов просто игнорирует подобные опросы), особо ничего интересного#stats #survey
State of Frontend 2024
Based on surveys filled in by 6028 developers from 139 countries, the State of Frontend 2024 is supported by 23 expert commentaries about frontend trends and the future.