什么是 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 应用那种"差一截"的体验。
核心名词解释
JSX
JavaScript XML,一种在 JS 中编写类 HTML 结构的语法扩展。React Native 组件用 JSX 描述 UI 树,由 Babel 编译为普通 JS 函数调用。
Bridge(旧架构)
旧架构中 JS 线程与原生线程通信的异步消息队列。JS 通过 JSON 序列化向原生发送指令,存在序列化开销和异步延迟,是性能瓶颈所在。
JSI(JavaScript Interface)
新架构的核心,让 JS 直接持有原生对象的 C++ 引用,实现同步调用原生方法,彻底绕过 JSON 序列化,通信延迟接近零。
Fabric
新架构的 UI 渲染层,替换旧的 UIManager。Fabric 基于 JSI,支持并发渲染(配合 React 18 Concurrent Mode),UI 更新更流畅。
Metro Bundler
React Native 专用的 JavaScript 打包工具,支持快速增量更新(Fast Refresh)、模块热替换,开发体验类似 Vite 但面向移动端。
Expo
React Native 的官方推荐开发平台,提供一套工具链(Expo CLI、EAS Build、Expo SDK)大幅简化 RN 开发流程,无需配置 Xcode 和 Android Studio 即可开始开发。
Managed Workflow
Expo 管理型工作流,Expo 完全托管原生层,开发者只写 JS/TS 代码。适合大多数应用,但不能直接添加自定义原生模块。
Bare Workflow
裸工作流,暴露 ios/ 和 android/ 原生目录,开发者可以直接修改原生代码。适合需要深度定制或集成第三方原生 SDK 的项目。
Hot Reload / Fast Refresh
代码修改后自动刷新应用界面,无需重新编译整个应用。Fast Refresh 是新版本的改进实现,能保持组件状态同时刷新,大幅提升开发效率。
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 的架构是写出高性能应用的基础。以下是新旧两种架构的线程通信模型:
旧架构(Bridge 模式)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌─────────────────┐ ┌─────────────────┐
│ JS Thread │ │ Native Thread │
│ │ │ │
│ React 渲染树 │──JSON──▶ UIManager │
│ 业务逻辑 │ 序列化 │ 原生组件创建 │
│ 事件处理 │◀─JSON── 原生事件回调 │
└─────────────────┘ 异步 └─────────────────┘
│
│ Shadow Thread(布局计算 Yoga)
▼
新架构(JSI + Fabric)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌─────────────────┐ C++引用 ┌─────────────────┐
│ JS Thread │◀────────▶│ Native Thread │
│ │ 同步调用 │ │
│ React 渲染树 │──────────▶│ Fabric Renderer │
│ 业务逻辑 │ │ 原生组件直接更新 │
└─────────────────┘ └─────────────────┘
│
│ JSI(JavaScript Interface)
│ 无 JSON 序列化,无异步等待
▼
性能提升 ~40%,支持并发渲染
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),是目前最推荐的导航方案
注意
Expo Go 调试模式不支持包含自定义原生代码的模块。如果你的项目需要第三方原生 SDK(如某些支付 SDK),需要使用
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,
},
});
提示
React Native 的样式属性名与 CSS 非常相似,但采用驼峰命名(
backgroundColor 而非 background-color),且单位默认是密度无关像素(dp),无需手动处理屏幕缩放。
推荐实践
新项目优先选择 Expo + Expo Router 组合。Expo Router v3 已经非常稳定,基于文件的路由大幅减少样板代码,且与 Expo 的其他工具无缝集成。只有在有明确的原生定制需求时,才考虑 Bare Workflow。