Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про React: react, optimization

Дан компонент из 1000 строк, который тормозит. В нем галерея из 100 картинок (10% битых) и большой список элементов. С чего начнешь оптимизацию и с помощью каких средств?

Этот вопрос проверяет системный подход к оптимизации производительности React компонентов.

Короткий ответ

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

Длинный ответ

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

План оптимизации:

1. Анализ и профилирование:

// React DevTools Profiler
// - Запись взаимодействий
// - Поиск "expensive" компонентов
// - Анализ времени рендера

// Chrome DevTools Performance tab
// - Record performance
// - Identify bottlenecks
// - Memory leaks detection

2. Разделение компонента:

// Вместо одного большого компонента
const BigComponent = () => {
  // 1000 строк кода
};

// Разделить на логические части
const OptimizedComponent = () => (
  <>
    <Gallery images={images} />
    <ItemList items={items} />
    <UserPanel user={user} />
  </>
);

3. Оптимизация ре-рендеров:

// React.memo для предотвращения лишних рендеров
const Gallery = React.memo(({ images }) => {
  return images.map(image => (
    <Image key={image.id} src={image.url} />
  ));
});

// useMemo для тяжелых вычислений
const processedItems = useMemo(() => {
  return items.map(heavyTransformation);
}, [items]);

// useCallback для стабильных ссылок
const handleClick = useCallback((id) => {
  // обработка клика
}, []);

4. Виртуализация списка:

// Использование react-window или react-virtualized
import { FixedSizeList as List } from 'react-window';

const VirtualizedList = ({ items }) => (
  <List
    height={400}
    itemCount={items.length}
    itemSize={50}
  >
    {({ index, style }) => (
      <div style={style}>
        {items[index].name}
      </div>
    )}
  </List>
);

5. Оптимизация изображений:

// Lazy loading с Intersection Observer
const LazyImage = ({ src, alt }) => {
  const [isVisible, setIsVisible] = useState(false);
  const imgRef = useRef();

  useEffect(() => {
    const observer = new IntersectionObserver(([entry]) => {
      setIsVisible(entry.isIntersecting);
    });
    observer.observe(imgRef.current);
    return () => observer.disconnect();
  }, []);

  return (
    <div ref={imgRef}>
      {isVisible && <img src={src} alt={alt} />}
    </div>
  );
};

6. Обработка битых картинок:

const ImageWithFallback = ({ src, alt, fallback }) => {
  const [hasError, setHasError] = useState(false);
  const [currentSrc, setCurrentSrc] = useState(src);

  const handleError = () => {
    if (!hasError) {
      setHasError(true);
      setCurrentSrc(fallback);
    }
  };

  return (
    <img 
      src={currentSrc} 
      alt={alt}
      onError={handleError}
      loading="lazy"
    />
  );
};

Инструменты для диагностики:

  • React DevTools Profiler

  • Chrome Performance tab

  • Lighthouse audit

  • why-did-you-render для отладки ре-рендеров

Приоритеты оптимизации:

  1. Устранение bottlenecks (узких мест)

  2. Снижение количества ре-рендеров

  3. Оптимизация больших списков

  4. Ленивая загрузка контента

  5. Кэширование вычислений

Уровень

  • Рейтинг:

    1

  • Сложность:

    9

Навыки

  • React

    React

Ключевые слова

#react

#optimization

Подпишись на React Developer в телеграм