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