Код-ревью Senior Архитектура и новая архитектура обновлено

Код-ревью: синхронные вызовы натива

Вопрос

Компонент использует TurboModule с синхронными методами. Найдите проблемы.

import NativeCrypto from './specs/NativeCrypto';
import NativeFiles from './specs/NativeFiles';

export function Gallery({ paths }: { paths: string[] }) {
  const hashes = paths.map((p) => NativeCrypto.sha256FileSync(p));
  const thumbs = paths.map((p) => NativeFiles.readBase64Sync(p));

  useEffect(() => {
    NativeFiles.addListener('changed', () => forceUpdate());
  }, []);

  return (
    <ScrollView>
      {thumbs.map((b64, i) => (
        <Image key={i} source={{ uri: `data:image/jpeg;base64,${b64}` }} style={{ width: 80, height: 80 }} />
      ))}
    </ScrollView>
  );
}

Коротко

JSI сделал синхронные вызовы возможными, но не бесплатными: пока натив работает, JS-поток стоит. Синхронно можно отдавать только мгновенные значения (флаг, константа).

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

  1. Производительностьстрока 5
    Синхронное хеширование файлов в рендере блокирует JS-поток на всё время работы натива. Долгие операции делают асинхронными (Promise) и вне рендера.
  2. Производительностьстрока 6
    Файлы целиком читаются в base64 и гоняются через границу JS и натива: большие строки в памяти JS. Картинки показывают по пути к файлу (file://), миниатюры готовит натив.
  3. Ошибкастрока 9
    Подписка на нативное событие не снимается: нет return () => sub.remove(). Утечка и обновление размонтированного компонента.
  4. Производительностьстрока 13
    ScrollView с map по всем картинкам: нет виртуализации. Нужен FlatList или FlashList.
  5. Стильстрока 14
    Ключ по индексу: при изменении списка картинки перепутаются. Использовать путь как ключ.

Разбор

JSI сделал синхронные вызовы возможными, но не бесплатными: пока натив работает, JS-поток стоит. Синхронно можно отдавать только мгновенные значения (флаг, константа). Большие данные не пересекают границу: передаются пути, а тяжёлая обработка идёт на нативной стороне в фоне.

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

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