The Ultimate Руководство по созданию кросс-платформенных приложений Реакция нативная

Что такое React Native?

React Native - это фреймворк с открытым исходным кодом, разработанный Facebook, который позволяет разработчикам создавать мобильные приложения с использованием JavaScript и React. В отличие от традиционных гибридных подходов, которые отображают веб-просмотры, React Native компилирует нативные компоненты платформы. Это означает, что интерфейс приложения построен с реальными нативными представлениями (например, FLT:0 на iOS и FLT:1 на Android), что приводит к производительности, которая близко соответствует полностью нативным приложениям. Рамка также позволяет значительно обмениваться кодом на iOS и Android - часто 80-90% - резко сокращая время разработки и затраты на обслуживание.

React Native был впервые выпущен в 2015 году и с тех пор был принят крупными компаниями, включая Instagram, Shopify и Discord. Его яркое сообщество и экосистема библиотек делают его практичным выбором как для стартапов, так и для предприятий.

Начало работы с React Native: Environment Setup

Перед написанием любого кода React Native вам необходимо настроить среду разработки.Точные шаги различаются в зависимости от того, нацелены ли вы на iOS, Android или оба, и используете ли вы React Native CLI или Expo.

Предпосылки

Выбор между React Native CLI и Expo

Существует два основных способа начать проект React Native:

Для этого руководства мы используем React Native CLI, потому что он дает вам максимальную гибкость.

npx @react-native-community/cli init MyApp

После инициализации перейдите в папку проекта и запустите , чтобы запустить пакет Metro. Затем откройте второй терминал и запустите или , чтобы запустить приложение на эмуляторе или устройстве.

Основные понятия в React Native

Освоение React Native требует понимания его основных строительных блоков, многие из которых являются прямыми расширениями React для Интернета.

Компоненты

Все в React Native является компонентом. Фреймворк предоставляет набор основных компонентов, которые отображают нативные элементы пользовательского интерфейса:

Вы также можете составить пользовательские компоненты, объединив эти примитивы. Для полного списка проверьте официальную документацию React Native.

Государство и предложения

Это те же самые понятия, что и в React для Интернета:

  • Пропсы: Короткие по свойствам. Они представляют собой значения только для чтения, передаваемые от родительского компонента к детскому компоненту. Они конфигурируют поведение или внешний вид ребенка.
  • Государство: Изменяемые данные, управляемые в пределах компонента. При изменении состояния компонент переоформляется. Используйте крючок (функциональные компоненты) или (компоненты класса).

Пример:

import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';

const Counter = () => {
 const [count, setCount] = useState(0);
 return (
 <View>
 <Text>You pressed {count} times</Text>
 <Button title="Press me" onPress={() => setCount(count + 1)} />
 </View>
 );
};
export default Counter;

Навигация

Навигация не встроена в React Native core. Наиболее популярным решением является React Navigation. Она обеспечивает стек навигатора (как навигационный стек), навигатор вкладки и навигатор ящика. Установите его с:

npm install @react-navigation/native @react-navigation/stack

После установки заверните приложение и определите свои экраны:

import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

function App() {
 return (
 <NavigationContainer>
 <Stack.Navigator>
 <Stack.Screen name="Home" component={HomeScreen} />
 <Stack.Screen name="Details" component={DetailsScreen} />
 </Stack.Navigator>
 </NavigationContainer>
 );
}

укладка

React Native использует объекты JavaScript для стилизации вместо CSS. Вы определяете стили с помощью или встроенных объектов. Движок компоновки по умолчанию Flexbox, со свойствами, такими как , , . Медиазапросов CSS нет; адаптивный дизайн достигается через API или библиотеки, такие как .

Создание вашего первого кросс-платформенного приложения: пример шаг за шагом

Давайте создадим простое приложение погоды, которое извлекает данные из общедоступного API и отображает их на обеих платформах. Это продемонстрирует управление состоянием, сетевые запросы и состав компонентов.

Шаг 1: Настройка проекта

Создайте новый проект с помощью React Native CLI:

npx @react-native-community/cli init WeatherApp
cd WeatherApp

Шаг 2: Установите зависимости

Нам нужно несколько пакетов:

npm install @react-navigation/native @react-navigation/stack react-native-screens react-native-safe-area-context

Для вызова API мы будем использовать встроенный API . Опционально установите для значков.

Шаг 3: Создайте домашний экран

Создайте :

import React, { useState, useEffect } from 'react';
import { View, Text, TextInput, Button, StyleSheet, ActivityIndicator } from 'react-native';

const API_KEY = 'YOUR_OPENWEATHERMAP_API_KEY';
const BASE_URL = 'https://api.openweathermap.org/data/2.5/weather';

