React Native快速入门:构建你的第一个APP
React Native快速入门:从零开始构建你的第一个APP
记得去年刚接手一个项目,团队要在三个月内上线一款跨平台的记账类APP。我们考虑过原生开发,也评估了Flutter,但最终选择了React Native。为什么?因为它在开发效率、团队协作以及现有生态方面的优势打动了我。更重要的是,它是Facebook开源的技术栈,社区活跃度高,文档和案例丰富。
作为一个前端出身的全栈开发者,我对JavaScript非常熟悉,这让我在学习React Native时少走了不少弯路。不过说实话,刚开始的时候我也遇到了不少问题:比如iOS和安卓上的样式差异、状态管理混乱、打包发布失败等。这些问题一度让我怀疑自己是不是选错了技术栈。
今天我想借这篇文章,分享一下我在用React Native构建第一个APP过程中的真实经历和经验教训,希望能帮到刚入门的你。
项目背景:为什么要用React Native?

我们的项目是一个简单的个人记账应用,功能包括:
- 添加收支记录
- 按日期分类展示数据
- 图表统计月度收支情况
- 支持本地存储与离线使用
时间紧任务重,产品经理希望能在iOS和安卓双端同时上线。而团队成员中,有2位前端、1位后端,没有原生开发人员。这种情况下,React Native成为了一个折中的最优解。
遇到的问题与挑战

第一阶段:环境搭建困难重重
第一次尝试搭建React Native开发环境时,真的让我有点崩溃。特别是在Mac上配置Xcode和CocoaPods时,各种版本兼容性问题频出。我记得有一次安装react-native-reanimated这个动画库时,因为没按官方文档顺序来操作,导致整个项目在iOS上无法运行。
小插曲:
有天晚上加班到十一点半,还在折腾Podfile文件,突然被同事问:“你现在是iOS工程师了吗?”我当时苦笑了一下,心想,“不,我只是个写JS的程序员,怎么搞起iOS编译来了”。
第二阶段:UI布局差异大
同一个组件,在iOS和安卓上的表现不一样。举个例子,按钮的默认高度、字体大小、触摸反馈都有细微差别。为了保证视觉一致性,我们必须做适配处理,否则用户会觉得“这APP有点山寨”。
实际遇到的问题:
一个带阴影效果的卡片组件,在安卓上显示正常,到了iOS上却变成了扁平一块。后来查资料发现iOS上默认不支持elevation属性,需要用shadowOpacity来替代。
// 通用卡片组件样式
const styles = StyleSheet.create({
card: {
backgroundColor: '#fff',
borderRadius: 8,
padding: 16,
marginHorizontal: 16,
marginVertical: 8,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.2,
shadowRadius: 4,
elevation: 4, // Android专属
}
});
第三阶段:状态管理和性能优化
随着项目复杂度上升,我们开始频繁遭遇状态管理混乱的问题。初期我们用的是最原始的useState和useContext,结果到了中期,组件间通信变得异常复杂,经常出现数据不同步的情况。
后来我们引入了Redux Toolkit,简化了状态管理流程,代码也变得更加清晰。不过随之而来的是另一个问题——渲染卡顿。尤其是图表部分(我们用的react-native-chart-kit),如果数据量稍大,就明显感觉到页面卡顿。
解决方案:
- 使用React.memo优化组件重复渲染
- 对大量数据进行分页加载或懒加载
- 在非主线程进行数据处理(例如用Web Worker)
import React, { memo } from 'react';
const MemoizedChartComponent = memo(({ data }) => {
return (
<LineChart
data={data}
width={Dimensions.get('window').width - 32}
height={220}
chartConfig={{
backgroundColor: '#ffffff',
backgroundGradientFrom: '#ffffff',
backgroundGradientTo: '#ffffff',
decimalPlaces: 2,
color: (opacity = 1) => `rgba(0, 117, 255, ${opacity})`,
labelColor: (opacity = 1) => `rgba(0, 0, 0, ${opacity})`,
style: {
borderRadius: 16,
},
propsForDots: {
r: '6',
strokeWidth: '2',
stroke: '#ffa726',
},
}}
bezier
style={{
marginVertical: 8,
borderRadius: 16,
}}
/>
);
});
export default MemoizedChartComponent;
构建第一个APP的具体步骤
1. 环境准备
- Node.js(建议v18以上)
- Watchman(监控文件变化)
- Xcode(iOS)或Android Studio(安卓)
- 安装
react-native-cli或使用Expo CLI(后者更简单,适合新手)
推荐新手使用Expo起步,它内置了很多常用组件和API(如相机、地图、推送等),省去了很多原生依赖的麻烦。
npx create-expo-app MyFirstApp
cd MyFirstApp
npm start
2. 创建第一个页面
以首页为例,我们设计了一个简单的欢迎页面:
import React from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';
export default function HomeScreen({ navigation }) {
return (
<View style={styles.container}>
<Text style={styles.title}>欢迎使用我的记账本</Text>
<Button title="添加记录" onPress={() => navigation.navigate('AddRecord')} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#f9f9f9'
},
title: {
fontSize: 24,
fontWeight: 'bold',
marginBottom: 20
}
});
3. 引入导航系统
React Native没有内置的导航模块,我们需要手动集成。目前最流行的是@react-navigation/native配合其堆栈导航器。
安装命令:
npm install @react-navigation/native @react-navigation/stack react-native-screens react-native-safe-area-context react-native-gesture-handler
创建路由文件AppNavigator.js:
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import HomeScreen from './screens/HomeScreen';
import AddRecordScreen from './screens/AddRecordScreen';
const Stack = createStackNavigator();
export default function AppNavigator() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="AddRecord" component={AddRecordScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
4. 使用本地存储
移动端APP通常需要离线功能,我们选用@react-native-async-storage/async-storage作为轻量级本地数据库。
安装:
npm install @react-native-async-storage/async-storage
封装数据操作方法:
import AsyncStorage from '@react-native-async-storage/async-storage';
const STORAGE_KEY = 'records';
export async function getRecords() {
try {
const records = await AsyncStorage.getItem(STORAGE_KEY);
return records ? JSON.parse(records) : [];
} catch (error) {
console.log('读取失败', error);
return [];
}
}
export async function saveRecord(record) {
try {
const existing = await getRecords();
const updated = [record, ...existing];
await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(updated));
} catch (error) {
console.log('保存失败', error);
}
}
发布到应用市场
当所有功能开发完成后,下一步就是把APP发布到各大商店。这里我重点说一下Google Play Store和Apple App Store的经验。
Android 发布
- 生成签名APK:
cd android && ./gradlew assembleRelease - 在Play Console上传APK
- 填写应用信息、截图、隐私政策等
- 提交审核(通常2小时左右下架完成)
注意点:
- 应用图标尺寸要符合规范(mdpi、hdpi、xhdpi…)
- 要申请Google Play开发者账号(年费25美元)
iOS 发布
这是最难的一部分,主要是因为苹果的限制比较多。
- 配置证书和Provisioning Profiles(需要加入Apple Developer Program,费用99美元/年)
- 使用Xcode进行打包上传
- App Store Connect填写信息、截图、审核提交
常见问题:
- 启动图缺失导致拒审
- 未提供隐私说明字段
- 模拟器SDK版本不对
我曾经历过一次App被拒,原因是启动图用了默认的React Native图标。后来换成了自己设计的图标,并按照尺寸要求补齐所有分辨率才通过。
总结与收益

