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.
Предпосылки
- Node.js & npm (или Yarn): Рекомендуется версия 18 или новее. Скачать с nodejs.org.
- Watchman (macOS/Linux): Инструмент для просмотра файлов Facebook, который улучшает производительность. Установите через Homebrew (].
- Xcode (только для iOS): Требуется для создания и тестирования на симуляторах iOS. Загрузите из Mac App Store. Убедитесь, что у вас установлены последние инструменты командной строки Xcode.
- Android Studio (только Android): Требуется для эмуляторов и инструментов Android.Настройте виртуальное устройство Android (AVD) во время установки.
Выбор между React Native CLI и Expo
Существует два основных способа начать проект React Native:
- React Native CLI: Подход с голым металлом. Вы имеете полный контроль над нативным кодом и можете интегрировать любой нативный модуль. Лучше всего подходит для проектов, которые требуют настраиваемых нативных функций или оптимизации производительности.
- Expo: Управляемая структура, построенная поверх React Native. Она абстрагирует большинство нативной конфигурации и предоставляет богатый набор предварительно построенных модулей (камера, push-уведомления и т. д.. Идеально подходит для быстрого прототипирования и проектов, которые не нуждаются в настраиваемом нативном коде. expo.dev.
Для этого руководства мы используем React Native CLI, потому что он дает вам максимальную гибкость.
npx @react-native-community/cli init MyApp
После инициализации перейдите в папку проекта и запустите , чтобы запустить пакет Metro. Затем откройте второй терминал и запустите или , чтобы запустить приложение на эмуляторе или устройстве.
Основные понятия в React Native
Освоение React Native требует понимания его основных строительных блоков, многие из которых являются прямыми расширениями React для Интернета.
Компоненты
Все в React Native является компонентом. Фреймворк предоставляет набор основных компонентов, которые отображают нативные элементы пользовательского интерфейса:
- — контейнер, поддерживающий компоновку с Flexbox, стиль и сенсорную обработку. в сети.
- — для отображения текста.В отличие от веб-хаммала, вы должны обернуть любой текст внутри .
- — Отображает локальные или удаленные изображения.
- — общий контейнер для прокрутки.
- — поле ввода текста.
- — Заставляет взгляд реагировать на краны с визуальной обратной связью.
- — компонент списка высокой производительности для больших наборов данных.
Вы также можете составить пользовательские компоненты, объединив эти примитивы. Для полного списка проверьте официальную документацию 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 для библиотек. Начните создавать сегодня — ваше первое кроссплатформенное приложение находится всего в .