Представьте: вы сидите в кофейне и пытаетесь одновременно создать приложение для iOS и Android. Ваш MacBook перегревается от Xcode, эмулятор Android пожирает оперативную память, как монстр из «Шрека» пожирает закуски, а ваше здравомыслие постепенно испаряется. Встречайте React Native — фреймворк JavaScript, который похож на швейцарский армейский нож для разработки мобильных приложений, если бы швейцарские армейские ножи поставлялись с горячей перезагрузкой и экзистенциальным страхом по поводу выравнивания flexbox.
Глава 1: Настройка вашей цифровой площадки
Прежде чем мы начнём работать, давайте настроим нашу кухню: Шаг 1: Установите необходимое
# Лучше всего подавать с кофе
npm install -g react-native-cli
Шаг 2: Создайте свой проект
react-native init ВолшебствоКроссплатформенности
cd ВолшебствоКроссплатформенности
Шаг 3: Запустите сборщик Metro (это не сэндвич из метро)
npx react-native start
Теперь откройте другой терминал и запустите вашу платформу на выбор:
# Для iOS (требуется macOS)
npx react-native run-ios
# Для Android (требуется 8 ГБ терпения)
npx react-native run-android
Глава 2: Танго платформ
Давайте создадим кнопку, которая знает свою платформу:
// PlatformButton.js
import { Platform, TouchableOpacity, Text } from 'react-native';
const PlatformButton = ({ title }) => (
<TouchableOpacity
style={{
backgroundColor: Platform.OS === 'ios' ? '#007AFF' : '#34C759',
padding: Platform.select({ ios: 12, android: 16 })
}}
>
<Text style={{ color: 'white' }}>{title}</Text>
</TouchableOpacity>
);
Вот так! Кнопка, которая автоматически:
- Окрашивается в синий цвет iOS на iPhone;
- Светится зелёным Android на Pixels;
- Регулирует отступы, как суетливый дизайнер интерьеров.
Глава 3: Уловки навигации
Давайте добавим навигацию с помощью React Navigation:
npm install @react-navigation/native @react-navigation/stack
Затем создайте структуру навигации:
// NavigationSetup.js
import { createStackNavigator } from '@react-navigation/stack';
const Stack = createStackNavigator();
const AppNavigator = () => (
<Stack.Navigator>
<Stack.Screen
name="Главная"
component={HomeScreen}
options={{ title: 'Добро пожаловать в Кросс-платформенный Цирк' }}
/>
<Stack.Screen
name="Подробности"
component={DetailsScreen}
options={{ headerShown: false }}
/>
</Stack.Navigator>
);
Совет от профессионала: навигация похожа на свидания — всё дело в плавных переходах и в том, чтобы не потерять свой стек.
Глава 4: Танец данных
Давайте реализуем специфичное для платформы хранилище данных:
// StorageService.js
import { Platform } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage'; // iOS
import SQLite from 'react-native-sqlite-storage'; // Android
const getStorage = async () => {
if (Platform.OS === 'android') {
return SQLite.openDatabase({ name: 'app.db' });
}
return AsyncStorage;
};
const saveData = async (key, value) => {
const storage = await getStorage();
// Реализация различается между платформами...
};
Здесь React Native проявляет себя во всей красе — напишите один раз, абстрагируйте детали платформы и избегайте поддержки двух отдельных кодовых баз, как будто они враждующие братья и сёстры.
Глава 5: Истории отладки
Когда что-то идёт не так (а так и будет), попробуйте следующие средства спасения:
- Встряска истины (Cmd+D/Ctrl+M) Ваш телефон не одержим — это просто меню разработчика
- Flipper Потому что каждое приложение заслуживает собственной приборной панели подводной лодки
- Специфичные для платформы точки останова
if (__DEV__ && Platform.OS === 'ios') {
console.log('Отладка на iOS? Время пополнить запас кофе!');
}
Помните: сбой приложения — это всего лишь способ вселенной сказать: «Прогуляйтесь».
Глава 6: Когда платформы сталкиваются
Иногда вам нужно перейти на полностью нативную версию. Вот как создавать специфичные для платформы файлы:
src/
├── components/
│ ├── FancyComponent.android.js
│ └── FancyComponent.ios.js
React Native автоматически выбирает нужный файл, словно экстрасенс, сортирующий код. Используйте это для:
- Специфичных для платформы анимаций;
- Интеграций с нативными SDK;
- Когда iOS нужны закруглённые углы, а Android предпочитает острые края.
Эпилог: Продолжение кросс-платформенного крестового похода
После 15 чашек кофе и 3 экзистенциальных кризисов у вас теперь есть:
- Единая кодовая база, работающая на нескольких платформах;
- Оптимизация для конкретных платформ;
- Навигация, которая не вызывает у пользователей морскую болезнь;
- Возможность определять iOS/Android без использования анализа пользовательских агентов. Помните, React Native не о совершенстве — он о том, чтобы выпускать продукты быстрее, чем стартап сжигает наличные деньги на взлётной полосе. Теперь идите вперёд и сделайте что-то, что вылетает на всех платформах одинаково! (Шутка. В основном.) Последний совет от профессионала: когда кто-то говорит: «Но как же Flutter?», просто улыбнитесь и прошепчите: «JavaScript-экосистема», медленно отступая назад.