const HomeScreen = () => {
 const [city, setCity] = useState('');
 const [weather, setWeather] = useState(null);
 const [loading, setLoading] = useState(false);
 const [error, setError] = useState(null);

 const fetchWeather = async () => {
 if (!city.trim()) return;
 setLoading(true);
 setError(null);
 try {
 const response = await fetch(`${BASE_URL}?q=${city}&appid=${API_KEY}&units=metric`);
 const data = await response.json();
 if (data.cod !== 200) {
 setError(data.message);
 } else {
 setWeather(data);
 }
 } catch (err) {
 setError('Network error');
 } finally {
 setLoading(false);
 }
 };

 return (
 <View style={styles.container}>
 <Text style={styles.title}>Weather App</Text>
 <TextInput
 style={styles.input}
 placeholder="Enter city name"
 value={city}
 onChangeText={setCity}
 />
 <Button title="Get Weather" onPress={fetchWeather} />
 {loading && <ActivityIndicator size="large" />}
 {error && <Text style={styles.error}>{error}</Text>}
 {weather && (
 <View style={styles.weatherContainer}>
 <Text style={styles.cityName}>{weather.name}</Text>
 <Text>Temperature: {weather.main.temp}°C</Text>
 <Text>Conditions: {weather.weather[0].description}</Text>
 </View>
 )}
 </View>
 );
};

const styles = StyleSheet.create({
 container: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20 },
 title: { fontSize: 24, fontWeight: 'bold', marginBottom: 20 },
 input: { borderWidth: 1, borderColor: '#ccc', borderRadius: 5, width: '80%', padding: 10, marginBottom: 10 },
 error: { color: 'red', marginTop: 10 },
 weatherContainer: { marginTop: 20, alignItems: 'center' },
 cityName: { fontSize: 20, fontWeight: '600', marginBottom: 10 }
});

export default HomeScreen;

Шаг 4: Проводите навигацию

В , импортировать навигатор и экран:

import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import HomeScreen from './screens/HomeScreen';

const Stack = createStackNavigator();

export default function App() {
 return (
 <NavigationContainer>
 <Stack.Navigator>
 <Stack.Screen name="Home" component={HomeScreen} options={{ title: 'Weather' }} />
 </Stack.Navigator>
 </NavigationContainer>
 );
}

Шаг 5: Запустите приложение

Запустите Metro bundler (), затем запустите Android () или iOS (). После успешного вызова API вы должны увидеть ввод текста, кнопку и данные о погоде.

Это базовое приложение работает на обеих платформах с идентичным кодом JavaScript.

Преимущества использования React Native

  • Обмен бизнес-логикой, управлением состоянием и компонентами пользовательского интерфейса на разных платформах. Вы даже можете повторно использовать код с веб-приложением с помощью React Native для Web.
  • Производительность: Производительность, близкая к исходной, потому что пользовательский интерфейс визуализируется с использованием нативных компонентов, а не веб-просмотров. Нить JavaScript работает асинхронно, и тяжелые вычисления могут быть выгружены на нативные модули.
  • Большое сообщество и кампус; Экосистема: Тысячи библиотек, яркое сообщество на GitHub и обширные инструменты. Проблемы хорошо документированы, и плагины существуют практически для каждой потребности.
  • Быстрая разработка с горячей перезагрузкой: Пакет Metro поддерживает замену горячего модуля (HMR). Вы можете редактировать код и мгновенно видеть изменения без восстановления всего приложения.
  • Обновления вне сети: С помощью таких сервисов, как Microsoft App Center или CodePush, вы можете напрямую нажимать обновления JavaScript и активов на пользователей без одобрения магазина приложений.
  • Стоимость: Одна команда может поддерживать единую кодовую базу вместо двух отдельных родных команд. Это снижает как затраты на разработку, так и на техническое обслуживание.

Проблемы и ограничения

Несмотря на свои сильные стороны, React Native не является серебряной пулей.

  • Нативные модули: Когда вам нужно получить доступ к функциям устройства, не охваченным основными или общественными библиотеками (например, расширенный Bluetooth, пользовательские фильтры камеры), вы должны написать код для платформы в Java/Kotlin (Android) или Objective-C/Swift (iOS).
  • Бутылочные узлы производительности: React Native опирается на мост между JavaScript и нативными потоками. Очень сложные анимации, графика в реальном времени (например, 3D-игры) или тяжелая обработка данных могут вызвать jank. Для большинства бизнес-приложений производительность адекватна, но для игр или интенсивных приложений считают Flutter или полнородным.
  • Сложность отладки: Хотя инструменты отладки улучшились, устранение ошибок, характерных для платформы, может быть сложным. Проблемы могут возникать только на определенных устройствах Android или версиях iOS. Сообщество React Native и такие инструменты, как Flipper, помогают, но опыт отладки не так бесшовен, как нативная разработка.
  • Постоянство интерфейса: Поскольку каждая платформа отображает компоненты по-разному (например, имеет разные внешний вид на iOS и Android), вам может потребоваться написать стили или компоненты, специфичные для платформы. API помогает обнаружить ОС, но поддержание действительно идеального дизайна на обеих платформах может занять много времени.
  • Размер приложения: Нативные приложения React, как правило, больше, чем полностью нативные приложения из-за включения движка JavaScript (Hermes или JavaScriptCore).Средний размер на 10-20 МБ больше, чем нативный эквивалент.

