前三个阶段你一直在 Web 领域打转——HTML/CSS/JS、React、Next.js,所有代码最终跑在浏览器里。现在,你要把同样的 React 知识搬进手机。React Native 就是这座桥。
React Native 是 Meta(原 Facebook)在 2015 年开源的跨平台移动开发框架。你用 JavaScript 和 React 语法写代码,它把你写的 <View>、<Text> 渲染成 Android 的 android.view.View 和 iOS 的 UIView——真正的原生 UI 组件,不是嵌套网页。
打个比方:WebView 方案像在手机屏幕上贴一张网页的打印照片,看起来像但摸起来不对——没有原生滚动惯性、没有原生手势、长按弹不出系统菜单。React Native 则像一位双语建筑师,你用 React 的设计图纸(JSX),他用 Android 的砖块(Kotlin/Compose)和 iOS 的砖块(Swift/UIKit)实打实地砌出一栋原生的房子。
React Native 的核心架构在 2024 年完成了从"Bridge 时代"到"新架构时代"的切换。理解这个演进,你才能明白为什么 0.87 版本敢说自己是"生态级变革"。
| 维度 | 旧架构(Bridge) | 新架构(Fabric + TurboModules) |
|---|---|---|
| 通信方式 | 异步 JSON 消息队列 | 同步 JSI 直接调用 |
| 渲染管线 | 三层异步(Shadow Tree → Yoga → Native) | 单层同步(C++ Shadow Tree 直接提交) |
| 原生模块 | NativeModules(初始化时全量加载) | TurboModules(按需懒加载) |
| Bridge 回退 | 支持 legacy interop | 0.85 起彻底移除,无回退 |
JSI(JavaScript Interface)是新架构的基石。旧架构中,JS 和原生之间靠一个异步消息队列通信,每次调用都要序列化/反序列化 JSON 数据。JSI 则允许 JavaScript 直接持有 C++ 对象的引用,调用原生方法就像调用普通 JS 函数一样同步——没有中间层,没有序列化开销。
React Native 0.85(2026 年 4 月发布)是第一个完全基于新架构的稳定版,彻底移除了 Bridge 回退层。到 0.87(2026 年 8 月发布),新架构已经成熟,带来了 Strict TypeScript API、Metro 0.87 和实验性 Swift Package Manager 支持。
npx @react-native-community/cli@latest doctor 检查环境兼容性。你已经理解了 React Native 的跨平台原理。但如果直接用裸 React Native(Bare Workflow),光配 iOS 的 CocoaPods 和 Android 的 Gradle 就能卡住新手一整天。Expo 就是为了消除这个痛点而生的。
Expo 是建立在 React Native 之上的完整开发平台。你可以把它类比为 React 生态中的 Vite + Vercel:本地提供脚手架和开发服务器,云端提供构建打包和热更新服务。一行命令创建项目,手机扫二维码就能预览,不用打开 Xcode 或 Android Studio。
| 能力 | Bare React Native | Expo |
|---|---|---|
| 项目创建 | 手动配 Xcode + Android Studio | 一行 npx create-expo-app |
| 真机预览 | 编译 IPA/APK 再安装 | Expo Go 扫码秒开 |
| 原生模块 | 手动 link + pod install | expo install 自动兼容 |
| 打包发布 | 本地或自建 CI 编译 | EAS Build 云端一键打包 |
| 热更新 | 自建 CodePush 服务 | EAS Update 原生集成 |
Expo 不只是一个脚手架,它是一整套工具链。你需要记住以下几个核心概念:
expo-router、expo-image、expo-secure-store 等几十个官方模块。
app/ 目录下创建文件即自动注册为路由。
eas build 在云端编译 IPA/APK,eas submit 直接提交到 App Store / Google Play。
Expo SDK 57 于 2026 年 6 月 30 日发布,搭载 React Native 0.86,带来了 Expo UI 生产就绪、更快的原生构建速度、以及 expo prebuild 默认启用等特性。SDK 58 正在 canary 阶段开发中,将支持 React Native 0.87。
npx expo prebuild 生成原生项目,或用 Development Build 替代 Expo Go。理论够了,动手。以下在 macOS 上演示完整流程(唯一能同时编译 Android 和 iOS 的平台)。Termux 用户注意:React Native 开发需要 Xcode 和 Android Studio,Termux 无法参与本阶段。
React Native 0.87 要求 Node.js 22 以上版本。用 nvm 管理版本最方便:
不需要全局安装任何 CLI,用 npx 直接运行:
终端会显示一个二维码和开发服务器菜单。此时你有三种方式预览 App:
手机装 Expo Go App,扫终端二维码秒开。最快但限制最多。
终端按 i 启动。需先装 Xcode(App Store 免费)。
终端按 a 启动。需先装 Android Studio。
如果只用 Expo Go 预览,可以跳过本步。但要编译发布原生包,必须安装完整工具链:
sudo xcode-select --install 安装 Command Line Tools
npx create-expo-app 创建。
npx create-expo-app@latest,它自动配置好 Expo Router、TypeScript 和新架构。
你已经用 create-expo-app 创建了项目。现在来理解每个文件的作用——这跟你在阶段三熟悉的 Next.js 结构很像,但有关键区别。
跟 Next.js 一样,app/ 目录下的文件自动映射为路由。_layout.tsx 是根布局组件,所有页面都在它内部渲染。index.tsx 对应根路径 /,about.tsx 对应 /about。
这是 create-expo-app 默认生成的首页。你看到了熟悉的 React 语法,但组件名不再是 div / span:
看到区别了吗?Web 里你写 <div> 和 <span>,这里变成了 <View> 和 <Text>。样式也从 className + CSS 文件变成了 StyleSheet.create + 内联 style 对象。
div、span、img 等任何 HTML 标签。所有文本必须放在 <Text> 组件内——裸写文本会报错。<View> 相当于 div,但默认使用 flex 布局(flexDirection 默认 column)。你已经看到了 View 和 Text。React Native 的组件库远不止这两个——以下是你在 90% 场景中会用到的核心组件。
| Web HTML | RN 组件 | 用途 |
|---|---|---|
<div> |
<View> |
容器、布局 |
<span>/<p> |
<Text> |
文本显示 |
<button> |
<Pressable> |
可点击区域 |
<img> |
<Image> |
图片 |
<input> |
<TextInput> |
文本输入框 |
overflow:auto |
<ScrollView> |
滚动容器 |
<ul>/<li> |
<FlatList> |
高性能长列表 |
Web 里你用 onClick 处理点击。React Native 用 Pressable 组件,它比旧的 TouchableOpacity 更灵活,能感知按下/抬起/移入/移出等完整触摸生命周期。
关键变化:onClick 变成了 onPress,style 支持函数形式,通过 pressed 参数感知按压状态实现视觉反馈——这是原生应用体验的关键。
如果用 ScrollView 渲染 1000 条数据,所有行都会一次性创建——内存爆炸。FlatList 采用虚拟化(virtualization),只渲染屏幕可见区域 + 少量缓冲区的行,滚动时动态回收复用。
你在阶段三已经熟练使用 Tailwind 和 CSS 写样式了。React Native 的样式系统跟 Web CSS 有 80% 相似,但那 20% 的差异会让你频繁踩坑。
React Native 不用 CSS 文件,所有样式通过 JavaScript 对象定义。StyleSheet.create 会将样式对象注册为引用 ID,避免每次渲染创建新对象,同时提供属性名校验(写错属性名会在开发时报警告)。
| Web CSS | React Native |
|---|---|
margin-top: 16px; |
marginTop: 16 |
background-color: #fff |
backgroundColor: '#fff' |
font-size: 14px |
fontSize: 14 |
| className 引用样式表 | style 属性内联传对象 |
| 单位 px / rem / % | 纯数字(代表 dp/pt) |
这是 Web 开发者转 RN 最容易踩的坑:Web 的 display:flex 默认 flexDirection: row(水平排列),而 React Native 默认 flexDirection: column(垂直排列)。
要水平排列子元素,必须显式设置 flexDirection: 'row'。
<Text> 内嵌套的 <Text> 会继承父 Text 的文字样式,<View> 之间不继承任何样式。
style 属性。
你在阶段三已经用 Next.js 的 App Router 体验过文件路由。Expo Router 几乎完全一致——目录即路由,文件即页面。这让 Web 开发者转 RN 几乎零学习成本。
| 文件路径 | 路由 URL |
|---|---|
app/index.tsx |
/(首页) |
app/about.tsx |
/about |
app/(tabs)/home.tsx |
/home(分组不出现在 URL) |
app/post/[id].tsx |
/post/42(动态路由) |
跟 Next.js 的 useRouter 一样,Expo Router 提供 useRouter 和 useLocalSearchParams 钩子:
两种跳转方式:命令式用 router.push(),声明式用 <Link> 组件。asChild 属性让 Link 把导航行为委托给子组件,保持你的自定义样式。
app/post/[id].tsx 中读取参数:const { id } = useLocalSearchParams()。这跟 Next.js 的 useParams 完全一致。初学 React Native 最容易踩的坑几乎都来自「Web 思维惯性」。下面列出的四个错误覆盖了 80% 的新手问题。
<Text> 组件内。在 <View> 中直接写裸文字会报错。
<View><Text>Hello</Text></View>
display 属性只支持 flex 和 none,不支持 block / inline / grid。
flexDirection、alignItems、justifyContent 控制排列。
react-native-safe-area-context 的 SafeAreaView 包裹根布局,Expo Router 默认已内置。
div → View,span / p → Text,button → Pressable。
react-native 导入核心组件,不使用任何 HTML 标签。
source={require('./img.png')} 而非 source={uri}Platform.OS === 'ios' 或 Platform.select() 做平台分支从易到难三个梯度,建议按顺序完成。每个练习的代码在本地 Expo Go 中即时预览效果。
Math.max(0, count - 1) 防止负数/post/[id])、关于页。用 FlatList 渲染列表,点击跳转详情页,详情页用 useLocalSearchParams 读取 id 并显示对应内容。posts 数组,按 id 查找内容useState 管理状态,用 StyleSheet.create 定义样式,添加 Platform.OS 判断让 iOS 和 Android 有不同的输入框圆角。type Todo = { id: number; text: string; done: boolean }用下面这些关键词自测掌握程度,每个标签对应一个核心概念: