Misinin Mikhail
69 subscribers
24 photos
9 videos
21 links
Я @MihailM

Пишу.
Download Telegram
Signals в Lit.js

Не так давно узнал, что в lit/labs появились Signals, решил разобраться, смогут ли они заменить rxjs в рабочем проекте. Делюсь с вами результами эксперимента.

Как организована связь между UI и моделью сейчас?

Каждый модуль, у которого есть пользовательский интерфейс, разделяется на UI и Model. Для связи реакций взаимодействия пользователя с интерфейсом используется rxjs.

Пример: модуль состоит из кнопки-счетчика.

UI:

import { LitElement, html } from "lit";

export class MyElement extends LitElement {
counterSubject$ = null;

static properties = {
counter: { type: Number },
};

connectedCallback() {
super.connectedCallback();
this.counterSubject$.subscribe((value) => {
this.counter = value;
});
}

render() {
return html`<button>Нажали раз ${this.counter}</button> `;
}
}


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

Модель:

import { BehaviorSubject } from "rxjs";

class CounterModelRx {
counter$ = new BehaviorSubject(0);

constructor() {
const counterBtn = document.createElement("my-element");
counterBtn.counterSubject$ = this.counter$;
document.body.append(counterBtn);
counterBtn.addEventListener("click", this.clickHandler);

this.counter$.subscribe(() => {
// some logic
})
}

clickHandler = () => {
const newValue = this.counter$.getValue() + 1;
if (newValue > 2) {
// side effect
}
if (newValue > 42) {
// magic boom
}
this.counter$.next(newValue);
}
}


Видно, что с помощью "модели" можно подписаться на изменения счетчика и передать поток данных с новым значением, которое сразу отображается пользователю. Однако подход содержит избыточный код: подписки в компонентах, вызовы BehaviorSubject.

Что меня привлекло в Signals?

- Меньше кода.
- Автоматическое обновление UI без явных подписок.

Компонент кнопки, следуя рекомендациям из документации:

UI:

import { LitElement, html } from "lit";
import { SignalWatcher, signal } from "@lit-labs/signals";

export class MyElement extends SignalWatcher(LitElement) {
counter = null;

render() {
return html` <button part="button">count is ${this.counter.get()}</button> `;
}
}


Я уже почти обрадовался, что смогу избавиться от подписок на Subject'ы в ConnectionCallback'ах компонента, но смотрим дальше.

Модель:

import { signal } from "@lit-labs/signals";

class CounterModelSignal {
counter = signal(0);
constructor() {
const counterBtn = document.createElement("my-element");
counterBtn.counter = this.counter;
document.body.append(counterBtn);
counterBtn.addEventListener("click", this.clickHandler);
}
clickHandler = () => {
const newValue = this.counter.get() + 1;
if (newValue > 2) {
// side effect
}
if (newValue > 42) {
// magic boom
}
this.counter.set(newValue);
}
}


Что же меня остановило?

Пошел искать, а как же подписаться другим на изменения счетчика внутри модели. И наткнулся на Missing Features. Ожидал, что можно будет получить некоторый effect по которому запустить цепочку реакций, но это пока что не готово.

Signals выглядят интересно, но пока не подходят для сложных сценариев. Жду когда они станут частью web-платформы, подобные сценарии можно будет писать проще.
🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Погружаемся в рабочие проекты

Смена рабочего проекта - это всегда вызов, особенно когда кодовая база обширная. Недавно я сменил рабочий проект, и передо мной встала задача погрузиться в исходный код. В очередной раз мне помог инструмент dependency-cruiser. Хочу поделиться с вами опытом его использования и порекомендовать попробовать.

Для чего я его применяю:
- Понять связи между модулями внутри проекта.
- Найти потенциальные проблемы и предложить улучшения.

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

Давайте покажу самые первые шаги.

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

глобально

npm install -g dependency-cruiser


в проект

npm install --save-dev dependency-cruiser


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

Далее когда все установлено переходим к инициализации инструмента внутри проекта


npx depcruise --init


depcruise уточнит несколько вопросов, на которые нужно ответить для настройки конфигурации проекта.

Поздравляю, мы готовы к первой визуализации зависимостей!

Для простоты демонстрации и интерактивности графа я покажу вам вариант с html-файлом.

В корне проекта запускаем команду

dependency-cruise -x node_modules -T dot src | dot -T svg | depcruise-wrap-stream-in-html > dependencygraph.html


src — это директория, которая будет корнем графа визуализации

Для примера я взял классическое приложение Todo App с GitHub, чтобы не пугать вас. Но уверяю вас, если вы запустите dependency-cruiser в своих рабочих проектах, вы обязательно найдете поводы для обсуждения с коллегами. 😱

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

В разделе примеров визуализации вы найдете еще варианты. Хороший вариант документации это mermaid. Пробуйте, и по возможности делитесь вашими красивыми графами в комментариях!
👍17🔥5
Формашлёп снова в деле!

Занимаюсь редизайном одной нагруженной полями формы. Дизайнер заложил UI-паттерн, которым хочу поделиться с вами.