通过这次项目,我深刻体会到React Native不仅是一款强大的跨平台框架,更是现代移动开发中不可或缺的工具之一。虽然前期踩了不少坑,但整体开发效率还是比原生高出很多,尤其在团队协作方面表现突出。
最终我们的产品在两个月内完成了核心功能并顺利上线双端,得到了用户的积极反馈。
给初学者的几点建议
1. 从简单项目练手
不要一开始就想做一个复杂的社交类APP。推荐先做一个记事本、天气查询、新闻阅读器之类的,慢慢增加难度。
2. 善用社区资源
- GitHub上有很多开源项目可以参考
- Medium和掘金上有大量高质量教程文章
- React Native官方论坛和Discord都是获取帮助的好地方
3. 多关注性能与用户体验
- 尽量避免在主线程执行耗时任务
- 使用FPS监控插件检查帧率
- 图片压缩、懒加载、防抖节流这些优化手段都值得掌握
4. 不要怕学原生
虽然React Native封装了许多原生能力,但在一些高级功能(如蓝牙通信、指纹识别、后台服务等)上还是需要了解一些Java/Swift基础的。遇到问题多查文档,必要时也可以写自己的原生模块。
结语
React Native不是万能的,但它确实能让前端开发者更快地进入移动端领域。只要你愿意动手实践,不断试错,很快就能上手并做出属于自己的APP。
如果你也在学习React Native的路上,不妨给自己定一个小目标:用两周时间做个完整的APP原型出来。你会发现,坚持下来之后收获远远超过预期。
“有时候我们走得慢,是因为想得清楚;有时候我们走得快,是因为已经知道方向。”
—— 写给每一个正在学习的你
希望这篇文章对你有所帮助。如果你有任何问题,或者想交流React Native开发心得,欢迎留言。我们一起进步!

评论 0