Код-ревью Middle Нативные модули обновлено

Код-ревью: JS-обёртка нативного модуля

Вопрос

Обёртка над нативным модулем геолокации и хук для экрана. Найдите проблемы.

import { NativeModules, NativeEventEmitter } from 'react-native';
const { Geo } = NativeModules;
const emitter = new NativeEventEmitter(Geo);

export function useLocation() {
  const [pos, setPos] = useState(null);
  useEffect(() => {
    emitter.addListener('location', setPos);
    Geo.start();
  });
  return pos;
}

export function getAddressSync(lat: number, lon: number): string {
  return Geo.reverseGeocodeSync(lat, lon);
}

Коротко

Правильная обёртка: типизированная спецификация, эффект с пустыми зависимостями и очисткой (sub.remove(), Geo.stop()), запрос разрешения перед стартом, асинхронные методы для долгих операций.

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

  1. Стильстрока 2
    Доступ через NativeModules без спецификации: нет проверки типов, модуль не ленивый. В новой архитектуре нужна спецификация TurboModule и TurboModuleRegistry.
  2. Ошибкастрока 7
    Эффект без массива зависимостей: на каждом рендере добавляется новый слушатель и заново вызывается start().
  3. Ошибкастрока 8
    Подписка не снимается и геолокация не останавливается: нет очистки с remove() и Geo.stop(). Утечка и расход батареи.
  4. Производительностьстрока 15
    Синхронный обратный геокодинг ходит в сеть или базу и блокирует JS-поток. Сделать асинхронным с Promise.
  5. Ошибкастрока 9
    Нет запроса разрешения и обработки отказа: start() без разрешения упадёт или молча ничего не вернёт.

Разбор

Правильная обёртка: типизированная спецификация, эффект с пустыми зависимостями и очисткой (sub.remove(), Geo.stop()), запрос разрешения перед стартом, асинхронные методы для долгих операций.

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

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