Код-ревью 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()), запрос разрешения перед стартом, асинхронные методы для долгих операций.
Что должен найти ревьюер
- Стильстрока 2Доступ через
NativeModulesбез спецификации: нет проверки типов, модуль не ленивый. В новой архитектуре нужна спецификация TurboModule иTurboModuleRegistry. - Ошибкастрока 7Эффект без массива зависимостей: на каждом рендере добавляется новый слушатель и заново вызывается
start(). - Ошибкастрока 8Подписка не снимается и геолокация не останавливается: нет очистки с
remove()иGeo.stop(). Утечка и расход батареи. - Производительностьстрока 15Синхронный обратный геокодинг ходит в сеть или базу и блокирует JS-поток. Сделать асинхронным с
Promise. - Ошибкастрока 9Нет запроса разрешения и обработки отказа:
start()без разрешения упадёт или молча ничего не вернёт.
Разбор
Правильная обёртка: типизированная спецификация, эффект с пустыми зависимостями и очисткой (sub.remove(), Geo.stop()), запрос разрешения перед стартом, асинхронные методы для долгих операций.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.