Код-ревью Middle Отладка и профилирование обновлено

Код-ревью: экран с поиском

Вопрос

Экран поиска товаров. Найдите проблемы производительности и отладки.

export function SearchScreen() {
  const [query, setQuery] = useState('');
  const { products } = useStore();
  console.log('render', products);
  const filtered = products.filter((p) => p.title.toLowerCase().includes(query.toLowerCase()));
  useEffect(() => {
    const id = setInterval(() => analytics.track('alive'), 1000);
  }, []);
  return (
    <View>
      <TextInput value={query} onChangeText={setQuery} />
      <FlatList data={filtered} renderItem={({ item }) => <ProductRow product={item} />} />
    </View>
  );
}

Коротко

Подписка на стор через селектор, логи только в debug, тяжёлые вычисления с мемоизацией и откладыванием (useDeferredValue), эффекты с очисткой, мемоизированные строки и стабильные ключи.

Что должен найти ревьюер

  1. Производительностьстрока 3
    useStore() без селектора: экран перерисовывается при любом изменении стора.
  2. Производительностьстрока 4
    Логирование всего массива товаров на каждом рендере замедляет JS-поток и засоряет логи; в релизе логи нужно убирать.
  3. Производительностьстрока 5
    Фильтрация всех товаров на каждый символ без мемоизации и дебаунса; при больших списках нужен useMemo, useDeferredValue или дебаунс.
  4. Ошибкастрока 7
    Интервал не очищается: после ухода с экрана продолжает работать, при повторных открытиях их становится больше.
  5. Производительностьстрока 12
    Инлайновый renderItem, нет keyExtractor по id и мемоизации ProductRow.

Разбор

Подписка на стор через селектор, логи только в debug, тяжёлые вычисления с мемоизацией и откладыванием (useDeferredValue), эффекты с очисткой, мемоизированные строки и стабильные ключи.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.