Обложка канала

Заметки про React. Страница 5

Короткие и полезные заметки про React

  • Заметки про React

    Обработка ошибок с TypeScript Для долговечности работы проекта крайне важно отлавливать и обрабатывать ошибки. В TypeScript при обработке ошибки в try/catch тип ошибки всегда unknown:
    try {
      // --snip--
    } catch (error) {
      // error is unknown
    }
    
    Бывают случаи, когда мы хотим добиться более детального контроля при работе с ошибками. В этом случае мы должны определить тип ошибки. Для определения типа ошибки можно воспользоваться оператором instanceof. В TypeScript при использовании instanceof мы сужаем тип у переменной с неизвестного до определенного и далее можем с ним взаимодействовать. В JavaScript много стандартных типов ошибок, например: ReferenceError, TypeError, SyntaxError. Также можно создавать свои собственные – пользовательские типы ошибок. При создании пользовательского типа ошибки расширяйтесь от стандартного класса Error, чтобы к ошибке прикреплялся стектрейс. Использование пользовательских ошибок позволяет более детально обрабатывать каждую ошибку и по разному реагировать на нее приложению. Пример:
    export class ProjectError extends Error {
      name: ErrorName;
      message: string;
      cause: any;
    
      constructor({
        name, message, cause
      }: {
        name: ErrorName;
        message: string;
        cause?: any
      }) {
        super();
        this.name = name;
        this.message = message;
        this.cause = cause;
      }
    }
    
    try {
      throw new ProjectError({
        name: "CREATE_PROJECT_ERROR",
        message: "API Error"
      });
    } catch (error) {
      if (error instanceof ProjectError) {
        if (error.name === "CREATE_PROJECT_ERROR") {
          toast(error.message);
        }
      }
    }
    
    engineering.udacity.com/handlin…14ad4991
    Handling errors like a pro in TypeScript

    Error handling is crucial to the longevity of any project. Learn the design pattern I use to handle errors and write cleaner code.

    Medium
  • Заметки про React

    React Wrap Balancer Небольшой компонент для React, который поможет сделать более сбалансированные переносы строк в текстах. Избавляет от ситуаций в заголовках, когда при сужении размера экрана одно слово переносится на новую строку. https://github.com/shuding/react-wrap-balancer
  • Заметки про React

    Варианты использования React ref callback В блоге Джулс Блом вышел подробный гайд по вариантам использования ref callback. Ref callback - это функция, которая передается хост элементу в атрибут ref. React вызывает эту функцию с ссылкой на DOM элемент при монтировании компонента и с null при размонтировании компонента. Ref callback позволяет выполнять различные действия в момент, когда React прикрепляет или открепляет ref к DOM элементу. Например: - Выполнить скролл или фокус к элементу при монтировании. - Узнать DOM свойства при монтировании, например, размер элемента. - Создание порталов в DOM элемент, созданный React. - Поделиться DOM элементом с несколькими потребителями. julesblom.com/writing…se-cases
    JulesBlom.com - React ref Callback Use–Cases

    ref callbacks are a little known feature in React, they’re used to perform an action when React attaches or detaches a ref to a DOM element. ref callbacks have a few use-cases, let’s look at some.

    Jules Blom's website
  • Реклама

  • Заметки про React

    React Concurrency под капотом Наконец-то опубликовался доклад, с которым я выступал осенью на Smashing Conf и performance.​now(). Ловите :) https://3perf.com/talks/react-concurrency/ Внутри — куча картинок про новые перфоманс-фичи React 18: ⚛️ Как именно работает useTransition() (с демкой в девтулзах и просмотром кода из React-а, да) 🧊 Как применять <Suspense>, чтобы ускорить гидрацию, и как его не применять 🫠 Почему Vue.js и Preact отказались реализовывать что-то похожее на React Concurrency (и другое)
    React Concurrency, Explained

    Concurrent Rendering: when it helps, how it works under the hood, and why Vue.js/Preact refused to ship anything similar

    PerfPerfPerf
  • Заметки про React

    React Email Библиотека для создания email шаблонов с помощью React и TypeScript. Содержит набор готовых компонентов без стилей. При рендере шаблона создается совместимый с популярными почтовыми клиентами HTML код. Также есть dev режим, в котором можно увидеть, как будет выглядеть шаблон при рендере. Для рендера шаблона используется функция render:
    import { MyTemplate } from '../components/MyTemplate';
    import { render } from '@react-email/render';
    
    const html = render(<MyTemplate firstName="Jim" />, {
      pretty: true,
    });
    
    В документации есть пример интеграции с почтовыми провайдерами: Nodemailer, SendGrid, Postmark и AWS SES. На сайте есть примеры готовых шаблонов. https://react.email/
    React Email

    A collection of high-quality, unstyled components for creating beautiful emails.

    react.email
  • Заметки про React

    Самые популярные CSS-in-JS библиотеки в 2022 году Опрос State of CSS выделил CSS-in-JS библиотеки, которые оказались наиболее часто используемыми среди фронтенд-разработчиков за 2022 год. В тройке самых популярных оказались Styled Components, CSS Modules и Styled JSX. Алекс Ивановс написал по каждой библиотеке из рейтинга краткую информацию, пример использования и основные фичи. https://stackdiary.com/css-in-js-libraries/
    The Most Popular CSS-in-JS Libraries in 2022 - Stack Diary

    CSS-in-JS is a popular approach to styling web applications that allows for more modular and reusable styles, as well as better integration with other aspects of the application logic. The State of CSS survey, which gathers feedback from thousands of front-end developers, has highlighted the CSS-in-JS libraries that are most used amongst front-end developers for the past year. In this article, we will take a closer look at these libraries and explore their key features and advantages.

    Stack Diary
  • Заметки про React

    GitHub Unwrapped 2022 Команда Remotion создала сайт, который генерирует видео о ваших результатах в Github в 2022 году. Для получения статистики используется GitHub GraphQL API. Само видео создается с помощью библиотеки Remotion. https://www.githubunwrapped.com/
    Your coding year in review - #GitHubUnwrapped 2022

    Get a personalized video of your GitHub activity in 2022. Type your username to get started!

    Githubunwrapped
  • Заметки про React

    Переименование экспериментального useEvent в useEffectEvent В репозитории React смержили ПР, в котором переименовали useEvent в useEffectEvent. Ранее в устаревшем RFC про useEvent показывали пример использования хука: в эффектах и для оптимизации рендера. Теперь хук будет использоваться только в эффектах. По сообщению Дэна Абрамова оптимизация рендеринга будет прорабатываться отдельно. Пример использования хука:
    const onHappened = useEffectEvent(() => ...);
    useEffect(() => {
      onHappened();
    }, []);
    
    https://github.com/facebook/react/pull/25881
    Заметки про React

    RFC useEvent В React RFC появилось новое предложение от Дэна Абрамова – добавить хук useEvent. Этот хук будет предназначен для использования в обработчиках событий. function Chat() { const [text, setText] = useState(''); const onClick = useEvent(() => { sendMessage(text); }); return ; } Код внутри useEvent будет иметь доступ к актуальным значениям пропсов/стейтов в момент вызова. Возвращаемая функция будет иметь одинаковую ссылку, даже если пропсы/стейты, на которые она ссылается, изменились. Также в useEvent не будет массива зависимостей. При использовании useEffect можно будет исключить из списка зависимостей функции, объявленные через useEvent. Таким образом, эффекты не будут перезапускаться при изменении ссылки на обработчики событий. function Page({ route, currentUser }) { // ✅ Stable identity const onVisit = useEvent(visitedUrl => { logAnalytics('visit_page', visitedUrl, currentUser.name); }); useEffect(() => { onVisit(route.url); …

    Telegram
  • Заметки про React

    Цветовые форматы в CSS В CSS есть несколько цветовых форматов: хекскод, rgb(), hsl(), lch() и другие. Самые популярные из них - это хекскод и rgb(). А для чего существуют остальные, и нужно ли их использовать? В блоге Джошуа Комо вышел гайд по цветовым форматам. В нем он разобрал каждый цветовой формат и его применимость. https://www.joshwcomeau.com/css/color-formats/
    Color Formats in CSS

    CSS gives us so many options when it comes to expressing color—we can use hex codes, rgb, hsl, and more. Which option should we choose? This turns out to be a surprisingly important decision! In this article, we'll take a tour of color formats in CSS, and see which option will serve us best.

    Joshwcomeau
  • Заметки про React

    Применение паттерна Стратегия в React При разработке React приложения бывает проблема, когда одна часть бизнес-логики реализована по частям в нескольких компонентах, хуках и функциях. У этой проблемы есть название “Стрельба дробью” (Shotgun Surgery). Это запах кода, в котором одно изменение затрагивает сразу несколько классов приложения. Один из вариантов решения этой проблемы – паттерн Стратегия. В блоге dev.to автор Хьюго Та поделился примером использования паттерна Стратегия при разработке компонента. В качестве примера – карточки с ценами. Если посетитель из определенной страны, то в карточке указывается цена в валюте его страны и возможная скидка. Для реализации такой бизнес-логики автор создал базовый абстрактный класс и имплементировал классы для разных стран.
    abstract class PriceStrategy {
      protected country: Country = Country.AMERICA;
      protected currency: Currency = Currency.USD;
      protected discountRatio = 0;
    
      // --snip--
    }
    
    class JapanPriceStrategy extends PriceStrategy {
        constructor() {
          super();
          this.country = Country.JAPAN;
          this.currency = Currency.YEN;
          this.discountRatio = 0.2;
        }
    
        // --snip--
    }
    
    <PricingCard price={7669} strategy={new JapanPriceStrategy()} />
    
    dev.to/itshugo…tern-enn
    Applying Design Patterns in React: Strategy Pattern

    This article is about a problem many of us encounter in React & Frontend development (sometimes...

    DEV Community 👩‍💻👨‍💻
  • Заметки про React

    Оптимизация веб шрифтов в Next.js 13 При загрузке кастомных веб шрифтов на сайте может возникнуть проблема FOUT (Flash Of Unstyled Text) или FOIT (Flash Of Invisible Text). Из-за FOUT и FOIT может произойти сдвиг макета, который сбивает пользователя с толку. Эти проблемы происходят из-за того, что пользователю необходимо загружать кастомные веб шрифты перед их рендером на странице. Лидия Холли написала гайд по оптимизации веб-шрифтов, чтобы минимизировать возможные проблемы загрузки веб шрифтов. При загрузке кастомного веб шрифта стоит обратить внимание на дескрипторы шрифта. В CSS это свойства size-adjust, ascent-override, descent-override и line-gap-override. Они предназначены для настройки характеристик отображения шрифта. Например, два разных веб шрифта с одинаковым размером шрифта могут занимать разное количество места на странице. При настройке CSS дескрипторов запасного шрифта можно добиться схожести размеров на загружаемый кастомный веб шрифт. Вследствие чего можно избежать сдвига макета. В Next.js 13 появился новый модуль @next/font. Он позволяет использовать локальные и Google Fonts шрифты, не беспокоясь о деталях оптимизации. При использовании Google Fonts этот модуль скачивает шрифт во время сборки и добавляет запасной шрифт, автоматически добавляя настройки CSS дескриптора:
    import { Poppins } from "@next/font/google";
    
    const poppins = Poppins({ weight: "600", subsets: ["latin"] });
    
    export default function Title() {
      return <h1 className={poppins.className}>The Acme Blog</h1>;
    } 
    
    www.lydiahallie.io/blog/op…extjs-13
    Optimizing Web Fonts in Next.js 13

    Learn more about optimizing web fonts and the @next/font module in Next.js 13.

    www.lydiahallie.io
  • Заметки про React

    Плохие практики использования useState Хук useState используется чаще всего при работе с React. Есть несколько плохих практик при работе с ним, которые приводят к более сложному коду, увеличению количества багов и ухудшению производительности компонента. Йоханнес Кеттманн в блоге Profy собрал список плохих практик использования useState и предложил к каждому свое решение. Кратко про часть из них: Избыточный стейт. Стейт, который зависит от другой переменной стейта, скорее всего можно безболезненно заменить на производную переменную. Пример избыточного стейта:
    const onChangeFirstName = (event) => {
      setFirstName(event.target.value);
      setFullName(`${event.target.value} ${lastName}`);
    };
    
    Дублирование стейта. Проблема появляется, когда одни и те же данные дублируются в нескольких стейтах. Эта проблема указывает на нарушение принципа единого источника правды. Пример дублирования стейта:
    function DuplicateState({ items }) {
      const [selectedItem, setSelectedItem] = useState();
      const onClickItem = (item) => {
        setSelectedItem(item);
      };
      // --snip--
    }
    
    При изменении пропса items в selectedItem могут оказаться устаревшие данные. Чтобы избежать обращения к устаревшим данным, вместо selectedItem используйте selectedItemId. А selectedItem будет вычисляться по выбранному id из items. Обновление стейта в useEffect. При обновлении стейта в useEffect происходит дополнительный рендер. Также бывает сложно вызвать эффект в нужное время. Например, эффект вызывается при инициализации компонента. Поэтому старайтесь избегать обновления стейта в useEffect. Кстати, есть интересный доклад про useEffect от Дэвида Хуршиди. В нем он призывает вообще отказаться от useEffect. profy.dev/article…pitfalls
    Goodbye, useEffect - David Khourshid

    From fetching data to fighting with imperative APIs, side effects are one of the biggest sources of frustration in web app development. And let’s be honest, putting everything in useEffect hooks doesn’t help much. Thankfully, there is a science (well, math) to side effects, formalized in state machines and statecharts, that can help us visually model and understand how to declaratively orchestrate effects, no matter how complex they get. In this talk, we’ll ditch the useEffect hook and discover how these computer science principles can be used to simplify effects in our React apps.

    YouTube
  • Заметки про React

    React — самая популярная библиотека для фронтенд-разработки. А ещё это стабильный фреймфорк, который легко поддерживать, поэтому на нём пишут большие популярные веб-приложения. Если вы ищете новую интересную работу в IT или мечтаете о повышении, то вам подойдет курс Яндекс Практикума «React-разработчик». Курс длится всего 3 месяца, но за это время мы научим вас: • уверенно разбираться в библиотеке React; • использовать TypeScript при разработке React-приложений; • тестировать веб-приложения с помощью юнит-тестов и cypress. Учёбе нужно будет уделять 20-25 часов в неделю. Обучение разбито на спринты, заниматься можно когда угодно, главное — уложиться в дедлайн. На всех этапах вас будут сопровождать опытные разработчики: мы не дадим просесть по учёбе и поможем выкроить время на образование. Вы будете практиковаться на реальных кейсах и положите в портфолио работающие проекты. А карьерные консультации подготовят вас к разговору о повышении или помогут с поиском новой работы.  Записаться на курс можно здесь: https://practicum.yandex.ru/react/
    Курс React-разработчик — онлайн-обучение React.js с нуля в сервисе Яндекс Практикум

    Онлайн-курс «React-разработчик» от сервиса Яндекс Практикум. 3 месяца онлайн-обучения React.js с нуля с выдачей диплома о профессиональной переподготовке.

    Яндекс Практикум
  • Заметки про React

    Релиз Vite 4.0 Вышла новая версия Vite 4.0. Основные изменения: • Используется Rollup 3. • Новый плагин для сборки @vitejs/plugin-react-swc. Он использует esbuild для сборки приложения и SWC вместо Babel во время разработки. • Современная сборка по умолчанию нацелена на safari14 вместо safari13. Если нужна поддержка старых браузеров, то используйте @vitejs/plugin-legacy. • Кодировка сборки по умолчанию utf8. • Для импорта CSS как строки используйте суффикс ?inline: import stuff from './global.css?inline’. https://vitejs.dev/blog/announcing-vite4.html
    Announcing Vite 4

    Vite 4 Release Announcement

    vitejs.dev
  • Заметки про React

    Документальный фильм о React В феврале должен выйти документальный фильм про React, а пока можно посмотреть трейлер на ютубе. https://www.youtube.com/watch?v=gmp0istg5xo
    React.js: The Documentary [OFFICIAL TRAILER]

    These days, React is everywhere – even the Honeypot team uses it! But were you paying attention a decade ago when React was first open-sourced? The JavaScript community didn’t just have a bad reaction, they couldn’t believe this project had any future. And boy howdy did the conversation get snarky. If it wasn't for a small group of passionate developers at (what was then) Facebook, React might not have seen the light of day. In this documentary, we’ll take you back to the origins, right to the moment when 'Rethinking Best Practices' got real. We'll show you how React went from 'indie-rebel alliance project' to the most popular UI framework in the world. Hear the story from the star engineers who were there to see all the twists and turns. A thrill-filled roller coaster or an atmospheric slow burn? Only our documentary will tell. React.js: The Documentary will premiere on this channel in February 2023. Sign up here if you want to be notified: https://hello.honeypot.io/react-coming-soon/ ⚛ Check out the home for untold developer stories around open source, careers and all the other cool stuff developers are doing at cult.honeypot.io. Honeypot is a developer-focused job platform, on a mission to get developers great jobs. Wanna see what we're all about? Visit honeypot.io to find a job you love. To learn more about Honeypot: http://www.honeypot.io/?utm_source=youtube Follow the amazing cast: Adam Wolff: https://twitter.com/dmwlff Andrew Clark: https://twitter.com/acdlite Christopher Chedeau: https://twitter.com/Vjeux Dan Abramov: https://twitter.com/dan_abramov David Nolen: https://twitter.com/swannodette Lee Byron: https://twitter.com/leeb Michael Chan: https://twitter.com/chantastic Pete Hunt: https://twitter.com/floydophone Sebastian Markbåge: https://twitter.com/sebmarkbage Shane O'Sullivan: https://twitter.com/Chofter and https://chofter.com/ Sophie Alpert: https://twitter.com/sophiebits and https://sophiebits.com/ Tom Occhino: https://twitter.com/tomocchino Tony Casparro: https://twitter.com/IamTonyC Follow us: Twitter: https://twitter.com/honeypotio Facebook: https://www.facebook.com/Honeypotio/ LinkedIn: https://www.linkedin.com/company/honeypotio/ Instagram: https://www.instagram.com/honeypot.cult/

    YouTube
  • Реклама

  • Заметки про React

    Гексагональная архитектура в React Основная идея в гексагональной архитектуре, чистой архитектуре и других похожих парадигмах заключается в концепции разделения слоев и выделении отдельного доменного слоя. При обсуждении применения гексагональной архитектуры для приложения React возникает вопрос о правильном применении. Алекс Кондов рассказал о подходе к разработке приложений на React с применением гексагональной архитектуры. Для доступа к доменной логике в компонентах используются хуки. Хуки – это адаптеры между React и вашим доменным кодом. Под доменным кодом имеются в виду запросы в API, управление пользователем или любой другой бизнес-сущностью. Сама доменная логика может быть реализована с помощью любой удобной парадигмой программирования. В качестве примера можно посмотреть на react-query. Эта библиотека написана с помощью ООП и использует хуки как адаптер к React.
    function PostPage({ postId }) {
      const { post, error, bookmarkPost, reactToPost } = usePost(postId);
    
      // --snip--
    }
    
    function usePost(postId) {
      const [post, setPost] = useState(null);
      // --snip--
    
      const getPost = () => {
        client.getPost(postId).then(setPost).catch(setError)
      }
    
      const bookmarkPost = () => {
        client.bookmarkPost(postId, userId);
      };
    
      useEffect(() => {
        getPost()
      }, [])
    
      // --snip--
    
      return {
        post: mapToDomainObject(post),
        bookmarkPost,
        // --snip--
      };
    }
    
    alexkondov.com/hexagon…in-react
    Hexagonal-Inspired Architecture in React

    My grudge against the front-end community is that we’re too focused on improving low-level APIs and building new tools instead of thinking about architecture…

    Alexkondov
  • Заметки про React

    Nextra 2.0 Nextra – это инструмент, облегчающий разработку документации сайта, основанный на Next.js и разрабатываемый командой Vercel. Новый релиз 2.0 включает в себя редизайн и новые фичи: MDX 2, поддержка Tailwind, встроенный поиск FlexSearch, i18n, доступность A11Y, подсветка кода. Использование Next.js позволяет организовать роутинг страниц на основе структуры проекта. Также можно создавать как динамические страницы (SSR), так и генерировать статические страницы. С помощью Nextra созданы сайты документаций для проектов Turbo, SWR и других проектов Vercel. https://nextra.site/

    Make beautiful websites with Next.js & MDX.

    nextra.site
  • Заметки про React

    Архитектура React Query Доминик Дорфмайстер подготовил верхнеуровневое устройство библиотеки React Query. Из-за внутреннего устройства библиотеки её легко адаптировать под любой фреймворк. Адаптеры для React и Solid занимают не больше 100 строк кода. Все начинается с QueryClient, который используется во всем приложении. Это контейнер для кэша QueryCache и MutationCache. Кэш хранит запросы – объекты Query. Объект Query хранит в себе информацию о запросе, выполняет сам запрос, делает отмену и дедупликацию. При использовании хука useQuery создается Observer. Это промежуточный объект между Query и компонентом React. Он информирует компонент о необходимости ре-рендера при изменении состояния запроса Query. https://tkdodo.eu/blog/inside-react-query
    Inside React Query

    Taking a look under the hood of React Query

    tkdodo.eu