Получи случайную криптовалюту за регистрацию!

Заметки про React

Логотип телеграм канала @ru_react_notes — Заметки про React З
Логотип телеграм канала @ru_react_notes — Заметки про React
Адрес канала: @ru_react_notes
Категории: Технологии
Язык: Русский
Количество подписчиков: 1.62K
Описание канала:

Короткие заметки про React.js, TypeScript и все что с ним связано
Контакт: @rimlin

Рейтинги и Отзывы

2.00

2 отзыва

Оценить канал ru_react_notes и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

0

3 звезд

1

2 звезд

0

1 звезд

1


Последние сообщения 6

2022-04-18 11:20:07 Упускаемый из виду фактор оптимизации производительности в React

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

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

Наверняка вы знаете поведение рендера при использовании контекста: при изменении значения контекста компонент-потребитель будет отрендерен заново (проверка происходит по ссылке).

function App() {
return (



);
}

function Parent({children}) {
const [stateA, dispatchA] = useReducer(reducerA, initialStateA);

return (

{children}

);
}

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

https://www.zhenghao.io/posts/top-level-perf
544 viewsIlmir Shaikhutdinov, 08:20
Открыть/Комментировать
2022-04-13 13:35:02 Композиция компонентов в React: как сделать это правильно

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

В React есть несколько подходов к композиции компонентов. Есть “простые” компоненты:

const Button = ({ title, onClick }) => ;

И компоненты контейнеры:

const Button = ({ children, onClick }) => ;

У компонента контейнера вместо пропса title проп children. Это различие позволяет более гибко использовать компонент контейнер и передавать в children любые элементы, при этом синтаксис выглядит как использование обычного HTML тега.

Можно определить следующие правила для декомпозиции компонента:

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

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

- Начинайте композицию с “простых” компонентов, а другие подходы композиции используйте по мере необходимости.

Также стоит отметить про принцип Единый Уровень Абстракции (Single Level of Abstraction).

https://www.developerway.com/posts/components-composition-how-to-get-it-right
844 viewsIlmir Shaikhutdinov, 10:35
Открыть/Комментировать
2022-04-11 11:35:02 Изменения типов в React 18

Вышло мажорное обновление библиотеки типов для React 18 @types/react@^18.0.0. В нем есть несколько критических изменений:

- Убран неявный проп children в React.FC и React.Component. Теперь, если компонент ожидает проп children, то его нужно передавать явно:

interface Props {
children?: React.ReactNode;
}

const SomeFunctionComponent: React.FC = props =>
{props.children}


Есть несколько причин, почему был удален проп children. Во первых, очень часто этот проп не использовался. Но так как он был объявлен в типах, то это могло приводить к неверным предположениям о работе компонента (раз есть проп children, то значит он как-то используется внутри компонента). Во вторых, более строгая типизация пропа children, теперь можно самостоятельно указать его тип. Более подробно про причины удаления неявного children написано здесь.

- Убран тип {} у ReactFragment. Это никогда не было правильным и в основном требовалось для взаимодействия с неявными пропом children.

- this.context по умолчанию станет unknown. Раньше по умолчанию был any. Это распространяется и на функцию useCallback, теперь, если тип не указан, то по умолчанию аргумент будет unknown.

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

-StatelessComponent
+FunctionComponent

-SFC
+FC

-React.ReactType
+React.ElementType

-SFCElement
+FunctionComponentElement

// без замены
-Props
-RefForwardingComponent
-SFCFactory

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/56210
829 viewsIlmir Shaikhutdinov, 08:35
Открыть/Комментировать
2022-04-08 12:31:06 Как React 18 может сломать ваше приложение

Уже сейчас можно обновить библиотеку React до 18 версии, и разработчики утверждают, что обновление должно быть безболезненным. Однако, иногда после обновления могут происходить ошибки в приложениях. Связано это с новым режимом работы StrictMode.