Мы привыкли, что при добавлении полей скролл растёт вниз, кнопка «Добавить» теряется, и мы начинаем бегать вверх-вниз по списку. В этом дизайне при переполнении контейнер растёт вверх, а кнопка добавления всегда остаётся под рукой.

Люблю верстать интерфейсы, хотя, если мы все станем vibe-кодерами — кому это вообще будет нужно?
This media is not supported in your browser
VIEW IN TELEGRAM
52🔥14👍2
Давно я сюда ничего не писал, но сегодня все-таки решился. Хочу поделиться с вами совершенно новым для себя опытом. Решил погрузиться в WebAssembly, написал простейший модуль. Модуль написан на WAT - текстовое представление wasm. Импортирует console.log из JS, складывает два числа. Каждый параметр логируется функцией из Web API. Ощущения кайф - попробовал новое и канал немного оживил. О дальнейших шагах постараюсь писать сюда.
👍9
Продолжаю тему с поделками в детский сад. Кажется прогресс есть.
9🤯1
Channel name was changed to «Misinin Mikhail»
Media is too big
VIEW IN TELEGRAM
Год приятной рутины. Спасибо Антон Канев за внимание к деталям и стабилизацию в пространстве.
👍13🔥5
Не так давно попробовал базовые инструменты проектного управления в работе.

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

На конец года мне прилетела RnD задача.
Было ни хрена не понятно, конкретики минимум, но очень интересно.

Делюсь полезным что мне помогло не провалить поставленную задачу.

1. Сформулируйте цель. Не пожалейте времени и явно напишите ее и осознайте. Мне зашла формула - «Глагол» + что конкретно нужно сделать + «Ограничения». Ограничения это сроки, содержание, стоимость, без них цель это фантазия.
2. Ответьте на вопрос «зачем». Попробуй вписать свою цель в иерархию целей твоей команды или отдела. Пойми что достижение твоей цели сделает для общих целей.
3. Разложи примерные действия которые будешь делать и какой результат ожидаешь от каждого из них. Тут туман в голове уже начнет рассеиваться
4. Напиши критерии успеха заранее. Напиши их так чтобы ты четко мог ответить сделал или нет.
👍14
Цель есть, критерии успеха есть. Что делать дальше?

Дальше переводим цель в действия.
Смотрим на критерии успеха и формируем иерархическую структуру работ (ИСР). Декомпозируем проект на понятные шаги.

ИСР отвечает на вопрос:
👉 из каких кусков состоит проект и как они связаны между собой.

Зачем это вообще нужно?

1. Проект перестаёт быть "чёрным ящиком"
Ты начинаешь "есть слона по частям" и вместо абстрактной задачи видишь набор действий.

2. Видишь зависимости между действиями
Когда мы с коллегой работали над одним ИСР (он над бэкендом, я над фронтендом), было проще понять:
• какие задачи я могу начать без него
• где мы можем работать параллельно
• в каком порядке нам вообще разумно это делать

3. Проще договариваться если ты не один
Разговоры между участниками проекта перестают быть абстрактными. Смотрите на конкретные шаги и обсуждаете конкретные действия.

Когда стало понятно, что и в каком порядке делать, расскладываем задачи на временную шкалу. Получаем грубую оценку сроково и понимание успеешь или нет.

Вот такие попытки в проектное управление. Очень приближённо, но это помогало держать задачу под контролем.
🔥7👍5
Такая только у меня и у… еще двух человек в Авито
👍64
Всем привет! Сегодня ровно год как я пришел в Avito Tech. 🎂

Работаю в команде Bricks. Если вам интересны темы BDUI и low code, то рекомендую посмотреть доклады моих коллег.

Современные подходы к управлению UI: Low Code & Backend Driven UI
От идеи до UI за 60 секунд
Beduin Flow: пишем на BDUI по-взрослому
BDUI от идеи к проду
26👍15🔥1
Это точно со мной происходит? 😀
👍3😁3
Вчера получил лимитированную футболку со снимком из Бангкока. На принте фото моего друга.
В этом городе я пока не был, но точно хочу туда попасть.

Если любите красивые снимки, подписывайтесь на канал этого красавчика.
🔥83
Я описывал проблему версионности web components в одном SPA вот тут и тут и как ее решал. Там же говорил про Proposal Scoped Custom Element Registries которому уже 7 лет.

Похоже, дело сдвинулось. Safari 26.4 объявил (Web API → Improvements to Scoped Custom Element Registries) об улучшениях поддержки этого API. Chrome поддерживает с версии 146.

Теперь можно создать изолированный реестр и привязать его к Shadow DOM. Каждый shadow root своя версия компонента, без конфликтов с глобальным window.customElements.

Круто!
1🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Такие утренние слоты сильно упрощают рабочий день 💪🏻
5🔥11
Вчера ходил на концерт группы Jane Air. 24 года этой банде.

Смотрел и думал, всем бы так гореть своим делом как эти дядьки.
1🔥5