<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Все посты подряд / ReactJS / Хабр]]></title>
    <link>https://habr.com/ru/hubs/reactjs/posts/</link>
    <description><![CDATA[ReactJS – javaScript-библиотека для создания интерфейсов]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Sat, 02 May 2026 13:50:04 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    

  

  
  <item>
    <title><![CDATA[Пост @box-570 — ReactJS (+1) — 24.03.2026 15:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1014342/</guid>
    <link>https://habr.com/ru/posts/1014342/?utm_campaign=1014342&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Solid.js должен был исправить React…но доказал, что React был прав</p><p>Все ругали React за массивы зависимостей, странные хуки и непонятные стадии рендеринга. Возникало чувство, что они усложнили фронтенд и добавили в него отложенную реакцию. Команда Solid.js решила это исправить: убрать лишние рендеры и магию по капоту. Идея была проста — использовать реактивность. Solid создавался, чтобы заменить React, но когда они <a href="https://github.com/solidjs/solid/releases/tag/v2.0.0-beta.0" rel="noopener noreferrer nofollow">работали над второй версией</a>, тут они уперлись в проблему, которую невозможно решить — ассинхронность.</p><p>Представьте: одни данные загрузились, другие ещё нет. Что покажет интерфейс? Фейковый фронтенд, который обманывает пользователя. React решал это с помощью отложенного обновления. Тогда Solid решили встроить ассинхронность прямо в реактивность. Появилось управление загрузкой, ожиданием и обновлениями — реактивность как она есть. Становится понятно, что и та, и та команда приходят к одному выводу с разных сторон, но Solid делает ее частью системы, засовывает ассинхронность прямо в реактивность и внезапно оказывается, что React не был таким уж и плохим дизайном, просто команда React-а пришла к этой проблеме гораздо раньше, чем остальные.</p><p>И главный вопрос: что важнее — устоявшийся подход React или более чистая, но сложная реактивность Solid? Или дело вовсе не в фреймворке, а в том, как ты управляешь асинхронностью?</p><p><a href="https://dev.to/playfulprogramming/two-react-design-choices-developers-dont-like-but-cant-avoid-d6g" rel="noopener noreferrer nofollow">https://dev.to/playfulprogramming/two-react-design-choices-developers-dont-like-but-cant-avoid-d6g</a></p><p>Подписывайтесь:  <a href="https://www.youtube.com/@atamrazov" rel="noopener noreferrer nofollow">YouTube</a> | <a href="https://vkvideo.ru/@club229100280" rel="noopener noreferrer nofollow">VK</a> | <a href="https://x.com/TamrazovAlex" rel="noopener noreferrer nofollow">Twitter</a></p> <a href="https://habr.com/ru/posts/1014342/?utm_campaign=1014342&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 24 Mar 2026 12:18:38 GMT</pubDate>
    <dc:creator><![CDATA[box-570]]></dc:creator>
      
      <category><![CDATA[react.js]]></category><category><![CDATA[Solid.js]]></category><category><![CDATA[solid]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+4) — 14.03.2026 12:56]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1010168/</guid>
    <link>https://habr.com/ru/posts/1010168/?utm_campaign=1010168&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://tui.studio/" rel="noopener noreferrer nofollow">TUI Studio</a> (Visual Terminal UI Designer), среды для&nbsp;визуального проектирования интерфейсов пользователя, работающих в&nbsp;текстовом терминале. Среда позволяет в&nbsp;интерактивном режиме наглядно формировать интерфейс, перетаскивая готовые блоки мышью, редактируя свойства в&nbsp;визуальном режиме и предпросматривая результат на&nbsp;лету. Сформированный макет интерфейса может&nbsp;быть экспортирован для&nbsp;использования во&nbsp;фреймворках <a href="https://github.com/vadimdemedes/ink" rel="noopener noreferrer nofollow">Ink</a>, <a href="https://github.com/charmbracelet/bubbletea" rel="noopener noreferrer nofollow">BubbleTea</a>, <a href="https://github.com/chjj/blessed" rel="noopener noreferrer nofollow">Blessed</a>, <a href="https://github.com/Textualize/textual" rel="noopener noreferrer nofollow">Textual</a>, <a href="https://opentui.js.org/" rel="noopener noreferrer nofollow">OpenTUI</a> и <a href="https://github.com/rivo/tview" rel="noopener noreferrer nofollow">Tview</a>. </p><p>Решение написано на&nbsp;TypeScript с использованием <a href="https://react.dev/" rel="noopener noreferrer nofollow">React</a>, <a href="https://vite.dev/" rel="noopener noreferrer nofollow">Vite</a>, <a href="https://www.npmjs.com/package/zustand" rel="noopener noreferrer nofollow">Zustand</a>, <a href="https://tailwindcss.com/" rel="noopener noreferrer nofollow">Tailwind CSS</a> и <a href="https://lucide.dev/guide/packages/lucide-react" rel="noopener noreferrer nofollow">Lucide React</a>. Код <a href="https://github.com/jalonsogo/tui-studio" rel="noopener noreferrer nofollow">распространяется</a> под&nbsp;лицензией MIT. Из&nbsp;особенностей разработки отмечается, что&nbsp;почти весь код TUI Studio написан ИИ‑ассистентом Claude. </p><p>В&nbsp;TUI Studio предоставляется более 20&nbsp;готовых компонентов для&nbsp;формирования интерфейса (кнопки, меню, таблицы, списки, индикатор прогресса, диалоги, всплывающие подсказки и тому подобное) и поддерживается 8&nbsp;тем оформления, а&nbsp;также светлый и тёмный режим, градиентные заливки, ASCII‑цвета и акцентные цвета. Имеется возможность отката изменений. Доступен интерфейс для&nbsp;создания своих компонентов. Проекты сохраняются в&nbsp;формате JSON. </p><iframe id="69b53034aeeb010208c24f5f" src="https://embedd.srv.habr.com/iframe/69b53034aeeb010208c24f5f" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1010168/?utm_campaign=1010168&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 14 Mar 2026 09:56:01 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[TUI Studio]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @box-570 — ReactJS (+1) — 02.02.2026 16:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/991882/</guid>
    <link>https://habr.com/ru/posts/991882/?utm_campaign=991882&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Несколько важных новостей</p><p>👀  THE MAIN THING!</p><p><strong>Gemini в Chrome.</strong><br> Google официально встроил Gemini прямо в браузер. Пару дней назад Firefox обьявила о том, что приостанавливает создание AI-браузера из-за недовольства пользователей. Google решила сделать наоборот и начинает <a href="https://blog.google/products-and-platforms/products/chrome/gemini-3-auto-browse/" rel="noopener noreferrer nofollow">Новую эру браузеров</a>".</p><p>Вот несколько фичей которые они представили:</p><ol><li><p>Постоянная боковая панель, которая видит все ваши открытые вкладки(максимально 112) и может отвечать по конкретной странице. Звучит на самом деле неплохо, так как меньше нужно будет думать и переключаться, однако есть вопросы с безопасностью. Для серфинга в интернете я думаю всем очень понравится.</p></li><li><p>Автоматический просмотр. Агент сам будет смотреть ваши вкладки, формы, инфу и будет реализовывать сложные цепочки шагов покупок или заполнения форм регистрации или чего-то еще за вас. Звучит немного фантазийно и сложно, но может в будущем так и будет.</p></li><li><p>Встроенный Nano Banana. Редактирование и создание изображений прямо в браузере без надобности их сохранять и запускать в Paint.</p></li></ol><p>В целом, шаг в сторону умных браузеров многие предсказывали, но не было понятно как они будут менять на подход к работе в браузере. Одно понятно точно, скоро и разработчикам нужно будет менять свои приложения, верстку, роутинг, стейт-менеджмент, SEO и т.д. Нужно будет менять информационную архитектуру приложений. Об этом еще много напушут...</p><p>😍  ЕЩЕ НЕМНОГО ИНТЕРЕСНОГО</p><p><a href="https://bun.com/blog/bun-v1.3.7" rel="noopener noreferrer nofollow">Bun ускоряет async/await на 35%.</a><br> Bun v1.3.7 обновил JavaScriptCore и дал реальный прирост производительности для async/await операций. Для фронтенд-команд это означает более быстрые билды и CI/CD пайплайны, особенно если вы используете Bun для сборки Next.js или других фреймворков.</p><p><a href="https://yarn6.netlify.app/blog/2026-01-28-yarn-6-preview/" rel="noopener noreferrer nofollow">Yarn 6 переписывают на Rust.</a><br> Yarn делает логичный ход: порт в Rust с фокусом на производительность. Если это действительно ускорит установку зависимостей, это сэкономит часы времени разработчиков в неделю, особенно в больших монорепозиториях. Но скорее всего, они просто не смогли победить pnpm, и решили добиться ускорения засчет нативности Rust. 💪</p><p><a href="https://wso2.com/library/blogs/goodbye-java-hello-go" rel="noopener noreferrer nofollow">WSO2 публично прощается с Java, переходит на Go.</a><br> Enterprise-компания, которая 20 лет строила middleware на Java, теперь говорит: "Java — не язык будущего для нашей инфраструктуры". Для фронтенд-команд это важно, потому что переход backend на Go означает более быстрые BFF и API, что напрямую влияет на UX наших приложений.</p><p><a href="https://dev.to/this-is-learning/javascript-frameworks-heading-into-2026-2hel" rel="noopener noreferrer nofollow">Ryan Carniato выпустил обзор JavaScript-фреймворков на 2026 год.</a><br> Автор SolidJS делает традиционный "большой обзор" ландшафта фреймворков. Полезен не из-за "кто победит", а из-за того, как он раскладывает тенденции по направлениям — это помогает планировать, какие технологии изучать команде.</p><p><a href="https://blog.cloudflare.com/vertical-microfrontends/" rel="noopener noreferrer nofollow">Cloudflare делает microfrontends частью своей платформы.</a><br> Ещё один шаг к тому, чтобы "фронтенд как монолитное SPA" оставался больше в учебниках, чем в проде. Если инструменты для microfrontends становятся более доступными, это открывает возможности для разделения фронтенда на независимые части.</p><p><a href="https://t.me/PapiProIT" rel="noopener noreferrer nofollow">Мой телеграм канал</a>, все новые посты там! Подпишись!</p> <a href="https://habr.com/ru/posts/991882/?utm_campaign=991882&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Feb 2026 13:07:11 GMT</pubDate>
    <dc:creator><![CDATA[box-570]]></dc:creator>
      
      <category><![CDATA[ai]]></category><category><![CDATA[google chrome]]></category><category><![CDATA[gemini]]></category><category><![CDATA[bun]]></category><category><![CDATA[react.js]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tatapstar — JavaScript (+4) — 31.01.2026 09:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/991232/</guid>
    <link>https://habr.com/ru/posts/991232/?utm_campaign=991232&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>А как? </p><p>Как? </p><p>Реально, как? Скажите мне. Почему это происходит так.. </p> <a href="https://habr.com/ru/posts/991232/?utm_campaign=991232&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 31 Jan 2026 06:54:50 GMT</pubDate>
    <dc:creator><![CDATA[tatapstar]]></dc:creator>
      
      <category><![CDATA[разработка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @VamWebStore — JavaScript (+4) — 24.01.2026 13:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/988500/</guid>
    <link>https://habr.com/ru/posts/988500/?utm_campaign=988500&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/adb/e9b/083/adbe9b08338d590134b6ba8ce5c9eb54.webp" width="1920" height="1080"></figure><p>Почему у PWA до сих пор нет полноценного «магазина приложений» — возможно ли это вообще?</p><p>Всем привет.</p><p>В течение последних месяцев, работая с PWA-приложениями, мы постоянно сталкивались с одним и тем же вопросом:</p><p>Почему в 2025 году у PWA до сих пор нет настоящего App Store?</p><p>Не просто каталога ссылок, а полноценного магазина приложений — знакомого, вызывающего доверие и понятного обычным пользователям.</p><p>При изучении существующих PWA-магазинов и каталогов обнаруживаются одни и те же повторяющиеся проблемы.</p><p>⸻</p><ol><li><p>Установка остаётся непонятной для пользователей</p></li></ol><p>Даже сегодня установка PWA вызывает затруднения у обычных пользователей.</p><p>Большинство из них не понимают:<br> •	когда приложение действительно можно установить,<br> •	почему инструкции по установке не совпадают с реальными шагами в их браузере или на устройстве.</p><p>Во многих PWA-каталогах всё ограничивается текстовой инструкцией — и на этом взаимодействие с сервисом фактически заканчивается.</p><p>⸻</p><ol start="2"><li><p>Отсутствие доверия</p></li></ol><p>Со стороны пользователя это проявляется в следующем:<br> •	нет содержательных отзывов,<br> •	отсутствует история установок,<br> •	нет ощущения личной библиотеки приложений.</p><p>Со стороны разработчиков наблюдаются крайности:<br> •	либо любой может опубликовать приложение без подтверждения права собственности,<br> •	либо проверка обязательна, но сложна и ограничена одним способом (например, через DNS-записи).</p><p>В итоге доверие не формируется ни у одной из сторон.</p><p>⸻</p><ol start="3"><li><p>Разработчики — второстепенные участники экосистемы</p></li></ol><p>Распространённые проблемы:<br> •	медленные и неудобные процессы публикации,<br> •	почти полное отсутствие автоматического заполнения данных из манифеста,<br> •	нехватка инструментов, которые были бы полезны разработчику ещё до установки приложения пользователем.</p><p>Экосистема не стимулирует разработчиков поддерживать и развивать свои PWA.</p><p>⸻</p><ol start="4"><li><p>Интерфейс не воспринимается как «нативный»</p></li></ol><p>Это тонкий, но важный момент.</p><p>Если магазин:<br> •	выглядит как обычный веб-сайт,<br> •	не вызывает ассоциаций с App Store или Google Play,</p><p>пользователи инстинктивно доверяют ему меньше — даже если сами приложения качественные.</p><p>⸻</p><p>При этом сами PWA как технология за последние годы заметно повзрослели: офлайн-режим, push-уведомления, installability, Web APIs.<br> Однако именно слой распространения и доверия остаётся самым слабым звеном.</p><p>⸻</p><p>Главный вопрос, к которому мы пришли</p><p>Возможно ли вообще создать PWA-магазин, который:<br> •	пользователи будут воспринимать как настоящий магазин приложений,<br> •	не станет источником боли для разработчиков,<br> •	сможет устойчиво развиваться, а не быть заброшенным через несколько месяцев?</p><p>Или же сама идея магазина PWA в текущей экосистеме изначально ошибочна?</p><p>Будет интересно узнать ваш опыт.</p><p>Вы публиковали PWA-приложения в существующих магазинах или каталогах?<br> Что вызывало наибольшие сложности — у разработчиков или у пользователей?</p> <a href="https://habr.com/ru/posts/988500/?utm_campaign=988500&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 24 Jan 2026 10:19:19 GMT</pubDate>
    <dc:creator><![CDATA[VamWebStore]]></dc:creator>
      
      <category><![CDATA[pwa]]></category><category><![CDATA[web developement]]></category><category><![CDATA[web apps]]></category><category><![CDATA[app store]]></category><category><![CDATA[дистрибуция]]></category><category><![CDATA[прогрессивные веб-приложения]]></category><category><![CDATA[ux]]></category><category><![CDATA[store]]></category><category><![CDATA[platform]]></category><category><![CDATA[инструкции]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @winkyBrain — JavaScript (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/977964/</guid>
    <link>https://habr.com/ru/posts/977964/?utm_campaign=977964&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>React One Click Component</strong></p><p>Поделюсь самодельным расширением для VS Code, которое позволяет создавать React-компоненты в один клик.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/489/252/5e5/4892525e50c54e947416b02db3a21399.gif" alt="Демонстрация работы расширения" title="Демонстрация работы расширения" width="1196" height="547"><div><figcaption>Демонстрация работы расширения</figcaption></div></figure><p>Что умеет:</p><ul><li><p>гибкое именование файлов: выбор между PascalCase, camelCase, kebab-case или snake_case для генерируемых файлов;</p></li><li><p>работа с .tsx и .jsx для файлов компонентов, а также .scss, .css, .less и .sass для стилей;</p></li><li><p>редактируемые шаблоны: настройка содержимого генерируемых файлов прямо в VS Code;</p></li><li><p>опциональное создание файлов реэкспорта и стилей.</p></li></ul><p>Более подробный readme на странице <a href="https://marketplace.visualstudio.com/items?itemName=winkyBrain.react-one-click-component" rel="noopener noreferrer nofollow">расширения</a>, ссылка на исходники там же. На мой взгляд экстешнен написан таким образом, что его довольно легко переписать для любого web-фреймворка.</p><p>На всякий случай: ни с какими внешними сервисами и нейронками расширение не взаимодействует)</p> <a href="https://habr.com/ru/posts/977964/?utm_campaign=977964&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 18 Dec 2025 07:58:05 GMT</pubDate>
    <dc:creator><![CDATA[winkyBrain]]></dc:creator>
      
      <category><![CDATA[React]]></category><category><![CDATA[vscode]]></category><category><![CDATA[vscode extension]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Post @aymericzip — JavaScript (+2) — 23.11.2025 15:33]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/969342/</guid>
    <link>https://habr.com/ru/posts/969342/?utm_campaign=969342&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я часто вижу, как разработчики испытывают трудности с i18next. И действительно, это технология интернационализации, которую нелегко освоить.</p><p>Несмотря на это, i18next остаётся решением по умолчанию, которое ChatGPT рекомендует для внедрения i18n. Мы слишком часто попадаемся на удочку страниц «Get Started» (да, оно работает, но действительно ли это сделано правильно?).</p><p>На практике я замечаю, что многие проекты пропускают самые критичные аспекты интернационализации, особенно связанные с SEO: перевод метаданных, теги hreflang, локализация ссылок, настройка sitemap и robots.txt.</p><p>Что ещё хуже, почти половина проектов, использующих i18next (особенно после роста популярности ИИ), не структурируют контент по неймспейсам или же загружают все неймспейсы при каждом запросе.</p><p>Последствия? Вы можете заставлять каждого пользователя загружать контент всех страниц на всех языках, даже если он посещает только одну страницу. Например: при 10 страницах и 10 языках 99% загружаемого контента никогда не будет использовано. Совет: используйте анализатор бандла, чтобы выявить это.</p><p>Чтобы решить проблему, я подготовил руководство о том, как правильно интернационализировать приложение Next.js 16 с i18next в 2025 году.</p><p>Вот ссылка: <a href="https://intlayer.org/ru/blog/nextjs-internationalization-using-next-i18next" rel="noopener noreferrer nofollow">https://intlayer.org/ru/blog/nextjs-internationalization-using-next-i18next</a></p> <a href="https://habr.com/ru/posts/969342/?utm_campaign=969342&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 23 Nov 2025 12:33:59 GMT</pubDate>
    <dc:creator><![CDATA[aymericzip]]></dc:creator>
      
      <category><![CDATA[i18n]]></category><category><![CDATA[i18next]]></category><category><![CDATA[bundle]]></category><category><![CDATA[seo]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Luxms — Блог компании Luxms BI (+4) — 20.10.2025 10:12]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/luxms_bi/posts/958144/</guid>
    <link>https://habr.com/ru/companies/luxms_bi/posts/958144/?utm_campaign=958144&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Новое видео <a href="https://luxmsbi.ru/news/analitika/bolshe-chem-konferentsiya-nastoyashchaya-premera/" rel="noopener noreferrer nofollow">с нашей Конференции Luxms</a>, теперь с технологической сессии. Илья Гурешидзе <a class="mention" href="/users/ilyagureshidze">@IlyaGureshidze</a> начальник отдела разработки Luxms BI рассказал о магии <s>вне Хогвартса</s>&nbsp;внутри движка. </p><blockquote><p>Одна из сильных сторон Luxms BI – гибкость клиентской части. Связка JSON + React дает предсказуемое поведение, быструю сборку и легкую доработку интерфейсов – без необходимости лезть в «ядро» или переписывать все с нуля.</p></blockquote><p>Для удобства разработчиков в системе есть специальный проект – bi-magic-resources (BMR). Это проект на React, где можно разрабатывать интерфейсы, хранить наработки в GIT, вести совместную разработку, кастомизировать сборку и запуск, подключать свои библиотеки и переиспользовать уже готовые компоненты заказчика. С ним удобно разрабатывать, тестировать и пробовать новый функционал, не мешая основной ветке разработки.</p><p>Подробнее на:</p><ul><li><p><a href="https://vkvideo.ru/video-226334331_456239207" rel="noopener noreferrer nofollow">VK video</a></p></li><li><p><a href="https://www.youtube.com/watch?v=ncvSb0cVBJA" rel="noopener noreferrer nofollow">Youtube</a></p></li><li><p><a href="https://rutube.ru/video/22df0492410a57f9f126033090559c5d/" rel="noopener noreferrer nofollow">Rutube</a></p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/daf/9ce/d76/daf9ced76f5248b4f76480bf98d1a911.png" width="1280" height="720"></figure> <a href="https://habr.com/ru/posts/958144/?utm_campaign=958144&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 20 Oct 2025 07:12:01 GMT</pubDate>
    <dc:creator><![CDATA[Luxms (Luxms BI)]]></dc:creator>
      
      <category><![CDATA[luxms]]></category><category><![CDATA[luxmsbi]]></category><category><![CDATA[bi]]></category><category><![CDATA[бизнес-анализ]]></category><category><![CDATA[frontend]]></category><category><![CDATA[react]]></category><category><![CDATA[импортозамещение]]></category><category><![CDATA[бизнес-аналитика]]></category><category><![CDATA[кастомизация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlfaTeam — Блог компании Альфа-Банк (+4) — 11.09.2025 16:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/alfa/posts/946102/</guid>
    <link>https://habr.com/ru/companies/alfa/posts/946102/?utm_campaign=946102&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>От TODO-листа к анимационному шедевру</strong></p><p>Начал разбираться с Motion для React, но оказалось, что свежих обзорных статей почти нет? В нашей статье полный обзор библиотеки Motion — идеального инструмента для создания современных UI-анимаций. Внутри:</p><ul><li><p>Разбор ключевых motion-компонентов.</p></li><li><p>Практические примеры кода с плавной анимацией TODO-листа.</p></li><li><p>Как настроить анимации появления, исчезновения и перетаскивания элементов.</p></li><li><p>Советы по оптимизации с LazyMotion и управлению анимациями через хуки.</p></li><li><p>Интересные лайфхаки для создания интерактивных интерфейсов без потери производительности.</p></li></ul><a href="https://habr.com/ru/companies/alfa/articles/942624/" target="_blank" rel="noopener noreferrer nofollow" class="embed_link embed_layout-right"><div class="embed__thumb" style="background-image: url(&quot;https://habrastorage.org/getpro/habr/upload_files/924/a9b/d65/924a9bd65f13c64014c6a1dfa041e992.jpg&quot;);"></div><div class="embed__caption"><div class="embed__caption-title"><span>Прочитал документацию и подготовил обзор библиотеки Motion для React и её возможностей</span></div><div class="embed__caption-description">Что представляет из себя данная статья? Когда я начал разбираться с Motion для React, то оказалось, ...</div><span class="embed__caption-host">habr.com</span></div></a><p>В статье <a href="https://habr.com/ru/companies/alfa/articles/942624/" rel="noopener noreferrer nofollow">«Попробовал библиотеку Motion в React: делюсь обзором»</a> есть примеры кода, GIF-анимации и описание хуков, которых, достаточно, чтобы понять Motion, и, возможно, попробовать его руками, сэкономив время на чтении документации.</p> <a href="https://habr.com/ru/posts/946102/?utm_campaign=946102&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 11 Sep 2025 13:54:24 GMT</pubDate>
    <dc:creator><![CDATA[AlfaTeam (Альфа-Банк)]]></dc:creator>
      
      <category><![CDATA[motion]]></category><category><![CDATA[react]]></category><category><![CDATA[библиотека motion]]></category><category><![CDATA[motion.dev]]></category><category><![CDATA[анимации]]></category><category><![CDATA[motion for react]]></category><category><![CDATA[animation react]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — ReactJS (+4) — 28.08.2025 08:49]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/941494/</guid>
    <link>https://habr.com/ru/posts/941494/?utm_campaign=941494&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Репозиторий <a href="https://github.com/DavidHDev/react-bits" rel="noopener noreferrer nofollow">react-bits</a> содержит тысячи анимированных компонентов на React для создания веб-проектов и интерфейсов, а также&nbsp;большое количество элементов —&nbsp;кнопки, карточки, меню, необычные курсоры, анимированные списки и декоративные фишки. Каждый из компонентов можно протестировать в браузере —&nbsp;проверить работу и то, как он будет смотреться в вебе. Элементы интегрируются в проект за один клик. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/23a/56e/7da/23a56e7da342b7c929831ff23f389632.png" width="771" height="831"></figure> <a href="https://habr.com/ru/posts/941494/?utm_campaign=941494&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 28 Aug 2025 05:49:27 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[react-bits]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nihil-pro — JavaScript (+2) — 23.08.2025 10:44]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/940004/</guid>
    <link>https://habr.com/ru/posts/940004/?utm_campaign=940004&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<iframe id="68a96f9f3ee88c0a928fa7cb" src="https://embedd.srv.habr.com/iframe/68a96f9f3ee88c0a928fa7cb" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Переписываем примеры из популярных стейт-менеджеров на <a href="https://observable.ru/" rel="noopener noreferrer nofollow">kr-observable</a> используя только две функции.</p> <a href="https://habr.com/ru/posts/940004/?utm_campaign=940004&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 23 Aug 2025 07:44:20 GMT</pubDate>
    <dc:creator><![CDATA[nihil-pro]]></dc:creator>
      
      <category><![CDATA[реактивность]]></category><category><![CDATA[реактивное программирование]]></category><category><![CDATA[стейт менеджер]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IT-VAVILON — ReactJS (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/935734/</guid>
    <link>https://habr.com/ru/posts/935734/?utm_campaign=935734&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>7 полезных плагинов для фронтенд-разработки в VS Code!</strong></p><p>Сегодня хочу поделиться с вами списком полезных плагинов для Visual Studio Code, которые упростят вашу работу и повысят производительность.</p><ol><li><p><strong>ESLint </strong>— находит ошибки и баги в JS/TS коде. Незаменим для профессиональной разработки. 🛠</p></li><li><p><strong>Prettier </strong>— автоматически форматирует код по стандартам. Никаких споров о стилях! 📊</p></li><li><p><strong>Code Spell Checker</strong> — ищет опечатки в коде и комментариях. Больше никаких ошибок из-за опечаток! Для русского языка нужно установить дополнительный плагин <strong>Russian - Code Spell Checker</strong> 🔍</p></li><li><p><strong>DotENV </strong>— подсветка синтаксиса для .env файлов. Переменные окружения больше не путаются! 📦</p></li><li><p><strong>GitLens </strong>— показывает, кто и когда менял каждую строку кода. Незаменим для работы в команде.</p></li><li><p><strong>NPM outdated</strong> — показывает устаревшие зависимости в проекте. Не пропустите важные обновления! ⏳</p></li><li><p><strong>SonarQube </strong>— анализирует качество кода, ищет уязвимости. 🔐</p></li></ol><p>Установите эти плагины и сделайте свою работу ещё эффективнее! 💻</p> <a href="https://habr.com/ru/posts/935734/?utm_campaign=935734&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 20 Aug 2025 06:30:36 GMT</pubDate>
    <dc:creator><![CDATA[IT-VAVILON]]></dc:creator>
      
      <category><![CDATA[vs code]]></category><category><![CDATA[vs code плагины фронтенд]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @SergioShpadi — ReactJS (+3) — 18.08.2025 11:13]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/938124/</guid>
    <link>https://habr.com/ru/posts/938124/?utm_campaign=938124&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Жёсткая структура React-компонентов</strong></p><p>При работе над React-приложениями я часто сталкиваюсь с тем, что мои коллеги смешивают в одном файле и JSX, и CSS-in-JS стили, и логику, и типы компонента. Работать с таким месивом очень сложно. Даже если настаивать на выделении логики, стилей и типов в отдельные файлы, это то делается, то нет. Для введения жёсткой структуры компонентов мною была написана простейшая библиотека react-component-structure. <br><br><a href="https://github.com/sergeyshpadyrev/react-component-structure" rel="noopener noreferrer nofollow">https://github.com/sergeyshpadyrev/react-component-structure</a><br><br>Работает она простейшим образом. Любой компонент необходимо разделить на три хука и файл с типами:</p><pre><code>-| Component
    -| index.ts
    -| logic.ts
    -| render.tsx
    -| style.ts
    -| types.ts</code></pre><p>В файле logic.ts мы пишем хук useLogic - контроллер компонента, включающий в себя всю его бизнес-логику - все хуки useCallback, useEffect, useMemo и подобные. В этом хуке у нас есть доступ к props компонента.</p><pre><code class="typescript">import { useCallback, useState } from 'react';
import type { Props } from './types';

const useLogic = (props: Props) =&gt; {
    const [count, setCount] = useState(props.defaultCount);

    const onClickMinus = useCallback(() =&gt; setCount((c) =&gt; c - 1), []);
    const onClickPlus = useCallback(() =&gt; setCount((c) =&gt; c + 1), []);

    return {
        count,
        onClickMinus,
        onClickPlus,
    };
};

export default useLogic;</code></pre><p>В файле styles.ts мы помещаем хук useStyle со стилями нашего компонента. Тут мы можем использовать inline-стили, CSS-in-JS или Tailwind. В этом хуке у нас есть доступ к props нашего компонента и к его контроллеру.</p><pre><code class="typescript">import type { Props } from './types';
import useLogic from './logic';
import { useMemo } from 'react';

const useStyle = (props: Props, logic: ReturnType&lt;typeof useLogic&gt;) =&gt;
    useMemo(
        () =&gt; ({
            counter: {
                fontSize: logic.count + 10,
            },
            title: {
                color: props.color,
            },
        }),
        [logic.count, props.color],
    );

export default useStyle;</code></pre><p>В файле render.tsx мы помещаем хук useRender с JSX, то бишь отображение компонента. В этом хуке у нас есть доступ и к props компонента, и к его контроллеру logic, и к стилям.</p><pre><code class="typescript">import type { Props } from './types';
import type useLogic from './logic';
import type useStyle from './style';

const useRender = (props: Props, logic: ReturnType&lt;typeof useLogic&gt;, style: ReturnType&lt;typeof useStyle&gt;) =&gt; {
    return (
        &lt;div&gt;
            &lt;div style={style.title}&gt;Hello {props.greeting}!&lt;/div&gt;
            &lt;div style={style.counter}&gt;Count: {logic.count}&lt;/div&gt;
            &lt;div onClick={logic.onClickMinus}&gt;Decrease&lt;/div&gt;
            &lt;div onClick={logic.onClickPlus}&gt;Increase&lt;/div&gt;
        &lt;/div&gt;
    );
};

export default useRender;</code></pre><p>В index.ts файле мы соединяем все три хука с помощью функции createComponent:</p><pre><code class="typescript">import { createComponent } from 'react-component-structure';

import useLogic from './logic';
import useRender from './render';
import useStyle from './style';

const Component = createComponent({ useLogic, useRender, useStyle });

export default Component;</code></pre><p>И в файле types.ts мы объявляем тип для props компонента:</p><pre><code class="typescript">export interface Props {
    color: string;
    defaultCount: number;
    greeting: string;
}</code></pre><p>Если у компонента нет props, то можно объявить их так:</p><pre><code class="typescript">export type Props = unknown</code></pre><p>При использовании  каждый компонент нашего приложения имеет чёткую структуру, состоящую из файлов контроллера, отображения, стилей и типов. Это разделение подобно разделению на HTML (отображение), CSS (стили) и JavaScript (контроллер) в ванильных JS-приложениях.</p><p>Если подход и библиотека вам понравились, поставьте репозиторию звезду на гитхабе.  Надеюсь этот подход будет вам полезен.</p> <a href="https://habr.com/ru/posts/938124/?utm_campaign=938124&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 18 Aug 2025 08:13:35 GMT</pubDate>
    <dc:creator><![CDATA[SergioShpadi]]></dc:creator>
      
      <category><![CDATA[react]]></category><category><![CDATA[компоненты]]></category><category><![CDATA[структура]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IT-VAVILON — JavaScript (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/936790/</guid>
    <link>https://habr.com/ru/posts/936790/?utm_campaign=936790&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Unit-тесты во фронтенде: развеиваем мифы</strong></p><p>После статьи о навыках джуниоров многие не согласились с моей оценкой unit-тестов. Давайте посмотрим, где они действительно полезны, а где создают иллюзию ценности.</p><p>Если вы начинающий разработчик, вас наверняка убеждали:<br> «Без unit-тестов никуда! Всё должно быть покрыто тестами!»<br> Но так ли это на самом деле?</p><p><strong>Где unit-тесты полезны:</strong></p><ul><li><p>Бизнес-логика и утилиты (форматирование данных, расчёты)</p></li><li><p>Кастомные хуки (управление состоянием, формы)</p></li><li><p>Критичные функции (редкий зверь во фронтенде)</p></li></ul><p><strong>Где они бесполезны (и даже вредны):</strong></p><ul><li><p>UI-компоненты (скриншотные тесты часто ломаются из-за изменений вёрстки)</p></li><li><p>API с моками (моки не показывают реальное поведение сервера)</p></li><li><p>Тестирование библиотек (проверяете чужой код)</p></li></ul><p><strong>Что использовать вместо?</strong></p><ol><li><p>Интеграционные тесты — проверяют реальные сценарии</p></li><li><p>Zod для валидации API — предотвращает ошибки из-за неожиданных данных</p></li><li><p>Ручные проверки — быстрее и точнее, чем скриншотные тесты</p></li></ol><p><strong>Для джуниора unit-тесты — не приоритет. Важнее:</strong></p><ul><li><p>Глубокое изучение фреймворка</p></li><li><p>Умение работать с API</p></li><li><p>Навык чтения и отладки кода</p></li></ul><p><strong>Не стоит тратить время на «тесты ради тестов». Сосредоточьтесь на том, что действительно поможет в работе.</strong></p> <a href="https://habr.com/ru/posts/936790/?utm_campaign=936790&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 18 Aug 2025 05:00:18 GMT</pubDate>
    <dc:creator><![CDATA[IT-VAVILON]]></dc:creator>
      
      <category><![CDATA[unit-testing]]></category><category><![CDATA[unit test]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[тестирование веб-приложений]]></category><category><![CDATA[тестирование приложений]]></category><category><![CDATA[тестирование сайтов]]></category><category><![CDATA[frontend]]></category><category><![CDATA[front-end]]></category><category><![CDATA[front-end разработка]]></category><category><![CDATA[frontend-разработка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IT-VAVILON — Карьера в IT-индустрии (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/933500/</guid>
    <link>https://habr.com/ru/posts/933500/?utm_campaign=933500&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Чек-лист для эффективного технического интервью</strong></p><p><strong>1. Подготовка: что сделать перед собеседованием</strong></p><ul><li><p>Определите 3 главных навыка, необходимых для вакансии. Например: «Оптимизация React», «Работа с легаси-кодом (React классы)», «Работа с Redux».</p></li><li><p>Подготовьте реальные задачи из вашего проекта, а не абстрактные алгоритмы.</p></li><li><p>Четко опишите стек технологий и проблемы проекта, чтобы кандидат понимал контекст.</p></li></ul><p><strong>Пример:</strong> «У нас проект на React 16.8. Остались классовые компоненты, которые нужно переписать на хуки, и мы используем классический Redux».</p><p><strong>2. Структура собеседования</strong></p><p><strong>А. Вводная часть (5-10 минут)</strong></p><ul><li><p>Представьтесь и расскажите о проекте простым и понятным языком.</p></li><li><p>Спросите кандидата, есть ли у него опыт работы над подобными задачами.</p></li></ul><p><strong>Б. Проверка навыков (30-50 минут)</strong></p><ol><li><p><strong>Практическая задача (5-10 минут)</strong></p><ul><li><p>Дайте кандидату упрощенную версию реальной проблемы. Например: «Нужно переписать классовый компонент на хуки и подключить его к Redux, а затем оптимизировать рендер».</p></li><li><p>Позвольте кандидату воспользоваться интернетом для поиска информации. Главное, чтобы он показал процесс решения задачи, а не просто копировал ответ.</p></li></ul></li><li><p><strong>Гибкие вопросы (5-10 минут)</strong></p><ul><li><p>В процессе выполнения задачи или после ее завершения (на мой взгляд, лучше после) задавайте вопросы, которые помогут вам лучше понять подход кандидата.</p></li></ul><p><strong>Пример:</strong> «Вы использовали кеширование. Расскажите подробнее, как это поможет нашему проекту?»</p></li><li><p><strong>Финальное обсуждение задачи (10-15 минут)</strong></p><ul><li><p>Обсудите решение задачи целиком, что получилось, а что можно улучшить.</p></li></ul></li><li><p><strong>Если все навыки не уместились в одну задачу, вернитесь к шагу 1.</strong></p></li></ol><p><strong>В. Заключение (5-10 минут)</strong></p><ul><li><p>Дайте кандидату возможность задать вопросы о проекте.</p></li><li><p>Объясните, какие будут следующие шаги, чтобы не оставлять его в подвешенном состоянии.</p></li></ul><p><strong>3. Критерии оценки</strong></p><p>Оценивайте кандидата по конкретным показателям, а не по субъективным впечатлениям:</p><ol><li><p><strong>Понимание проблемы</strong> — видит ли кандидат суть задачи?</p></li><li><p><strong>Процесс решения</strong> — как ищет ответ, какие вопросы задает?</p></li><li><p><strong>Качество кода</strong> — читаемость, оптимизация.</p></li><li><p><strong>Коммуникация</strong> — может ли кандидат объяснить свои решения?</p></li></ol><p><strong>Пример оценки:</strong></p><ul><li><p>✅ «Правильно переписал с классов на хуки и подключил Redux» — отличный кандидат!</p></li><li><p>⚠️ «Правильно настроил кеширование, но забыл useCallback в одном месте» — нужно обсудить детали.</p></li><li><p>❌ «Не смог объяснить, почему компонент ререндерится» — потенциальные риски для проекта.</p></li></ul><p>Подобную сводку по собеседованию можно отправить в качестве обратной связи, чтобы кандидат получил полезные комментарии и знал, над чем ему стоит поработать.</p> <a href="https://habr.com/ru/posts/933500/?utm_campaign=933500&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 15 Aug 2025 08:00:58 GMT</pubDate>
    <dc:creator><![CDATA[IT-VAVILON]]></dc:creator>
      
      <category><![CDATA[собеседование]]></category><category><![CDATA[собеседования]]></category><category><![CDATA[как проводить собеседования]]></category><category><![CDATA[чеклист]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[фронтенд-разработка]]></category><category><![CDATA[найм разработчиков]]></category><category><![CDATA[hr]]></category><category><![CDATA[javascript]]></category><category><![CDATA[react]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Surr1os — ReactJS (+2) — 12.08.2025 12:33]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/936282/</guid>
    <link>https://habr.com/ru/posts/936282/?utm_campaign=936282&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Реакт уже никогда в жизни не догонит angular по производительности и функциональности) Рано или поздно от реакта откажутся, потому что библиотека всегда будет уступать полноценному фреймворку. Жду коммы от джунов, которые в жизни не работали с крупными проектами</p> <a href="https://habr.com/ru/posts/936282/?utm_campaign=936282&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 12 Aug 2025 09:33:08 GMT</pubDate>
    <dc:creator><![CDATA[Surr1os]]></dc:creator>
      
      <category><![CDATA[react]]></category><category><![CDATA[angular]]></category><category><![CDATA[2025]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IT-VAVILON — JavaScript (+2) — 10.08.2025 15:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/935756/</guid>
    <link>https://habr.com/ru/posts/935756/?utm_campaign=935756&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>SOLID как священная корова? 🤔</strong><br> Я думал, что пост о «фальшивых сеньорах» пройдёт спокойно — ну, очередной крик души о собеседованиях. 😅 Но нет! Хабровчане увидели слово «SOLID» и решили, что это вызов их святыне. Хотя я ничего плохого про него не сказал — просто отметил, что в React 2025 спрашивают про него по инерции. 😕</p><p><strong>Где магия, а где фарс? ✨</strong><br> Комментатор с саркастичным «быдлокод» (спасибо за реакцию, коллега!) будто подтвердил мою мысль: SOLID — это не религия, а инструмент. 🛠<br> SRP (Single Responsibility) в React — это о компонентах. Но если ваш «компонент формы» содержит логику, стили, валидацию и даже полёт на Марс, это не нарушение SOLID’а, а просто плохой код. 🌙<br> DIP (Dependency Inversion) в мире хуков и Context API чаще выглядит как «передать пропс» или «создать useClient», чем как «абстрактный фабричный фасад». 🧩<br> LSP (Liskov Substitution) в функциональном программировании? Его там просто нет. Или вы верите, что Button и IconButton должны наследоваться от AbstractClickable? 🤔</p><p>Если кандидат не может объяснить даже это, а только бормочет о «SOLID — это про ответственность» и использует ChatGPT, это не про принципы, а про некомпетентность. 🙅‍♂️</p><p><strong>Про GPT и кандидатов-попугаев 🦜</strong><br> «Чатжпт вам расскажет» — именно! Но если человек не может пересказать своими словами, он не понимает. А если не понимает, как он будет применять это на практике? 😵</p><p><strong>Вывод 📜</strong><br> SOLID — это хорошо. Плохо — догматично использовать его без понимания, где он нужен, а где создаёт лишние сложности. 🚫</p> <a href="https://habr.com/ru/posts/935756/?utm_campaign=935756&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 10 Aug 2025 12:27:25 GMT</pubDate>
    <dc:creator><![CDATA[IT-VAVILON]]></dc:creator>
      
      <category><![CDATA[собеседование]]></category><category><![CDATA[собеседования]]></category><category><![CDATA[собеседование в it]]></category><category><![CDATA[собес]]></category><category><![CDATA[solid]]></category><category><![CDATA[react]]></category><category><![CDATA[react.js]]></category><category><![CDATA[reactjs]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IT-VAVILON — ReactJS (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/933498/</guid>
    <link>https://habr.com/ru/posts/933498/?utm_campaign=933498&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>🤡 «Фальшивые сеньоры»: как меня пытались обмануть кандидаты</strong></p><p><strong>Кандидат с «идеальной памятью»</strong></p><p>Сидит передо мной разработчик. Отвечает на вопросы... странно:</p><p>Простые вещи вроде «что такое замыкание» — щёлкает как орешки.</p><p>Сложные вопросы — делает паузу на 15 секунд... и выдаёт академический ответ.</p><p>Решил проверить на практике:</p><p>✅ Теория — 10 из 10</p><p>❓ Практика — 6 из 10: простые и типовые задачи легко, рефакторинг с адской болью</p><p>❌ Объяснить, что и для чего делал — 0 из 10. Поддержать диалог, хоть как-то отойти от шаблонов — это всё не про таких кандидатов.</p><p>Напоминает студента, который выучил билеты, но не понимает предмет. Скорее всего, ему кто-то подсказывал, или он просто зазубрил типовые ответы.</p><p><strong>«SOLID? Ну это когда ответственно»</strong></p><p>Обычно я не люблю спрашивать про SOLID (кому вообще это нужно в React в 2025?). Но тут поведение кандидата было подозрительным — решил проверить.</p><p>Диалог:</p><p>— Расскажи про SOLID</p><p>— Это принцип единственной ответственности!</p><p>— Я жду продолжения</p><p>— Всё...</p><p>— Больше ничего не помнишь?</p><p>— Ну это основная часть....💥</p><p>Тут всё еще грустнее, видимо, GPT просто выкинул перед кандидатом 5 принципов без пояснения, что все 5 принципов образуют SOLID.</p><p><strong>Так к чему это я:</strong></p><p>Иногда люди кажутся хорошими специалистами, но их знания поверхностны. Они не могут объяснить свои действия, поддержать разговор или предложить что-то новое. Такие люди могут подвести в важный момент. Важно отличать настоящих профессионалов от тех, кто только красиво отвечает на вопросы, чтобы собрать сильную команду для решения сложных задач.</p> <a href="https://habr.com/ru/posts/933498/?utm_campaign=933498&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 10 Aug 2025 07:00:07 GMT</pubDate>
    <dc:creator><![CDATA[IT-VAVILON]]></dc:creator>
      
      <category><![CDATA[собеседование]]></category><category><![CDATA[собеседования]]></category><category><![CDATA[как проводить собеседования]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[hr]]></category><category><![CDATA[найм разработчиков]]></category><category><![CDATA[javascript]]></category><category><![CDATA[react]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IT-VAVILON — ReactJS (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/933496/</guid>
    <link>https://habr.com/ru/posts/933496/?utm_campaign=933496&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как провести идеально бесполезное собеседование для фронтендера!</strong></p><p>Шаг 1: Берем «элитный» шаблон Яндекс.Мультитрека.</p><p>Шаг 2: Удаляем всё ценное — оставляем только хаотичный набор вопросов.</p><p>Шаг 3: Делаем вид, что это «специально под вакансию» (спойлер: одни и те же 40 вопросов получают все — от стажера до лида).</p><p>Главные хиты программы:</p><p>— «Назови 5+ способов центрировать div» (ведь React-лид должен уметь это с закрытыми глазами). — «Расскажи про Event Loop как стихотворение» (иначе как проверить лидерские качества?). — «SOLID наизусть, включая историю создания каждого принципа». — Секретный прием: задаем общие вопросы, но с видом эксперта ждем «правильного» ответа (который знает только интервьюер).</p><p>Философский бонус: пока такие собеседования существуют, «прохождение собеседований» остаётся отдельным навыком в вакууме — где побеждает не тот, кто лучше код пишет, а тот, кто научился угадывать, что имел в виду интервьюер.</p><p>Гарантированный результат:</p><ul><li><p>Кандидат либо засыпает, либо пишет гневный пост.</p></li><li><p>Ваша компания экономит на зарплатах — никто не доходит до оффера.</p></li><li><p>Вы получаете статус «самое запоминающееся собеседование в карьере». Если узнали свою компанию — не переживайте, вы не одиноки в этом увлекательном квесте!</p></li></ul> <a href="https://habr.com/ru/posts/933496/?utm_campaign=933496&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 03 Aug 2025 08:00:34 GMT</pubDate>
    <dc:creator><![CDATA[IT-VAVILON]]></dc:creator>
      
      <category><![CDATA[собеседование]]></category><category><![CDATA[собеседования]]></category><category><![CDATA[как проводить собеседования]]></category><category><![CDATA[как не надо делать]]></category><category><![CDATA[найм разработчиков]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[hr]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @korvin89 — Блог компании Яндекс (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yandex/posts/931702/</guid>
    <link>https://habr.com/ru/companies/yandex/posts/931702/?utm_campaign=931702&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Сравнение производительности React-компонентов: Gravity UI vs другие библиотеки</strong></p><p>Я core‑разработчик <a href="https://gravity-ui.com/" rel="noopener noreferrer nofollow">Gravity UI</a>, и периодически нам в&nbsp;команду поступают вопросы про&nbsp;производительность react‑компонентов из&nbsp;нашей библиотеки <a href="https://github.com/gravity-ui/uikit" rel="noopener noreferrer nofollow">@gravity‑ui/uikit</a>. Я решил сделать небольшое исследование этого вопроса, и всё написанное ниже является отправной точкой для&nbsp;дальнейших исследований и попыткой ответа на&nbsp;вопрос «Почему Gravity тормозит?» </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/1c8/b7c/ce2/1c8b7cce207c8a7b8d2c75e8ed548cd1.png" width="1900" height="1069"></figure><p>Обычно этот запрос пишут без&nbsp;дополнительных деталей, поэтому я исхожу из&nbsp;предположения, что&nbsp;одна (но, конечно&nbsp;же, не&nbsp;единственная) из&nbsp;основных проблем производительности&nbsp;— долгое время отрисовки. В&nbsp;рамках этого исследования мы рассмотрели затраты на&nbsp;первый рендеринг отдельных компонент каждой из&nbsp;библиотек в&nbsp;изолированной среде. Для&nbsp;сравнения&nbsp;были выбраны библиотеки @adobe/react‑spectrum, @mui/material и antd.</p><p><strong>Методология исследования</strong></p><p>Технический стек:</p><ul><li><p><strong>Playwright</strong>&nbsp;— фреймворк для&nbsp;автоматизации тестирования кода в&nbsp;разных браузерах (<a href="https://playwright.dev/" rel="noopener noreferrer nofollow">подробнее</a>).</p></li><li><p><strong>PerformanceObserver API</strong>&nbsp;— браузерный API для&nbsp;измерения производительности (<a href="https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver" rel="noopener noreferrer nofollow">подробнее</a>).</p></li></ul><p>Условия выполнения тестов:</p><ul><li><p>Каждый тест запускается в&nbsp;отдельном контексте браузера.</p></li><li><p>Единовременно выполняется только один тест (настройка <code>workers </code>в&nbsp;конфиге Playwright), что&nbsp;гарантирует выделение одинакового количества ресурсов на&nbsp;каждый тест.</p></li><li><p>Каждый тест повторяется 50&nbsp;раз.</p></li><li><p>Тесты проводятся с&nbsp;разным количеством нод (10, 100, 1000).</p></li></ul><p>Порядок выполнения одного теста:</p><ol><li><p>Открытие новой страницы в&nbsp;браузере.</p></li><li><p>Инициализация <code>PerformanceObserver</code>.</p></li><li><p>Начало сбора метрик.</p></li><li><p>Рендеринг компонентов.</p></li><li><p>Завершение сбора метрик.</p></li></ol><p>Процесс измерения:</p><p>В&nbsp;начале каждого теста создаётся <code>PerformanceObserver</code>, который отслеживает события типа 'measure'. Все собранные метрики сохраняются в&nbsp;глобальном объекте <code>__PERFORMANCE_METRICS__</code>. Observer автоматически собирает данные о&nbsp;времени выполнения операций, включая название метрики, тип события, время начала и продолжительность. С&nbsp;помощью события <a href="https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry/entryType#measure" rel="noopener noreferrer nofollow">measure</a> мы логируем наше измерение <code>total‑render‑time</code>.</p><p><strong>Результаты</strong></p><p>Результаты замеров не&nbsp;содержат в&nbsp;себе абсолютных цифр. От&nbsp;окружения к&nbsp;окружению они, конечно&nbsp;же, могут варьироваться. Но&nbsp;этих цифр вполне достаточно, чтобы увидеть некоторые зависимости и сделать на&nbsp;их основании выводы:</p><ol><li><p>@gravity‑ui/uikit показывает конкурентоспособные результаты:</p><ul><li><p>В&nbsp;большинстве тестов находится в&nbsp;верхней части рейтинга.</p></li><li><p>Демонстрирует стабильное время рендеринга при&nbsp;разном количестве нод.</p></li><li><p>Особенно эффективен в&nbsp;компонентах Button, Checkbox и Switch.</p></li><li><p>Имеет проблемы со временем рендера компонента <code>TextArea</code>.</p></li></ul></li><li><p>@mui/material также показывает хорошие результаты:</p><ul><li><p>Лидирует почти во&nbsp;всех категориях (например, Text, Label) на&nbsp;небольшом количестве нод.</p></li><li><p>Имеет видимый рост времени рендера в&nbsp;зависимости от&nbsp;количества нод.</p></li></ul></li><li><p><strong>antd</strong> и <strong>React Spectrum</strong>:</p><ul><li><p>Показывают более высокое время рендеринга в&nbsp;большинстве тестов.</p></li><li><p>Имеют больший разброс между минимальным и максимальным временем.</p></li></ul></li></ol><p>С&nbsp;помощью <a href="https://github.com/korvin89/gravity-ui-perf" rel="noopener noreferrer nofollow">этого инструмента</a> можно провести замеры производительности на&nbsp;своей локальной машине, а&nbsp;также добавить тесты для&nbsp;компонентов, которых ещё нет. Нам поможет, если вы развернёте его у&nbsp;себя и <a href="https://github.com/korvin89/gravity-ui-perf/pulls" rel="noopener noreferrer nofollow">пришлёте в&nbsp;PR</a> результат работы на&nbsp;своём компьютере.</p><p>В&nbsp;этой статье я раскрыл один из&nbsp;примеров, как&nbsp;мы работаем с&nbsp;библиотекой. Но&nbsp;нам очень важна обратная связь от&nbsp;сообщества: если у&nbsp;вас есть конкретный пример, где Gravity UI показывает себя сильно хуже других библиотек, или&nbsp;если вы видите ошибку в&nbsp;нашей методологии тестирования, приходите в&nbsp;комментарии к&nbsp;этому посту или <a href="https://github.com/gravity-ui/uikit/issues" rel="noopener noreferrer nofollow">создавайте issue</a>, обсудим. А&nbsp;также не&nbsp;забывайте ставить звёздочки проекту!</p> <a href="https://habr.com/ru/posts/931702/?utm_campaign=931702&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 29 Jul 2025 08:00:47 GMT</pubDate>
    <dc:creator><![CDATA[korvin89 (Яндекс)]]></dc:creator>
      
      <category><![CDATA[яндекс]]></category><category><![CDATA[gravityui]]></category><category><![CDATA[react]]></category><category><![CDATA[performance]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @pryadkinss — Go (+3) — 12.05.2025 19:42]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/908762/</guid>
    <link>https://habr.com/ru/posts/908762/?utm_campaign=908762&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/5a6/a81/830/5a6a8183051abcede39f28eda85b1bc5.png" alt="" title="" width="1082" height="802"></figure><p>Всем привет. В свободное время создаю игру, хотел привлечь студентов для реальной практики, которую студенту без опыта получить практически нереально (опробовал на себе лет 10 назад), знал что есть такое место как GB, но и тут облом, оказывается раздел уже не актуален, где можно было бы разместить информацию о своем проекте, и привлечь молодую кровь, жаждущих практики на реальных проектах.</p><p>Но где сейчас обитает студент? Где можно рассказать о себе, и закинуть удочку для поиска интернов? Хотелось бы и собрать команду, и дать молодым специалистам возможность пополнить свое портфолио реальным кейсом. Заранее спасибо.</p> <a href="https://habr.com/ru/posts/908762/?utm_campaign=908762&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 12 May 2025 16:42:49 GMT</pubDate>
    <dc:creator><![CDATA[pryadkinss]]></dc:creator>
      
      <category><![CDATA[студенты]]></category><category><![CDATA[инди-игры]]></category><category><![CDATA[инди-разработка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Boeses_Genie — ReactJS (+2) — 29.04.2025 14:05]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/905504/</guid>
    <link>https://habr.com/ru/posts/905504/?utm_campaign=905504&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Как тестировать фронтенд?</p><p>Для меня уже нет вопроса - нужны ли тесты на фронтенде? Личный опыт подсказал, что нужны, как и согласованный цельный подход к архитектуре. Тому есть несколько причин:</p><ul><li><p>Без unit-тестов и автоматических e2e-тестов ручное тестирование занимает много времени. К тому же человек, скорее всего, при регрессионном тестировании что-то пропустит, и баги попадут в production. Особенно это актуально для больших проектов с большой кодовой базой.</p></li><li><p>Без автоматических тестов страшно рефакторить код. А если нет выстроенной архитектуры с соблюдением low coupling/high cohesion, то этот страх вполне оправдан. А без регулярного пересмотра кода приложение рано или поздно превратится в большой комок грязи.</p></li><li><p>У unit-тестов есть интересный побочный эффект. Если пользоваться подходом TDD и писать тесты сразу вместе с кодом (и даже перед написанием кода), то качество модулей и архитектуры в целом повышается. Это происходит, потому что с позиции написания теста мы думаем не только о том, как нам побыстрее завершить работу над модулем, но и о том, как этот модуль будет выглядеть снаружи, удобно ли будет его использовать внутри других модулей, так как тест в этом случае служит ещё и образцом вызывающего модуля.</p></li><li><p>Тесты - это дополнительная документация к коду. Причём такую документацию не получится держать в неактуальном состоянии, иначе упавшие тесты не пропустят код в production при наличии настроенного шлюза проверки качества в CI/CD пайплайне.</p></li></ul><p>Это всё прекрасно и, как показывает практика, работает, как ожидается, но остаются вопросы.</p><ul><li><p>Как тестировать уровень представления приложения? Например, в случае с каким-нибудь фреймворком с использованием React это будут React-компоненты, виджеты, представляющие отдельные элементы пользовательского интерфейса. Тестировать там, по сути, нужно функцию. Передали ряд аргументов (пропсов или состояний) - получили одно представление. Передали другие аргументы - другое. Зависимость результата от набора аргументов - однозначная. Чтобы это проверить, можно использовать тесты со скриншотами. Я предпочитаю snapshot-тесты, они дают больше контроля, но работают довольно медленно и могут быть хрупкими, если недостаточно грамотно отделять слой представления от логики.</p></li><li><p>А что со временем написания кода вместе с тестами? Будем ли мы вовремя успевать сдавать новые модули и радовать наших пользователей и руководство? Я думаю, что это не совсем правильные вопросы. Спрашивать надо о том, сколько будут стоить ошибки, попавшие на production из-за отсутствия тестов? Если ваше приложение - landing page с минимумом логики, то вряд ли цена ошибки будет высока. В небольшой кодовой базе её будет легко локализовать и исправить. А если вы работаете с финансами и у вас миллионы пользователей? В этом случае цена ошибки на production будет намного выше.</p></li><li><p>Как донести необходимость тестов до команды и правильно включить автоматизацию тестирования в процесс разработки? Это на самом деле серьёзный вопрос. Не все разработчики понимают, зачем вообще тесты на фронтенде и обоснование их необходимости может вылиться в не слишком продуктивный холивар. А если продавливать такое решение сверху, то без понимания и принятия командой этого решения будут попытки обойти систему и снижение мотивации. Мне когда-то в подобной ситуации помогла практика парного программирования и выстраивание инженерной культуры в команде (совместное чтение технической литературы, архитектурные встречи с использованием white board).</p></li></ul><p>А какие практики для тестирования применяете вы?</p> <a href="https://habr.com/ru/posts/905504/?utm_campaign=905504&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 29 Apr 2025 11:05:18 GMT</pubDate>
    <dc:creator><![CDATA[Boeses_Genie]]></dc:creator>
      
      <category><![CDATA[frontend]]></category><category><![CDATA[unit-testing]]></category><category><![CDATA[e2e-тесты]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @isumix — JavaScript (+3) — 20.04.2025 06:49]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/902416/</guid>
    <link>https://habr.com/ru/posts/902416/?utm_campaign=902416&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Опубликовано исследование о том что индексирование сайтов поисковиком (Google) не зависит от того, SPA ли это или же он SSR. Также пару лет назад делал аналогичное расследование и пришел к тому же выводу.</p><p>Вообще, мы пришли к идеалу достаточно давно - когда сервер занимается своими делами, а клиент статический, минифицирован, и раздается из CDN для быстроты и без траты ресурсов сервера.</p><p><a href="https://vercel.com/blog/how-google-handles-javascript-throughout-the-indexing-process" rel="noopener noreferrer nofollow">https://vercel.com/blog/how-google-handles-javascript-throughout-the-indexing-process</a></p> <a href="https://habr.com/ru/posts/902416/?utm_campaign=902416&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 20 Apr 2025 03:49:05 GMT</pubDate>
    <dc:creator><![CDATA[isumix]]></dc:creator>
      
      <category><![CDATA[ssr]]></category><category><![CDATA[csr]]></category><category><![CDATA[spa]]></category><category><![CDATA[next]]></category><category><![CDATA[nest]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Clevertec_dev — Блог компании Clevertec (+3) — 11.03.2025 10:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/clevertec/posts/889806/</guid>
    <link>https://habr.com/ru/companies/clevertec/posts/889806/?utm_campaign=889806&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Стоит ли идти во фронтенд сейчас? Честный ответ разработчика</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/935/10d/92e/93510d92e7fef603f13cb6c1f12b832b.jpg" width="1600" height="900"></figure><p><strong>Артем <a href="https://habr.com/ru/companies/clevertec/articles/889466/" rel="noopener noreferrer nofollow">несколько лет в сфере (вот его история</a>). Сейчас он разработчик в крупном финтех-проекте. Вот его мысли:</strong></p><p><em>— Да, фронтенд перенасыщен. Фреймворков много, технологии постоянно меняются. Все говорят об одном, но пишут по-разному. Но именно это и держит в тонусе — приходится регулярно обновлять знания. Сожалею ли я о своем выборе? Нет. Всегда любил погружаться в математические задачи, а фронтенд затягивает. Можно сутки биться над багом, ненавидеть его, плеваться… А потом решить — и словить кайф. В такие моменты код полностью поглощает, заставляя забыть о сне и еде.</em></p><p>Стоит ли идти во фронтенд сейчас?</p><p><em>— Никогда не поздно. Да, путь у каждого свой, и рынок сейчас нестабилен. Но при глубоком погружении за год можно набрать нужные скиллы и попасть на коммерческий проект.</em></p><p><strong>🔥 Открыт набор на&nbsp;новый марафон!</strong></p><p>Сейчас в&nbsp;Clevertec проходит марафон для&nbsp;начинающих фронтенд‑разработчиков. Это возможность погрузиться в&nbsp;профессию, получить реальный опыт и, возможно, стать частью команды. <a href="https://docs.google.com/forms/d/e/1FAIpQLSdB5vyEfdj-o6adCUgSmwdJFXxgNT_SaADrYpx6HDf34TxTQg/viewform" rel="noopener noreferrer nofollow">Участие бесплатное. Успей зарегистрироваться!</a></p> <a href="https://habr.com/ru/posts/889806/?utm_campaign=889806&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 11 Mar 2025 07:31:40 GMT</pubDate>
    <dc:creator><![CDATA[Clevertec_dev (Клевертек)]]></dc:creator>
      
      <category><![CDATA[курсы]]></category><category><![CDATA[марафон]]></category><category><![CDATA[курсы программирования]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[react]]></category><category><![CDATA[react.js]]></category><category><![CDATA[frontend]]></category><category><![CDATA[frontend-разработка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Clevertec_dev — Блог компании Clevertec (+4) — 06.03.2025 10:05]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/clevertec/posts/888378/</guid>
    <link>https://habr.com/ru/companies/clevertec/posts/888378/?utm_campaign=888378&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Запускаем бесплатный онлайн-марафон по фронтенд-разработке. Будет как в «Рокки»&nbsp;<br></strong> </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/771/005/7ca/7710057caf0dedc0468676f69d6435c9.jpg" width="1600" height="900"></figure><p><strong>Спринты, дедлайны и финальный тест-бой. Кто пройдет с нами три месяца подготовки — получит шанс на титул. Без метафор — мы реально ищем таланты и готовы взять их на стажировку.</strong></p><p><strong>Как записаться?</strong></p><p>Заполни анкету <a href="https://docs.google.com/forms/d/e/1FAIpQLSdB5vyEfdj-o6adCUgSmwdJFXxgNT_SaADrYpx6HDf34TxTQg/viewform" rel="noopener noreferrer nofollow">по ссылке</a> в профиле и скинь другу. Заявки принимаем до 26 марта.</p><p><strong>Что будет?</strong></p><p>Интенсивный 3-месячный тренинг. Это бесплатно. По сути, ты будешь поэтапно с дедлайнами писать приложение. Каждый спринт проверяем с помощью автотестов. Плюс будет поддержка менторов, наших крепких разработчиков. Это реальная прокачка твоих навыков и готовый проект в резюме.</p><p>Это уже четвертый марафон — после каждого наша команда фронтенд-разработчиков растет.</p><p><strong>Кого ждём?</strong></p><p>Начинающих веб-разработчиков (JS, React), которые уже изучали теорию и хотят прокачаться на практике в условиях, максимально близких к реальному проекту. Главное — желание кодить. Подойдут:</p><p>- студенты профильных вузов</p><p>- выпускники курсов</p><p>- самоучки</p><p><strong>Важное условие: </strong>приглашаем участников из Беларуси и России.</p><p><strong>Что дальше?</strong></p><p>После 26 марта отправим на почту инструкции и первые задания. Старт марафона 1 апреля (это не шутка). До связи, Рокки.&nbsp;<br></p> <a href="https://habr.com/ru/posts/888378/?utm_campaign=888378&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 06 Mar 2025 07:05:41 GMT</pubDate>
    <dc:creator><![CDATA[Clevertec_dev (Клевертек)]]></dc:creator>
      
      <category><![CDATA[react]]></category><category><![CDATA[фронтенд-разработка]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[фронтэнд]]></category><category><![CDATA[курс]]></category><category><![CDATA[курсы по программированию]]></category><category><![CDATA[марафон]]></category><category><![CDATA[марафон обучения]]></category><category><![CDATA[бесплатно]]></category><category><![CDATA[frontend]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @RostislavDugin — Веб-разработка (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/888120/</guid>
    <link>https://habr.com/ru/posts/888120/?utm_campaign=888120&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как мы сокращали количество запросов по фичам в API</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/7b7/f1b/a88/7b7f1ba885db0b407d78b923e91eb3a3.png" width="1124" height="671"></figure><p><strong>Контекст:</strong> я отвечаю за разработку конструктора Telegram-приложений. Начинались мы как конструктор кликеров (еще до хомяка). Со временем эволюционировали в конструктор курсов, сообществ, визиток, мероприятий и любых других приложений</p><p>Одна из основных сущностей в коде — это <code>BotUser</code>. То есть пользователь, который появился в приложении (зашёл хотя бы раз), имеет имя и Telegram ID</p><p>За ~полгода проекта у нас добавилось много фич, привязанных к пользователю. Практически все сопоставляются 1 к 1 по ключу <code>User ID</code>. Например, квизы, бонусные дни, купленные страницы, купленный карточки апгрейдов, тариф и т.д.</p><p>Раньше для каждой новой фичи мы добавляли новый запрос в API с фронтенда. И вот мы заметили, что на каждый заход пользователя стало уходить &gt;10 запросов в API ⚠️. </p><p>Примерно вот так:</p><pre><code class="javascript">GET /users/user
// Response
{
  "tgUsername": ...,
  "tgId": ...,
  ...
}

GET /users/features/quizzes/completed
// Response
{
  "completedQuizzes": ...,
}
   
GET /users/features/pages/bought
// Response
{
  "boughtPages": ...,
}
   
GET /users/features/rates/rate
// Response
{
  "userRate": ...,
}</code></pre><p>При этом, на каждый запрос мы проверяли авторизацию. В Telegram это делается с помощью хеша от Telegram + проверка подписи токеном бота</p><p>Следовательно, на каждый запрос мы делали JOIN пользователя, брали бота (сущность <code>Bot</code>) из кэша и мэтчили подпись (+ логгировали). Это лишняя нагрузка</p><p>Сейчас подсобрали все фичи в один запрос. Теперь, на каждый заход пользователя получается только один <code>GET /app/account/data</code>, который возвращает данные пользователя вместе с данными фичей:</p><pre><code class="javascript">GET /app/account/data

// Response
{
  ...
  "user": ...,
  "completedQuizzes": ...,
  "boughtPages": ...,
  "currentRate": ...,
  ...
}</code></pre><p>За одно перепроверили, что:</p><ul><li><p>не подгружаем связанные сущности, где не нужно (one-to-one, one-to-many);</p></li><li><p>если подгружаем сущности, всегда делаем это одним JOIN'ом (а не бегаем по 2-3 раза в БД, как любит делать Hibernate);</p></li><li><p>берём общие часто запрашиваемые данные из кэшей.</p></li></ul><p>Это позволило снизить нагрузку на сервер и БД. К посту прикрепляю график загрузки части наших серверов по CPU до и после оптимизации.</p><p>---</p><p>Если вам понравился пост или оказался полезным, поставьте, пожалуйста лайк ❤️. Это мотивирует делиться опытом из разработки. И, как полагается, у меня есть&nbsp;<a href="https://t.me/rostislav_dugin_dev" rel="noopener noreferrer nofollow">Telegram-канал</a>, в котором я рассказываю про разработку, развитие SaaS-сервисов и управление IT проектами.</p><p></p> <a href="https://habr.com/ru/posts/888120/?utm_campaign=888120&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 05 Mar 2025 13:00:58 GMT</pubDate>
    <dc:creator><![CDATA[RostislavDugin]]></dc:creator>
      
      <category><![CDATA[веб-разработка]]></category><category><![CDATA[api]]></category><category><![CDATA[оптимизация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @maks88sgt — ReactJS (+2) — 07.02.2025 10:16]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/880290/</guid>
    <link>https://habr.com/ru/posts/880290/?utm_campaign=880290&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>flushSync в React  – костыль или спасение?</strong></p><p>Вчера впервые попробовал flushSyncб который подвезли в React еще в 18 версии.<br> Классное решение для определенных моментов! Выглядит так, будто React выдал нам костыль, но сразу предупредил: пользоваться с осторожностью.</p><p>❓ Почему это вообще нужно? (Для тех, кто не совсем в теме)<br>В React изменения в useState или в useEffect выглядят синхронными, но на самом деле они асинхронны.</p><p>Простой пример:</p><pre><code class="typescript">...

const [count, setCount] = useState(0);

console.log(count); // 0

setCount(1); console.log(count); // Всё ещё 0! 😲

...</code></pre><p>Кажется, что setCount(1) сразу меняет count, но на самом деле новое значение попадёт в консоль только при следующем ререндере.</p><p>То же самое в useEffect:</p><pre><code class="typescript">...

useEffect(() =&gt; { console.log("Эффект сработал!"); }, [count]);

setCount(1); console.log("А это после setCount");

...</code></pre><p>Лог "А это после setCount" появится в консоли раньше, чем "Эффект сработал!", потому что useEffect выполняется уже после рендера.</p><p><strong>Как flushSync меняет поведение?</strong></p><p> Обычно React группирует обновления (batching) и откладывает ререндер до конца текущего цикла. flushSync ломает это поведение и заставляет React сразу выполнить ререндер.</p><pre><code class="typescript">function Example() { 
    const [count, setCount] = React.useState(0); 
    const ref = React.useRef(null);
    const handleClick = () =&gt; { 
        flushSync(() =&gt; setCount(count + 1)); 
        console.log("Высота элемента:", 
            ref.current?.offsetHeight); 
        };

    return (&lt;button onClick={handleClick}&gt;
        Добавить  {count}
    &lt;/button&gt;); 
} </code></pre><p><strong>Что тут происходит?</strong><br> Без flushSync React подождал бы до конца текущего вызова и только потом обновил DOM.<br> С flushSync обновление происходит немедленно, и console.log видит уже новый DOM.</p><p><strong>React нас предупреждает</strong><br> В документации прямо сказано:</p><blockquote><p>"flushSync – это низкоуровневый API. Используйте его только тогда, когда вам действительно нужно измерить DOM сразу после обновления состояния."</p></blockquote><p><strong>Когда не стоит использовать flushSync?</strong><br> Если можно обойтись обычными useEffect или useLayoutEffect.<br> Если batching работает нормально и не мешает.<br> Если нет необходимости немедленного ререндера (иначе можно уронить производительность).</p><p><strong>Итог</strong><br> flushSync – мощный инструмент, но использовать его нужно осознанно. Он нужен в случаях, когда важно немедленно обновить стейт и тут же прочитать DOM (например, для анимаций).</p><p>Если понравился пост присоединяйтесь к моему каналу в Telegram по ссылке <a href="https://t.me/+qbK9ZPuAocI2MWUy" rel="noopener noreferrer nofollow">https://t.me/+qbK9ZPuAocI2MWUy</a>. <br>Там я делюсь своим опытом и пишу материалы которые будут полезны как новичкам, так и матерым разработчикам. </p> <a href="https://habr.com/ru/posts/880290/?utm_campaign=880290&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 07 Feb 2025 07:16:40 GMT</pubDate>
    <dc:creator><![CDATA[maks88sgt]]></dc:creator>
      
      <category><![CDATA[react]]></category><category><![CDATA[react.js]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nin-jin — $mol (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/874642/</guid>
    <link>https://habr.com/ru/posts/874642/?utm_campaign=874642&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<iframe id="678bd4b05d5079d77e34ce60" src="https://embedd.srv.habr.com/iframe/678bd4b05d5079d77e34ce60" class="embed_video embed__content" allowfullscreen="true"></iframe><p><strong><a href="https://t.me/mol_news/167" rel="noopener noreferrer nofollow">Выводим Ситника на чистую воду</a></strong></p><p>Топ перлов:</p><ul><li><p>Sync-engine избавляет от однотипного кода по загрузке данных .. он заставляет вас проверять <code>isLoading === true</code> и рисовать крутилку.</p></li><li><p>Во всех sync-engine используются нормальные стейт менеджеры .. например, nanostore (<a href="https://www.youtube.com/watch?v=Q2rzPc7EEa8" rel="noopener noreferrer nofollow">см. видео с разбором этой библиотеки</a>).</p></li><li><p>(Я запилил штуку, которая ничего не умеет, но ты можешь поверх этой штуки запилить своих костылей для решения проблем, которые у тебя возникнут из-за моей штуки).</p></li><li><p>CRDT - это просто лог операций (лог операций - это CmRDT и OT, CvRDT даже близко не лог).</p></li><li><p>Работать с IndexedDB через скомпилированный под WASM SQLite быстрее, чем напрямую работать с IndexedDB (разве что, если руки заточены под обнимашки).</p></li></ul><p>Упомянутые ссылки:</p><ul><li><p><a href="https://crus.hyoo.ru/" rel="noopener noreferrer nofollow">Local-First  база данных CRUS-DB</a></p></li><li><p><a href="https://bunker.hyoo.ru/" rel="noopener noreferrer nofollow">Децентрализованное хранилище секретов</a></p></li><li><p><a href="https://todomvc.hyoo.ru/" rel="noopener noreferrer nofollow">Реактивный ToDoMVC без sync-engine</a></p></li><li><p><a href="https://mol.hyoo.ru/#!section=docs/=lre14i_zd4xlz" rel="noopener noreferrer nofollow">$mol_wire в React</a></p></li><li><p><a href="https://page.hyoo.ru/#!=uhgyst_zfa8t3" rel="noopener noreferrer nofollow">Протоколы запросов HARP vs GQL</a></p></li><li><p><a href="https://marked.hyoo.ru/" rel="noopener noreferrer nofollow">Легковесный язык разметки MarkedText</a></p></li><li><p><a href="https://page.hyoo.ru/#!=3yox7h_7f2axu" rel="noopener noreferrer nofollow">Натальная травматология фронтенда</a></p></li><li><p><a href="https://hyoo.ru/" rel="noopener noreferrer nofollow">Гильдия Гипер Дев</a></p></li></ul><p><strong><a href="https://boosty.to/hyoo" rel="noopener noreferrer nofollow">Копилка благодарностей</a></strong></p> <a href="https://habr.com/ru/posts/874642/?utm_campaign=874642&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 20 Jan 2025 05:00:44 GMT</pubDate>
    <dc:creator><![CDATA[nin-jin]]></dc:creator>
      
      <category><![CDATA[local-first]]></category><category><![CDATA[sync]]></category><category><![CDATA[crdt]]></category><category><![CDATA[архитектура]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nin-jin — $mol (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/866818/</guid>
    <link>https://habr.com/ru/posts/866818/?utm_campaign=866818&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><em>Доклад с SPb IT Club Meetup №3</em><br><strong>Фреймворк, который нельзя называть</strong></p><iframe id="675f45fdca01a46b4cc7328a" src="https://embedd.srv.habr.com/iframe/675f45fdca01a46b4cc7328a" class="embed_video embed__content" allowfullscreen="true"></iframe><p></p> <a href="https://habr.com/ru/posts/866818/?utm_campaign=866818&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 16 Dec 2024 06:09:51 GMT</pubDate>
    <dc:creator><![CDATA[nin-jin]]></dc:creator>
      
      <category><![CDATA[о]]></category><category><![CDATA[господи]]></category><category><![CDATA[опять реклама мола]]></category><category><![CDATA[помогите]]></category><category><![CDATA[спасите]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Wladradchenko — GitHub (+4) — 09.12.2024 19:40]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/865142/</guid>
    <link>https://habr.com/ru/posts/865142/?utm_campaign=865142&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Исследовал интернет и наткнулся на GitHub <a href="https://githubunwrapped.com/" rel="noopener noreferrer nofollow">Unwrapped</a>. Он на основе активности в GitHub создаёт видео, где можно увидеть часто используемые языки, часы спонтанной работы, звёзды и всё остальное. Достаточно ввести только имя профиля, чтобы получить видео. Код <a href="https://github.com/remotion-dev/github-unwrapped-2023" rel="noopener noreferrer nofollow">открыт</a>.</p><p>Сделано с использованием <a href="https://github.com/remotion-dev/remotion" rel="noopener noreferrer nofollow">Remotion</a> — тоже с открытым кодом, которая позволяет автоматизировать создание видео на React в веб. Документация хорошая, но надо разбираться. Увидел это и решил, что круто, надо поделиться! </p><p>P.S. Моя активность в этом <a href="https://t.me/wladblog/95" rel="noopener noreferrer nofollow">ролике</a>, если кому-то будет интересно.</p> <a href="https://habr.com/ru/posts/865142/?utm_campaign=865142&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 09 Dec 2024 16:40:29 GMT</pubDate>
    <dc:creator><![CDATA[Wladradchenko]]></dc:creator>
      
      <category><![CDATA[github]]></category><category><![CDATA[open source]]></category><category><![CDATA[react]]></category><category><![CDATA[javascript]]></category><category><![CDATA[remotion]]></category><category><![CDATA[video]]></category><category><![CDATA[видео]]></category><category><![CDATA[автоматизация]]></category><category><![CDATA[статистика]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @isumix — ReactJS (+4) — 03.12.2024 12:37]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/863328/</guid>
    <link>https://habr.com/ru/posts/863328/?utm_campaign=863328&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Fusor для React резработчиков за 5 минут</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/435/184/720/43518472084d11c09c0574c755e79d02.png" width="652" height="973"></figure><p><strong>Репозиторий: <a href="https://github.com/fusorjs/dom" rel="noopener noreferrer nofollow">https://github.com/fusorjs/dom</a></strong></p><p></p> <a href="https://habr.com/ru/posts/863328/?utm_campaign=863328&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 03 Dec 2024 09:37:22 GMT</pubDate>
    <dc:creator><![CDATA[isumix]]></dc:creator>
      
      <category><![CDATA[fusor]]></category><category><![CDATA[fusorjs]]></category><category><![CDATA[solid]]></category><category><![CDATA[frontend]]></category><category><![CDATA[webdev]]></category><category><![CDATA[solidjs]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dev_family — ReactJS — 31.10.2024 16:52]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/855082/</guid>
    <link>https://habr.com/ru/posts/855082/?utm_campaign=855082&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Мы подготовили гайд по настройке автогенерации с помощью Orval. Он облегчит жизнь разработчиков, которым часто не хватает времени на оптимизацию и рефакторинг приложений. Весь процесс описан пошагово, код и ссылки на библиотеки вы также найдете в статье <a href="https://habr.com/ru/articles/848182/" rel="noopener noreferrer nofollow">https://habr.com/ru/articles/848182/</a></p> <a href="https://habr.com/ru/posts/855082/?utm_campaign=855082&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 31 Oct 2024 13:52:01 GMT</pubDate>
    <dc:creator><![CDATA[dev_family]]></dc:creator>
      
      <category><![CDATA[frontend]]></category><category><![CDATA[orval]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @isumix — JavaScript (+4) — 13.10.2024 10:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/850258/</guid>
    <link>https://habr.com/ru/posts/850258/?utm_campaign=850258&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Привет друзья! Сделал максимально простые аналоговые часы на SVG. Можно ли их еще упростить или уменьшить? Или добавить немного улучшений без переусложнения? Буду рад вашим идеям!</p><p>Вот&nbsp;<a href="https://codesandbox.io/p/sandbox/fusor-analog-clock-jsx-hqs5x9?file=%2Fsrc%2Findex.tsx" rel="noopener noreferrer nofollow"><u>CodeSandbox</u></a></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/083/93c/7c6/08393c7c6ee85c6d15318645f5de61b1.png" alt="Fusor SVG Analog Clock" title="Fusor SVG Analog Clock" width="731" height="732"><div><figcaption>Fusor SVG Analog Clock</figcaption></div></figure><p>Сделано с помощью&nbsp;<a href="https://github.com/fusorjs/dom" rel="noopener noreferrer nofollow"><u>библиотеки Fusor</u></a></p><p></p> <a href="https://habr.com/ru/posts/850258/?utm_campaign=850258&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 13 Oct 2024 07:18:34 GMT</pubDate>
    <dc:creator><![CDATA[isumix]]></dc:creator>
      
      <category><![CDATA[fusor]]></category><category><![CDATA[fusorjs]]></category><category><![CDATA[svg]]></category><category><![CDATA[css]]></category><category><![CDATA[typescript]]></category><category><![CDATA[javascript]]></category><category><![CDATA[frontend]]></category><category><![CDATA[html]]></category><category><![CDATA[solidjs]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Clevertec_dev — Блог компании Clevertec (+4) — 11.10.2024 14:56]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/clevertec/posts/850022/</guid>
    <link>https://habr.com/ru/companies/clevertec/posts/850022/?utm_campaign=850022&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как в нативе: эти Web API поднимут ваше веб-приложение в стратосферу</strong>  </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/534/07d/45d/53407d45dadb97599e5b1ec2916ebe6e.jpg" alt="С ними даже можно сыграть в Техасский Холдем😂    " title="С ними даже можно сыграть в Техасский Холдем😂    " width="1600" height="900"><div><figcaption>С ними даже можно сыграть в Техасский Холдем😂    </figcaption></div></figure><p><strong>Салют, на связи <a href="https://clevertec.ru/" rel="noopener noreferrer nofollow"><u>Clevertec.</u></a> Сейчас наша команда разрабатывает веб-версию банкинга с использованием React. С помощью Web API даем пользователям фичи, которые они привыкли получать в нативных приложениях. Отрываем от сердца список решений 😉  <br><br>- Web Share API</strong> – для обмена ссылками, текстом и файлами с другими приложениями на устройстве. К примеру, удобно отправить чек об оплате в мессенджере, не покидая банковское приложение.&nbsp;</p><p><strong>- Contact Picker API</strong> позволяет делиться контактами из своего списка. Можно использовать для перевода по номеру телефона. Не нужно вводить цифры вручную – поле автоматически заполнится контактом из телефонной книги.&nbsp;</p><p><strong>- Media Capture and Streams API</strong> в нашем случае позволяет отсканировать QR-код с помощью камеры устройства. Нажимаешь на “Сканировать QR” – открывается окно с камерой, она считывает код и переводит пользователя в дерево платежей.</p><p><strong>- Web OTP API</strong> открывает возможность автоматически вставлять код из смс. Например, для подтверждения оплаты на телефон приходит сообщение. Внизу экрана появляется модальное окно с подтверждением вставки. И после нажатия на “Разрешить” код отображается в поле ввода.</p><p><em>Подробнее про этот опыт использования Web API мы рассказали </em><a href="https://habr.com/ru/companies/clevertec/articles/820227/" rel="noopener noreferrer nofollow"><em><u>в отдельной статье. </u></em></a><em>Что вы думаете о Web API, какие используете? Расскажите в комментариях, будем взаимно полезны друг другу. &nbsp; </em></p> <a href="https://habr.com/ru/posts/850022/?utm_campaign=850022&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 11 Oct 2024 11:56:24 GMT</pubDate>
    <dc:creator><![CDATA[Clevertec_dev (Клевертек)]]></dc:creator>
      
      <category><![CDATA[frontend]]></category><category><![CDATA[webapi]]></category><category><![CDATA[react]]></category><category><![CDATA[web]]></category><category><![CDATA[финтех]]></category><category><![CDATA[банкинг]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @isumix — ReactJS (+4) — 05.10.2024 10:28]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/848394/</guid>
    <link>https://habr.com/ru/posts/848394/?utm_campaign=848394&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Кнопка со счётчиком: React vs Fusor</p><figure class=""><img src="https://habrastorage.org/getpro/habr/upload_files/8ed/abd/064/8edabd064c179017c0610d7a1b94ccef.png" alt="Кнопка со счётчиком: React vs Fusor" title="Кнопка со счётчиком: React vs Fusor" width="496" height="552"><div><figcaption>Кнопка со счётчиком: React vs Fusor</figcaption></div></figure><p>Fusor это новый способ разработки вэб приложений <a href="https://github.com/fusorjs/dom" rel="noopener noreferrer nofollow">https://github.com/fusorjs/dom</a></p><p></p> <a href="https://habr.com/ru/posts/848394/?utm_campaign=848394&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 05 Oct 2024 07:28:17 GMT</pubDate>
    <dc:creator><![CDATA[isumix]]></dc:creator>
      
      <category><![CDATA[javascript]]></category><category><![CDATA[fusor]]></category><category><![CDATA[fusorjs]]></category><category><![CDATA[vanilla]]></category><category><![CDATA[typescript]]></category><category><![CDATA[react]]></category><category><![CDATA[solid]]></category><category><![CDATA[web]]></category><category><![CDATA[frontend]]></category><category><![CDATA[front-end]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — JavaScript (+3) — 03.08.2024 16:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/833556/</guid>
    <link>https://habr.com/ru/posts/833556/?utm_campaign=833556&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Разработчик Мишан Пудель <a href="https://github.com/MishanPoudel/Windows11-3.0" rel="noopener noreferrer nofollow">представил</a> открытое локальное приложение в виде клона интерфейса Windows 11 на React.js с некоторыми компонентами ОС, включая работающий браузер Chrome, инструментарий VS Code, игру Emoji Tic-Tac-Toe, клиент Spotify в качестве музыкального проигрывателя и калькулятор.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/323/8b6/57c/3238b657c2fd3964f992bf8b55d303c0.png" width="1919" height="988"></figure><p> <a href="https://github.com/MishanPoudel/Windows11-3.0" rel="noopener noreferrer nofollow">Используемые в проекте</a> технологии:</p><ul><li><p>React.js: для создания интерактивного пользовательского интерфейса. </p></li><li><p>Tailwind CSS: для стилизации компонентов и создания дескопного окружения.</p></li><li><p>React Router DOM: для управления навигацией и маршрутизацией в приложении.</p></li><li><p>Framer Motion: для добавления анимации и переходов.</p></li><li><p>React Draggable: для создания элементов, которые можно перетаскивать.</p></li></ul><p>Страница входа в ОС: можно ввести что угодно на странице входа, чтобы получить доступ к приложению. Фактические учётные данные не нужны. Щёлкните по значкам на рабочем столе, чтобы открыть различные приложения. Используйте панель задач для переключения между открытыми приложениями. Взаимодействуйте с приложениями, чтобы изучить их функции и возможности.</p><p>Установка проекта локально:</p><ul><li><p>Clone the repository: git clone https://github.com/MishanPoudel/Windows11-3.0;</p></li><li><p>Navigate to the project directory: cd Windows11-3.0;</p></li><li><p>Install the dependencies: npm install;</p></li><li><p>Start the development server: npm start;</p></li><li><p>Открыть в браузере: <a href="http://localhost:3000" rel="noopener noreferrer nofollow">http://localhost:3000</a>.</p></li></ul> <a href="https://habr.com/ru/posts/833556/?utm_campaign=833556&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 03 Aug 2024 13:06:27 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Windows 11 на React.js]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @editor_agima — Блог компании AGIMA (+4) — 29.07.2024 18:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/agima/posts/832298/</guid>
    <link>https://habr.com/ru/companies/agima/posts/832298/?utm_campaign=832298&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Два основных подхода к разработке UI-китов</strong></p><p><strong>1. All-in подход.</strong> Подключение компонента вместе со стилями или без них. Здесь любой компонент — это самостоятельная единица, которая уже содержит всё нужное. Внутри этого подхода можно выделить два подвида:</p><ul><li><p><strong>Инлайн-стили через Styled Components</strong> (возможно, добавить просто подключение стилей внутри компонента). Этот метод позволяет писать стили непосредственно в компоненте. При этом стили изолированы, что уменьшает возможность конфликтов между стилями разных компонентов.</p></li></ul><ul><li><p><strong>Без добавления стилей (Headless).</strong> В этом случае компоненты предоставляют только логику без UI, что позволяет самостоятельно управлять стилями. Для создания подобной библиотеки нужно также ознакомиться с паттерном Compound component.</p></li></ul><p><strong>2. Dependency CSS &amp; Bundle CSS подход. </strong>Второй большой подход — когда стили и компонент подключаются по отдельности. В этом случае стили и логика компонента отделены друг от друга.</p><ul><li><p><strong>Dependency CSS:</strong> этот способ подключения улучшает модульность и позволяет загружать стили только тогда, когда они действительно необходимы.</p></li><li><p><strong>Bundle CSS </strong>предполагает подключение всех стилей сразу и отдельно — компонента. По сути, в этом случае все стили объединены в общий бандл и импортируются в корне проекта.&nbsp;</p></li></ul><p>Но при написании они схожи, и стили к компоненту подключаются как модули.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/bde/752/b43/bde752b43d263dff7153331a1406c916.png" width="1334" height="1182"></figure><p><a href="https://habr.com/ru/companies/agima/articles/825080/" rel="noopener noreferrer nofollow"><em><u>О том, как создавать и подключать UI-киты, рассказываем в нашем гайде для начинающих Frontend-разработчиков.</u></em></a><em> Там вы найдете примеры кода и полезные ссылки.</em></p> <a href="https://habr.com/ru/posts/832298/?utm_campaign=832298&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 29 Jul 2024 15:07:13 GMT</pubDate>
    <dc:creator><![CDATA[editor_agima (AGIMA)]]></dc:creator>
      
      <category><![CDATA[uikit]]></category><category><![CDATA[ui]]></category><category><![CDATA[ui kit]]></category><category><![CDATA[react.js]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><category><![CDATA[headless]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Vordgi — ReactJS (+2) — 26.04.2024 21:38]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/810843/</guid>
    <link>https://habr.com/ru/posts/810843/?utm_campaign=810843&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Вышел React 19 beta.</p><p>Команда react.js во всю готовится к <a href="https://conf.react.dev/" rel="noopener noreferrer nofollow">предстоящей конференции</a> и видимо, несмотря на большие сомнения, именно на ней они представят React 19. На сайте уже была опубликована <a href="https://react.dev/blog/2024/04/25/react-19" rel="noopener noreferrer nofollow">страница релиза</a>.</p><p>В релизе всё то, о чём рассказывала команда next.js - action для формы, новые хуки, серверные компоненты и серверные действия, метаданные страницы и предзагрузка ресурсов из коробки. Из нового (<em>или упущенного мной</em>) - для передачи ref больше не нужно использовать forwardRef, обновлённое API контекстов и продвинутая поддержка таблиц стилей.</p><p>Вместе с релизом был опубликован и <a href="https://react.dev/blog/2024/04/25/react-19-upgrade-guide" rel="noopener noreferrer nofollow">гайд на обновление до 19 версии</a> для библиотек. В гайде можно отметить значительные удаления функционала помеченного в последние годы как устаревший.</p><p>Также вчера вышел React 18.3.0, а уже сегодня вышла минорка - React 18.3.1. Это промежуточные релизы, в которых добавили предупреждения о том, что будет помечено как устаревшее или удалено. Так можно подготовить проекты к предстоящему обновлению.</p> <a href="https://habr.com/ru/posts/810843/?utm_campaign=810843&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 26 Apr 2024 18:38:26 GMT</pubDate>
    <dc:creator><![CDATA[Vordgi]]></dc:creator>
      
      <category><![CDATA[react]]></category><category><![CDATA[react 19]]></category><category><![CDATA[frontend]]></category><category><![CDATA[web-разработка]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[релиз]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nin-jin — ReactJS (+4) — 19.04.2024 21:49]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/809083/</guid>
    <link>https://habr.com/ru/posts/809083/?utm_campaign=809083&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong><a href="https://youtu.be/JRmKxTLdNo8" rel="noopener noreferrer nofollow">Препарируем React и находим родовые травмы</a></strong></p><iframe id="6622bbd5aeb5569d7b6c617c" src="https://embedd.srv.habr.com/iframe/6622bbd5aeb5569d7b6c617c" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Выбор двух миллионов разрабов, но..</p><ul><li><p>Не умеет в реактивность.</p></li><li><p>Ререндеры по любому чиху.</p></li><li><p>Смешивает инициализацию и обновление, логику и шаблон.</p></li><li><p>Путается между пересозданиями и перемещением.</p></li><li><p>Все компоненты либо неуправляемые, либо неполноценные, либо ожиревшие.</p></li><li><p>Кривая эмуляция объектов через функции  с хуками.</p></li><li><p>Не типизируемый VDOM на выходе.</p></li><li><p>Разобщённая экосистема со слабой поддержкой TS.</p></li><li><p>Горы бойлерплейта по мере приближения к проду.</p></li></ul><p><strong>В продолжение темы:</strong> <a href="https://mol.hyoo.ru/#!section=docs/=lre14i_zd4xlz" rel="noopener noreferrer nofollow">Реактивный React</a>, <a href="https://bench.hyoo.ru/app/#!sample=mol~moljsx~react/sort=update" rel="noopener noreferrer nofollow">Читерские бенчмарки</a>.</p><p><strong>Копилка благодарностей</strong>:&nbsp;<a href="https://boosty.to/hyoo" rel="noopener noreferrer nofollow">https://boosty.to/hyoo</a>  </p> <a href="https://habr.com/ru/posts/809083/?utm_campaign=809083&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 19 Apr 2024 18:49:38 GMT</pubDate>
    <dc:creator><![CDATA[nin-jin]]></dc:creator>
      
      <category><![CDATA[react]]></category><category><![CDATA[reactjs]]></category><category><![CDATA[jsx]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @cherkalexander — ReactJS (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/801163/</guid>
    <link>https://habr.com/ru/posts/801163/?utm_campaign=801163&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>⚛️ React 19 — useOptimistic</strong></p><p><code>useOptimistic</code> — новый хук, который позволяет отобразить “оптимистичное” состояние. Оно называется “оптимистичным”, потому что мы надеемся, что запрос не свалится с ошибкой и после его выполнения состояние будет выглядеть именно так.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/593/221/bb2/593221bb2da990b549e4a8a25ada7c13.png" width="1738" height="2648"></figure><p><strong>❓Как используется</strong></p><ul><li><p>В <code>useOptimistic</code> передаётся реальное состояние и функцию-reducer</p></li><li><p>Компонент использует “оптимистичное” состояние для рендера</p></li><li><p>Перед выполнением запроса обновляется “оптимистичное” состояние</p></li><li><p>Когда запрос завершился, нужно обновить реальное состояние</p></li><li><p>Как только реальное состояние обновилось, оптимистичное состояние обновится автоматически, так как оно передано в <code>useOptimistic</code> первым параметром. </p></li><li><p>Если запрос упал с ошибкой, нужно откатить изменения в оптимистичном состоянии.</p></li></ul><p>ℹ️ Первый вопрос, которым я задался, а в чём отличие от обычного <code>setState</code>, путём экспериментов, вот что удалось найти:</p><ul><li><p><code>useOptimistic</code> работает с формами. Работать с обычной кнопкой в SPA мне не удалось, обновление происходило только после завершения запроса</p></li><li><p><code>useOptimistic</code> работает только внутри асинхронного обработчика, что логично. Если убрать <code>async/await</code>, обновление произойдёт только после завершения запроса</p></li><li><p>Параметр в useState используется только для инициализации, и игнорируется в последующих рендерах. <code>useOptimistic</code> будет сихронизироваться со значением со значением переданным первым параметром.</p></li></ul><p>В любом случае, пока useOptimistic выглядит каким-то низкоуровневым API. Надеюсь скоро появится больше Best Practices.</p><p><a href="https://t.me/cherkashindev/184" rel="noopener noreferrer nofollow">https://t.me/cherkashindev/184</a></p> <a href="https://habr.com/ru/posts/801163/?utm_campaign=801163&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 19 Mar 2024 07:04:13 GMT</pubDate>
    <dc:creator><![CDATA[cherkalexander]]></dc:creator>
      
      <category><![CDATA[javascript]]></category><category><![CDATA[react]]></category><category><![CDATA[reactjs]]></category><category><![CDATA[typescript]]></category><category><![CDATA[новые фичи]]></category><category><![CDATA[hooks]]></category><category><![CDATA[хуки]]></category><category><![CDATA[react19]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