Темы для обсуждения: когда вам нужно больше

Взаимодействие с родными модулями

Чтобы преодолеть разрыв, когда библиотеки JavaScript не существует, можно написать собственный модуль. Например, использовать аппаратный датчик, не поддерживаемый пакетом сообщества:

  • На Android: Создайте класс Java, который расширяет и зарегистрируйте его в пакете.
  • На iOS: Создайте класс Swift/ObjC, который реализует протокол .
  • Назовите его по имени JavaScript:

Стратегии оптимизации производительности

  • Использовать Hermes: Hermes — это движок JavaScript, оптимизированный для мобильных устройств.Включить его в и . Он сокращает время запуска и использование памяти.
  • FlatList vs ScrollView: Используйте или для длинных списков. Они перерабатывают просмотры и избегают рендеринга вне экрана.
  • Мемоизация: Используйте и , чтобы предотвратить ненужные повторные рендеры.
  • Менеджер взаимодействия: Отсрочить тяжелые вычисления до завершения анимации или переходов.
  • Нативный драйвер для анимаций: Используйте при анимации неслойных свойств (непрозрачность, трансформация).
  • Каширование изображений: Заменить стандартный компонент для лучшего управления памятью и кэширования.

Тестирование вашего приложения

React Native поддерживает различные стратегии тестирования:

  • Единичное тестирование: Используйте Jest (предварительно сконфигурированный) для тестирования чистых функций и логики.
  • Тестирование компонентов: Используйте библиотеку тестирования React Native для визуализации компонентов и тестирования взаимодействия пользователей.
  • Конечное тестирование: Detox by Wix — популярная серая коробка E2E-тестирования, которая работает на реальных устройствах и симуляторах. Она имитирует действия пользователей и проверяет состояние пользовательского интерфейса.

Развертывание в App Stores

Перед развертыванием убедитесь, что у вас есть готовая к производству сборка:

  • Настройте значки приложений и экраны брызг для обеих платформ.
  • Установите версию приложения и введите номер в и нативные файлы конфигурации.
  • Для Android: Создайте подписанный APK или AAB с помощью магазина ключей Android Studio. Затем загрузите в Google Play Console.
  • Для iOS: Архивируйте приложение в Xcode (Product > Archive), подписывайтесь с сертификатом распространения и загружайте через Xcode или Transporter в App Store Connect.
  • Подумайте об использовании услуг непрерывной интеграции, таких как GitHub Actions или Bitrise, для автоматизации строительства и подписания.

Реальные примеры реактивных нативных приложений

  • Instagram (Explore Tab / Threads): Instagram использует React Native для частей своего приложения, включая вкладку Explore и автономное приложение Threads. Они достигли кросс-платформенного обмена кодом при сохранении нативного ощущения.
  • Discord (Mobile): Мобильное приложение Discord построено с помощью React Native. Они воспользовались движком Hermes для производительности и совместного использования кода между Android и iOS.
  • Walmart: Розничный гигант перестроил свое мобильное приложение с помощью React Native, достигнув почти одинакового опыта на обеих платформах и сократив время разработки.
  • Uber Eats (Restaurant Dashboard): Uber Eats использует React Native для своей панели приборов, ориентированной на ресторан, что позволяет быстро итерировать и развертывать кроссплатформенные решения.

Заключение

React Native остается лучшим выбором для кроссплатформенной мобильной разработки из-за баланса между производительностью, опытом разработчиков и возможностью повторного использования кода. Хотя у него есть ограничения, особенно в отношении приложений с интенсивной графикой и сложностью родных модулей, он превосходит большинство стандартных мобильных приложений, от электронной коммерции до социальных сетей и корпоративных инструментов.

Овладев основными понятиями (компоненты, состояние, навигация, стиль), используя обширную библиотечную экосистему и следуя лучшим практикам для производительности и тестирования, вы можете доставлять высококачественные приложения как для пользователей iOS, так и для пользователей Android с единой кодовой базой. Используйте официальную документацию React Native в качестве основного ориентира и изучите ресурсы сообщества, такие как React Native Directory для библиотек. Начните создавать сегодня — ваше первое кроссплатформенное приложение находится всего в .