Сова пишет…
3.13K subscribers
345 photos
37 videos
5 files
417 links
Frontend Senior Fullstack Backend Lead и прочие слова.
Изучаю самые современные технологии.
Обучаю разработчиков как стать сильнее — https://frontend.vision.

По коллаборациям и сотрудничеству пишите в сообщения канала!
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Казалось бы, NPM

Но прям кривущий интерфейс
Сова пишет…
Хотелось бы написать, что я на этом остановился, но нет. Писать пачку forward в index.tsx оказалось несколько утомительно. К тому же, пришлось группировать forward по ивентам и сторам, чтобы случайно не перепутать порядок: сторы — из модели в страницу ивенты…
Продолжаю упрощать соединение модели и страницы.

Как и обещал показываю использование функции contract. Фактически функция выполняет ту же роль, что и bus описанный выше, но при этом гораздо проще и короче.

Работает так: берем всё что есть в page, фильтруем сущности эффектора и назначаем им соответствия из model.

Я пока не уверен, что лучше: брать page как основу контракта или model. На что это влияет?

Как видим на порядок применения prepend в событиях и map в сторах, а также на имена пропертей. В случае page как основы, назначаются сущности из model в имена из page.

Но если разницы в именах и типах нет, то выглядеть будет так:

contract({ page, model })
Разница в типах весьма очевидна
Код функции contract выложу позже.
А пока наглядное сравнение исходников.

Если есть предложения или критика пишите в комментариях
Attribute-Based Access Control

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

Почему не готовое решение? Большинство готовых решений монструозны и реализованы на XML.

Нам требуется простая, но в то же время мощная реализация на Kotlin и JavaScript. В идеале, чтобы можно было её визуализировать и собирать вручную.

На данный момент родился такой proof of concept. Если он пройдет battle testing, возможно выпустим в open source.
Сова пишет…
Код функции contract выложу позже. А пока наглядное сравнение исходников. Если есть предложения или критика пишите в комментариях
Типы для метода contract слегка усложнились.

Всё ради большей типобезопасности. В новом варианте появились настоящие гарантии реализации полного API страницы. В прошлой версии можно было передать любой объект без ошибок со стороны typescript.

Сейчас же корректно проверит все поля и не позволит передать больше чем нужно, при этом любые не effector сущности в API страницы будут проигнорированы.
Типы для новой реализации
👍1
Ошибка при неправильной реализации контракта
Благодаря effector-reflect мне удалось убрать из кода основного компонента страницы все useStore/useEvent.
Сова пишет…
Благодаря effector-reflect мне удалось убрать из кода основного компонента страницы все useStore/useEvent.
Что это дало?
1. Теперь при изменении любого инпута ререндерится только компонент этого инпута, а не вся страница
2. Я могу назвать каждый компонент индивидуально исходя из его назначения:
<Email placeholder />
вместо:
<Input type=“email” value={email} onChange={emailChanged} placeholder />
3. Экономится место в общей структуре страницы. Большую сложную страницу теперь гораздо проще осмотреть целиком, глаз не цепляется за “служебные” пропсы, здесь только визуальные.

“В погоне за декларативностью” мы изобрели компонент Branch, он принимает два child и if:
<Branch if={true}>
<First />
<Second />
</Branch>

Первый child рендерится если условие в if истинно, второй если ложно, но его можно не передавать.

reflect позволяет прибиндить условие к Branch сразу же, дав ему имя:
const BranchIfEmailValid = reflect({
view: Branch,
bind: {
if: every({
stores: [$isEmailValid, $error.map((err) => err === null)],
predicate: true,
}),
},
});


После того, как я описал механику работы Branch, понятна ли структура страницы и смысл всех элементов (не учитывая время на привыкание)?
Увидел, что все популярные каналы рассказывают о какой-то одной теме.
Думаю пришло время писать сюда целенаправленно, а не вкидывать всё, что приходит в голову.
Какая тема наиболее интересна большинству? Для более узкой аудитории заведу отдельный канал.
Final Results
65%
Frontend, архитектура, боль
13%
Rust, эксперименты, postgres
1%
Выкладки о личном
21%
(Оставить как есть)
This media is not supported in your browser
VIEW IN TELEGRAM
Немного боли благодаря фронтенду
Сейчас реализовал наивную версию match для effector/reflect.

Метод выбирает компонент из cases соответствующий значению в сторе source, во время рендера привязывает сторы и ивенты к нему.

Оказалось, что похожим образом можно реализовать декларативную замену useList в виде list. Это всё похоже на движение от хуков к декларативности, при этом упрощая использование связки реакт-эффектор.

В формах, которые мы сейчас пишем в Redmadrobot и готовимся анонсировать есть план по поддержке декларативного описания сложных динамических форм.
Заметил, что часто новичкам в Effector хочется понять способ мышления при построении логики.

Предлагаю накидать мне в комментарии примеры логики или небольшие кусочки кода на ридаксе, а я разберу эти примеры кода на стриме, расскажу как мыслить при проектировании.
С подкастом «Сова говорит» все очень тяжело. Мой внутренний перфекционист страдает и кричит, ведь надо сделать хорошо, да еще и объективно. Судя по последнему выпуску, хорошо у меня получается с большим трудом.

Я начинал заниматься подкастом, чтобы выкладывать свои мысли и переживания в исходном виде, но фактически начал их перерабатывать и переписывать формулировки по 10 раз.

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

https://anchor.fm/under-a-dome

Как вам такой формат?
Ну что. Давайте потестируем ваш ClubHouse