什么是 React Native
React Native 由 Facebook(现 Meta)于 2015 年开源,是目前最主流的跨平台移动开发框架之一。它的核心理念是 Learn Once, Write Anywhere——不同于 Cordova/Ionic 的"Write Once, Run Anywhere",React Native 允许开发者用同一套 React 知识体系开发 iOS 和 Android 应用,但每个平台可以根据需要做定制化适配。
React Native 最关键的特性是:它渲染的是真正的原生组件,而不是 WebView 包裹的 HTML。当你写 <View> 时,iOS 上会渲染为 UIView,Android 上渲染为 android.view.View。这意味着 React Native 应用的 UI 性能和原生开发相差无几,而不是 Hybrid 应用那种"差一截"的体验。
核心名词解释
RN vs Flutter vs 原生开发
选择跨平台框架还是原生开发,是每个移动项目必须面对的决策。下表从多个维度对比主流方案:
| 维度 | React Native | Flutter | iOS/Android 原生 |
|---|---|---|---|
| 渲染方式 | 调用平台原生组件 | 自绘 UI(Skia/Impeller) | 完全原生组件 |
| 语言 | JavaScript / TypeScript | Dart | Swift / Kotlin |
| 性能 | 接近原生,新架构改善明显 | 高,自绘引擎稳定 60fps | 最佳,无额外层 |
| UI 一致性 | 遵循各平台设计语言 | 自定义,跨平台像素一致 | 完全原生风格 |
| 开发效率 | 高,JS 生态复用,热重载 | 高,Hot Reload 支持好 | 低,两套代码 |
| 生态 | 庞大,npm 生态可复用 | 成长中,pub.dev | 最成熟,各厂 SDK |
| 学习曲线 | 低(会 React 即可上手) | 中(需学 Dart) | 高(两种语言+平台 API) |
| 团队要求 | 前端工程师即可 | 需学 Dart,可前端转 | 需 iOS + Android 两个团队 |
| 适用场景 | 大多数商业 App | 对 UI 一致性要求高的应用 | 性能极致或强依赖原生 API |
RN 渲染架构(新旧对比)
理解 React Native 的架构是写出高性能应用的基础。以下是新旧两种架构的线程通信模型:
Expo 是什么,为什么推荐
很多初学者会困惑:React Native 官方文档说要配置 Xcode 和 Android Studio,光是环境搭建就要花几个小时甚至几天。Expo 解决了这个痛点。
使用 Expo,你不需要安装 Xcode(如果用 Expo Go 调试)或配置 Android SDK,只需要 Node.js 和一部手机。Expo 提供:
- Expo Go:手机 App,扫描二维码即可预览你的代码
- Expo SDK:封装了几十个原生模块(相机、定位、推送等),开箱即用
- EAS Build:云端构建服务,不需要本地 Xcode 就能生成 .ipa 和 .apk
- EAS Submit:自动提交到 App Store / Google Play
- Expo Router:基于文件系统的路由(类似 Next.js),是目前最推荐的导航方案
npx expo run:ios 或创建 Development Build。
环境搭建与创建第一个项目
以下是使用 Expo 快速创建项目的步骤:
- 安装 Node.js 18+(推荐 LTS 版本),前往 nodejs.org 下载
- 运行
npx create-expo-app@latest MyApp --template blank-typescript - 进入目录:
cd MyApp - 启动开发服务器:
npx expo start - 手机安装 Expo Go App,扫描终端显示的二维码
项目结构说明
# Expo Router 项目结构(推荐方案)
MyApp/
├── app/ # 路由目录(基于文件系统)
│ ├── (tabs)/ # Tab 导航组 (括号=布局文件夹)
│ │ ├── index.tsx # 首页 /
│ │ └── profile.tsx # 个人页 /profile
│ ├── _layout.tsx # 根布局(NavigationContainer)
│ └── post/[id].tsx # 动态路由 /post/123
├── components/ # 可复用组件
├── hooks/ # 自定义 Hook
├── constants/ # 颜色、配置常量
├── assets/ # 图片、字体资源
├── app.json # Expo 配置(图标、权限等)
└── tsconfig.json
第一个 App:Hello World
// app/index.tsx — 最简单的 React Native 组件
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';
import { useState } from 'react';
export default function HomeScreen() {
const [count, setCount] = useState(0);
return (
<View style={styles.container}>
<Text style={styles.title}>React Native 入门</Text>
<Text style={styles.counter}>点击次数:{count}</Text>
<TouchableOpacity
style={styles.button}
onPress={() => setCount(c => c + 1)}
>
<Text style={styles.buttonText}>点击我</Text>
</TouchableOpacity>
</View>
);
}
// StyleSheet.create 会在运行时优化样式对象,
// 并提供 TypeScript 类型检查,推荐始终使用
const styles = StyleSheet.create({
container: {
flex: 1, // 撑满整个屏幕
alignItems: 'center', // 横轴居中
justifyContent: 'center', // 主轴居中
backgroundColor: '#020d18',
},
title: {
fontSize: 24,
fontWeight: '700',
color: '#38bdf8',
marginBottom: 16,
},
counter: {
fontSize: 18,
color: '#94cfe8',
marginBottom: 24,
},
button: {
backgroundColor: '#38bdf8',
paddingHorizontal: 28,
paddingVertical: 12,
borderRadius: 10,
},
buttonText: {
color: '#020d18',
fontWeight: '700',
fontSize: 16,
},
});
backgroundColor 而非 background-color),且单位默认是密度无关像素(dp),无需手动处理屏幕缩放。
调试工具
React Native 提供多种调试手段,合理使用可以大幅提升开发效率:
# 常用调试命令
npx expo start # 启动开发服务器
npx expo start --clear # 清除 Metro 缓存重启(遇到奇怪问题时)
npx expo start --tunnel # 通过 Tunnel 模式(网络不在同一 WiFi 时)
# 清除模拟器缓存
npx expo start --reset-cache
# 查看 Android 日志
npx react-native log-android # 等效于 adb logcat
# 查看 iOS 日志
npx react-native log-ios # 等效于 Console.app
React Native 基础与环境的核心要点:① RN 渲染真正的原生组件(iOS UIView、Android View),而非 WebView,性能接近原生开发;② 旧架构通过 Bridge 异步传递 JSON 消息,新架构(JSI + Fabric)通过 C++ 引用直接同步调用,消除序列化开销;③ Expo 是 RN 开发的推荐平台——Expo Go 扫码即预览,EAS Build 云端编译,EAS Submit 自动上架;Managed Workflow 适合大多数项目,需要自定义原生代码时才切换到 Bare Workflow;④ 项目结构中 app/ 目录即路由(Expo Router 基于文件系统),_layout.tsx 是嵌套导航配置文件;⑤ 样式用 StyleSheet.create(),单位是设备无关像素(dp),属性名驼峰命名;⑥ Hermes 引擎(RN 0.70+ 默认)比 JSC 更快,支持 Chrome DevTools 直接调试;⑦ 遇到奇怪问题先用 npx expo start --clear 清除 Metro 缓存。