JavaRush /Курсы /Модуль 3: React /Основы оптимизации производительности в React — почему эт...

Основы оптимизации производительности в React — почему это важно

Модуль 3: React
10 уровень , 0 лекция
Открыта

Почему оптимизация важна?

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

Когда дело доходит до производительности в React, мы сталкиваемся с двумя главными задачами:

  1. Сделать приложения быстрыми для пользователей.
  2. Уменьшить нагрузку на браузер или сервер — чтобы пользователи не начали замечать, что их вентиляторы громче, чем музыка в наушниках.

Влияние производительности на пользовательский опыт

Представьте, вы открываете сайт, но "Загрузка..." появляется так медленно, как будто данные доставляют голубиной почтой. Сколько секунд вы подождете? Скорее всего, не более 3-4 секунд. Производительность напрямую влияет на удержание пользователей. Быстро загружающееся приложение повышает шансы, что пользователь останется, а не уйдет к конкуренту.

Оптимизация производительности — это не только про скорость. Это также про отзывчивость интерфейса. Если ваше приложение лагает при каждом клике, пользователь быстро устанет и нажмет Alt+F4 (или Back на телефоне, если мы говорим о мобильных приложениях).

Главные проблемы производительности в React

React — это мощный инструмент, но бездумное использование его возможностей может привести к проблемам. Вот что мы разберем:

Избыточные рендеры

React перерендеривает компоненты, когда их состояние или пропсы меняются. Это нормально, но иногда мы запускаем ненужные рендеры: например, изменяем не то состояние, или передаем новую версию объекта в пропсы, хотя объект не изменился. Как результат, React начинает делать лишнюю работу.

Пример избыточного рендера:

import React, { useState } from "react";

const ExpensiveComponent = () => {
  console.log("Отрисовка ExpensiveComponent...");
  return <div>Я сложный компонент!</div>;
};

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

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Увеличить</button>
      <ExpensiveComponent />
    </div>
  );
};

export default App;

Каждый раз, когда вы нажимаете кнопку, ExpensiveComponent рендерится заново. Почему? Потому что родительский App рендерится, и все его потомки тоже.

Большой размер бандла

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

Пример проблемы:

Вы добавили кучу зависимостей в проект (например, огромную библиотеку визуализации данных), но используете лишь 10% ее функций. Кто в итоге платит за избыточный вес? Конечно же, пользователи.

План действий: как улучшать производительность

1. Анализ проблем

Для начала нужно понять, откуда берутся проблемы. Например, измерить, какие компоненты тратят больше всего времени на рендеринг. Именно с этим нам помогут инструменты разработки, такие как React DevTools.

2. Устранение избыточных рендеров

Первый шаг к оптимизации — минимизировать ненужные рендеры. Для этого можно использовать такие инструменты и подходы:

  • React.memo (для мемоизации компонентов): предотвращает лишний рендер дочерних компонентов, если их пропсы не изменились.
  • Хуки: useCallback и useMemo для предотвращения лишних вычислений и создания новых функций/объектов.

3. Lazy Loading

Оптимизируйте загрузку больших бандлов, разделяя код на отдельные куски, которые будут загружаться только тогда, когда они понадобятся. Для этого используется React.lazy.

Краткий пример React.lazy:

import React, { Suspense } from "react";

const SomeBigComponent = React.lazy(() => import("./SomeBigComponent"));

const App = () => {
  return (
    <Suspense fallback={<div>Загрузка...</div>}>
      <SomeBigComponent />
    </Suspense>
);
};

Как профилировать производительность с React DevTools

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

Пошаговое руководство по профилированию:

  1. Установите React DevTools.
  2. Откройте вкладку Profiler в браузере.
  3. Нажмите кнопку "Записать" и начните взаимодействовать с приложением.
  4. Завершите запись и изучите дерево компонентов.

Что искать в профайлинге:

  • Компоненты, которые тратят слишком много времени на рендеринг.
  • Компоненты, которые рендерятся без видимой причины (не обновлялись пропсы или состояние).

Практическое применение

Эти знания чрезвычайно полезны в реальной жизни. Например, вы можете:

  • Ускорить работу сложных интерфейсов для больших данных, используя React.memo и оптимизируя рендеры.
  • Снизить стартовую загрузку страниц вашего приложения, применяя ленивую загрузку React.lazy.
  • Убедить своего клиента, что все его деньги ушли не только на кофе для программистов, но и в высокую производительность приложения.

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

1
Задача
Модуль 3: React, 10 уровень, 0 лекция
Недоступна
Избыточный рендеринг компонентов
Избыточный рендеринг компонентов
1
Задача
Модуль 3: React, 10 уровень, 0 лекция
Недоступна
Lazy Loading большого компонента
Lazy Loading большого компонента
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