В dev режиме React будет делать проверку, автоматически размонтировать и повторно монтировать каждый компонент всякий раз, когда компонент монтируется в первый раз, восстанавливая предыдущее состояние стейтов при втором монтировании. Это необходимо, чтобы в будущем React мог удалять и восстанавливать секции UI с сохранением стейта. Например, при переключении табов на странице. Как работают эффекты в таком режиме:

* React mounts the component.
* Layout effects are created.
* Effect effects are created.
* React simulates effects being destroyed on a mounted component.
* Layout effects are destroyed.
* Effects are destroyed.
* React simulates effects being re-created on a mounted component.
* Layout effects are created
* Effect setup code runs

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

function useIsMounted() {
const isMountedRef = React.useRef(true);
React.useEffect(() => {
return () => {
isMountedRef.current = false;
};
}, []);
return () => isMountedRef.current;
}

Например, хук выше определяет, смонтирован ли компонент. В React 18 данный хук будет работать неправильно, т.к. при проверке стабильности эффектов React будет несколько раз запускать и очищать useEffect. Чтобы исправить хук, нужно добавить присвоение в самом эффекте:

React.useEffect(() => {
isMountedRef.current = true;
return () => {
isMountedRef.current = false;
};
}, []);
1.0K viewsIlmir Shaikhutdinov, 09:31
Открыть/Комментировать
2022-04-06 11:40:03 Когда React рендерит компонент

Чтобы эффективно создавать приложения на React, полезно понимать поведение рендеринга React и знать правила как избежать повторный рендер.

React рендерит компонент, если:
- у компонента запланировано обновление стейта.
- произошел рендер родительского компонента и текущий компонент не соответствует критериям отказа от повторного рендера, где все эти четыре условия должны выполняться одновременно:
- Компонент был уже отрендерен и смонтирован.
- Нет изменений пропсов.
- Нет изменений в значении контекста, который используется в компоненте.
- Сам компонент не запланировал обновление.

Существуют два типа рендеринга, которые могут произойти с компонентом:
- активный рендеринг:
- Компонент (или кастомный хук) заранее планирует обновления для изменения стейта.
- Прямой вызов ReactDOM.render.
- пассивный рендеринг: родительский компонент запланировал обновление стейта и текущий компонент не соответствует критериям отказа от повторного рендера (четыре условия выше).

https://www.zhenghao.io/posts/react-rerender
1.0K viewsIlmir Shaikhutdinov, 08:40
Открыть/Комментировать
2022-04-01 16:35:03 Как работают роуты в Remix

В Remix используется роутинг на основе файловой системы. Внутри папки с роутами каждый файл представляет собой отдельную страницу. Внутри каждого файла есть несколько экспортов. Дефолтный эскпорт - это React компонент, а специальные методы Remix экспортируются по имени. Среди таких экспортов может быть получение данных loader или мутация action.

В Remix можно создавать общий шаблон для страниц:

├───/apps
│ ├───/routes
│ │ ├───/posts // компоненты постов
│ │ └───posts.jsx // это шаблон


В файле posts.jsx используется Remix компонент , который вместо себя рендерит вложенные компоненты, как в react-router.

├───/apps
│ ├───/routes
│ | └───/users
│ | ├───$userId.edit.jsx
│ | ├───$userId.jsx
│ │ └───$.jsx


Для создания динамического роута необходимо начать имя файла со знака $. Чтобы получить название параметра в компоненте нужно использовать хук: const { userId } = useParams().

Также можно определять дополнительные сегменты пути роута через точку. Теперь компонент $userId.edit.jsx будет открываться по пути /users/{{user-id}}/edit.

Если нужно создать роут, который бы открывался по любому пути, нужно создать файл с названием $.jsx. Тогда, если нет подходящего роута по данному URL, будет открываться $.jsx.

https://www.smashingmagazine.com/2022/03/remix-routes-demystified/
1.1K viewsIlmir Shaikhutdinov, 13:35
Открыть/Комментировать
2022-03-30 13:30:11 Релиз React 18

