Frontend | Иван Усынин
118 subscribers
46 photos
6 videos
27 links
👨🏻‍💻 TechLead Frontend в Альфа-Банк. Запускал проекты в production до того, как это стало мейнстримом.

💡 На канале: рабочие заметки, решение возникающих проблем, полезные материалы про Frontend

Связаться: @usyninis
Download Telegram
Логирование на проекте: почему это важно для production

🟣 Отладка и решение проблем: С помощью логов можно отслеживать ошибки, исключения и другие события, которые могут помочь в диагностике и решении проблем.

🔴 Мониторинг производительности: Логирование позволяет мониторить производительность приложения, включая время ответа, использование памяти и другие метрики. Это помогает выявить области, где приложение можно оптимизировать.

🟢 Улучшение пользовательского опыта: Логирование может помочь отследить ошибки и проблемы, которые могут возникнуть у пользователей. Это позволяет разработчикам быстро реагировать на проблемы и улучшать качество приложения.

В нашем проекте мы используем библиотеку Pino на стороне nodejs приложений, она достаточно гибкая для кастомизации под требования проекта, а так же имеет высокую скорость работы. Сами логи пишутся в elastic и администрируются в kibana 👨‍💼

#js #javascript #frontend #nodejs
👍1🔥1👏1
This media is not supported in your browser
VIEW IN TELEGRAM
✔ Разработали новый компонент распознавания паспортных данных

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

Компонент независим от контекста использования, т.е его можно встроить в любую форму, где может потребоваться работа с паспортом и его данными. Для пользователя это значит, что не надо вручную вводить данные, достаточно «скормить» документ форме - и она заполнится автоматически.

👨‍💻 С точки зрения бизнес функциональности можно так же считать документ невалидным в зависимости от результатов распознования (например, плохое качество изображения).

p.s: на записи все данные вымышлены :)

#workflow@usyninis_dev #js #javascript #frontend
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Я на FrontendConf 2025

Уже совсем скоро: 21 октября выступаю на одной из крупнейших конференций для фронтенд-разработчиков в России.

✔️ Тема доклада: Микрофронтенды: упрощаем разработку через dev-окружение

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

Подробнее о докладе и самой конференции: https://frontendconf.ru/moscow/2025/abstracts/16074

#js #javascript #front #frontend #web #developer #frontendconf2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥5❤1
📢 Выступил с докладом на FrontendConf 2025

По результатам выступления было много интересных вопросов по теме, а некоторые - более глубокие, уходящие в архитектуру.

Это радует, значит тема была полезной и актуальной. 🏆

Спасибо организаторам мероприятия и каждому слушателю за внимание!

#js #javascript #front #frontend #web #developer #frontendconf2025
🔥16👍6❤2
🧑‍💻 Инкапсуляция контекста

На досуге решил поизучать как устроен Fastify - фреймворк для Node.js. Если вы еще не знакомы с ним - советую присмотреться повнимательнее: он обещает высокую производительность и гибкость благодаря минимальному оверхеду и продуманномой архитектуре.

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

🤔 Что такое инкапсуляция контекста?

Это способ организации кода таким образом, чтобы каждый хук/декоратор/плагин имел доступ лишь к нужным объектам данных, т.е. к нужному контексту (см. картинку). Это помогает избежать проблем с глобальными обработчиками, сплетением хуков/обработчиков/переменных внутри проекта. Фактически, это значит, что ваш код становится чище и проще в поддержке.

При этом, в случае необходимости, шаринг контекста легко можно реализовать через отдельную утилиту fastify-plugin - о чем описано в официциальной доке, и все это с понятными примерами. Интересный подход 🙂

Fastify документация:
https://fastify.dev/

Про инкапсуляцию:
https://fastify.dev/docs/latest/Reference/Encapsulation/

#fastify #nodejs #javascript #typescript #js #ts #frontend #webdev #context
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
React.lazy — еще один полезный сценарий 🚀

Одни из самых популярных кейсов использования React.lazy + Suspense — динамическая загрузка отдельных страниц или тяжелых библиотек:

// code splitting по роутам
const Dashboard = lazy(() => import('./Dashboard'));

<Route path="/dashboard" element={<Suspense fallback={<Loader />}><Dashboard /></Suspense>} />

// code splitting для тяжелых библиотек
const ImageEditor = lazy(() => import('./ImageEditor'));

<Suspense fallback={<Loader />}><ImageEditor /></Suspense>


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

👨‍💻 Для подобных сценариев можно собрать компонент-контейнер с Suspense+ErrorBoundary, который будет показывать процесс загрузки и отлавливать ошибки независимо от уровня вложенности remote-модулей. Итоговая структура выглядит так:

// контейнер для remote-модулей 
const ModulesContainer = ({ loadingView, errorView, children }) => (
<Suspense loadingView={loadingView}>
<ErrorBoundary errorView={errorView}>
{children}
</ErrorBoundary>
</Suspense>
);

// используем модули на любом уровне с одним лоадером:
<ModulesContainer
loadingView={<CustomLoader />}
errorView={<CustomError />}
>
<ComponentHeader>
<ComponentBody>
<RemoteModule2 value="a" />
</ComponentBody>
</ComponentHeader>
<RemoteModule1 value="b" />
</ModulesContainer>


P.S.: Не забываем логировать ошибки в ErrorBoundary! 📊

#react #microfrontends #lazy #js #javascript #typescript #frontend #фронтенд #разработка #dev #webdev #react #nodejs
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Поздравляю прекрасных дам с 8 Марта!

Пусть весна цветет не только на улице, но и в душе!

Ну а чтобы сделать такой градиент+ascii-арт или прокачать ваши cli-скрипты прикладываю набор полезных npm-пакетов, в том числе, которые использую в работе:

1. Это база - различные утилиты для цветного текста в консоли:
https://www.npmjs.com/package/chalk

2. Для написания текста через ascii символы:
https://www.npmjs.com/package/figlet

3. Для окрашивания градиентом результатов вызова в консоль:
https://www.npmjs.com/package/gradient-string

4. Обводка текста рамкой (блоком):
https://www.npmjs.com/package/boxen

5. Готовая уведомлялка в консоль про выход новой версии вашего npm-пакета:
https://www.npmjs.com/package/update-notifier

6. Готовый лоадер в консоли для ваших скриптов с поддержкой смены статусов и текста:
https://www.npmjs.com/package/ora

7. Отображение красивых шрифтов в консоли:
https://www.npmjs.com/package/cfonts

8. Готовые шаблоны для вывода уведомлений об успехе, ошибках или предупреждениях:
https://www.npmjs.com/package/cli-alerts

👨‍💻 Ну и на последок - фреймворки для интерактивного взаимодействия вашего скрипта с пользователем через консоль:
https://www.npmjs.com/package/commander
https://www.npmjs.com/package/inquirer
https://www.npmjs.com/package/@clack/core
https://www.npmjs.com/package/@oclif/core

#js #javascript #typescript #frontend #фронтенд #разработка #dev #webdev #react #nodejs
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥1
cva: когда обычного сlsx уже мало

Пока у кнопки два состояния — «обычная» и «выключенная» — легко склеить классы через clsx:
<button className={clsx("btn", isDisabled && "btn-disabled")} />

Но стоит появиться трём размерам и трём цветам, как в className начинается каша из условий. cva (class-variance-authority) помогает удобно описывать варианты стилей компонента — размеры, цвета, состояния. Внутри он использует clsx, так что это не замена, а надстройка над ним.

Основная идея

cva предлагает описать все варианты один раз и в понятном виде:
- variants — какие вообще варианты есть (размер, цвет и т.д.);
- defaultVariants — что ставить, если ничего не передали;
- compoundVariants — особые классы для конкретных сочетаний;
- VariantProps — готовые типы для пропсов компонента.

В ответ получаем функцию: передали в неё варианты — получили готовую строку классов. clsx при этом никуда не делся — cva склеивает классы через него.

Пример

import { cva, type VariantProps } from "class-variance-authority";

const button = cva("btn", {
variants: {
intent: {
primary: "btn-primary",
danger: "btn-danger",
},
size: {
sm: "btn-sm",
md: "btn-md",
},
},
compoundVariants: [
{ intent: "primary", size: "sm", className: "btn-uppercase" },
],
defaultVariants: { intent: "primary", size: "md" },
});

// выводим типы из описания вариантов
type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> &
VariantProps<typeof button>;

export function Button({ intent, size, className, ...props }: ButtonProps) {
return <button className={button({ intent, size, className })} {...props} />;
}


Частые ошибки


- Тянуть cva туда, где хватает одного-двух условий, — обычный clsx проще и легче.
- Забыть про defaultVariants — и в каждом месте вызова вручную передавать одни и те же варианты.
- Продублировать описание вариантов в нескольких компонентах вместо одного общего.

Итог

clsx отвечает на вопрос «добавить ли этот класс?», а cva — «как устроены все варианты компонента?». Если условий одно-два, clsx вполне хватает. 👉 Как только появились размеры, цвета, дефолты и сочетания — используем cva.

#js #javascript #typescript #frontend #фронтенд #разработка #dev #webdev #react
🔥2