На npm появилась стабильная 18 версия React.

В новой версии React появился автоматический батчинг, новое API, такое как startTransition, потоковый серверный рендер с использованием Suspense и другие улучшения.

Многие новые фичи в React 18 сделаны на основе нового конкурентного рендеринга. Особенность в том, что конкурентный рендеринг включается только тогда, когда используются фичи из его набора.

Также появились новые хуки:
- useId для генерации уникального ID на клиенте и сервере, чтобы избежать проблем с гидратацией.
- useTransition и startTransition для несрочных изменений стейта.
- useDeferredValue для несрочного рендера значений.

https://reactjs.org/blog/2022/03/29/react-v18.html
1.1K viewsIlmir Shaikhutdinov, 10:30
Открыть/Комментировать
2022-03-29 11:45:04 Критический путь рендеринга

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

При парсинге HTML браузер строит DOM дерево, для CSS строится CSSOM дерево. Если при парсинге HTML будет обнаружен JS, то он будет выполнен (если это не модуль или нет атрибута defer). Стили и JS скрипты являются блокирующими для парсера ресурсами, что может сказаться на времени критического пути рендеринга.

Чтобы ускорить время критического пути рендеринга, нужно делать оптимизацию:
- Сократить CSS ресурсы для первоначальной загрузки. Стили, которые не нужны для просмотра текущей страницы, можно загрузить после.
- Используйте ленивую загрузку. Разделяйте страницы сайта на части.
- Используйте Async, Defer, Preload для скриптов.
- Кэширование ресурсов. Можно использовать заголовки ETag, Cache-Control, Last-Modified, Expires для валидации кэша в браузере, а также ServiceWorker для ручного кэширования нужных ресурсов.

При разработке на React также стоит соблюдать правила оптимизации:
- Используйте lazy loading роуты.
- Условный рендер компонентов. Если компонент тяжелый и ,например, открывается по клику на кнопку, то можно загружать его по потребности.

https://indepth.dev/posts/1498/101-javascript-critical-rendering-path
942 viewsIlmir Shaikhutdinov, 08:45
Открыть/Комментировать
2022-03-25 11:30:57 Аналоги Storybook

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

React Cosmos
- Песочница как в Storybook. Возможность разработки компонентов в изоляции.
- Помощь в организации библиотеки компонентов. Возможность установки любых пропсов для компонентов.
- Удобный интерфейс. Есть возможность просмотра компонента в разных размерах окна.

React Styleguidist
- Автогенерация документации. Интерактивные примеры.
- Возможность написания примеров в Markdown разметке.
- Удобен для создания документации библиотеки компонентов.

Ladle
- Создан как замена Storybook разработчиками из Uber. Можно использовать в уже существующем проекте с историями Storybook.
- Production сборка проекта в 4 раза быстрее чем Storybook. Использует code splitting для разделения историй.
- Позволяет сохранять состояние компонента в URL – полезно для тестирования.
1.1K viewsIlmir Shaikhutdinov, 08:30
Открыть/Комментировать
2022-03-23 11:30:23 Тинькофф представил React фреймворк tramvai

Компания Тинькофф выложила в opensource свой React фреймворк для создания SSR приложений tramvai. Фреймворк похож на node.js фреймворк Nest.js, в нем также есть DI и модули.

Главная особенность фреймворка – очень большое количество уже готовых библиотек, которая создает целую экосистему, с помощью которой можно создавать enterprise приложения. В качестве отдельных модулей есть роутер, библиотека для тестирования, стейт менеджер, логгер и другие. Все модули подключаются к приложению через DI.

Выглядит очень необычно. Будет ли пользоваться спросом данный фреймворк где-то за пределами проектов Тинькофф – вопрос интересный.

https://tramvai.dev/
https://habr.com/ru/post/655953/
1.2K viewsIlmir Shaikhutdinov, 08:30
Открыть/Комментировать