公司产品目前上线的是微信小程序,业务需求开发已经处于相对完善阶段。现在计划开发APP,一开始在 React Native 和 Flutter 之间考虑许久后,决定还是用学习成本较低的 RN 来做。在决定使用 RN 后,创建项目的时候,又在架构上研究了大半个月。不确定应该使用 cli 还是 expo 来创建项目。网上的相关知识太少,大多数不符合当前的 RN 版本了。那就自己花时间尝试吧,并且将自己的实践过程记录下来。然后想着反正闲着也是闲着,那就将笔记发掘金吧,这样就可以跟大家一起交流学习。
Expo
Expo 是一个围绕 React Native 构建的开发工具和服务平台,旨在简化 React Native 应用程序的开发、构建和部署过程。
Expo 的优势
-
快速上手:无需配置 Android Studio 或 Xcode 即可开始开发,只需一个命令就能创建新项目。
npx create-expo-app MyApp
-
开发体验优秀:
- 热重载功能让更改立即可见
- Expo Go 应用让你可以在真机上即时预览(无需连接数据线)
- 提供了良好的错误提示和调试工具
-
跨平台解决方案:一套代码可以同时运行在 iOS、Android 和 Web 平台上。
-
内置组件和API:Expo SDK 提供了大量预构建的组件和API,如相机、地图、通知、传感器等。
-
OTA更新:可以不通过应用商店审核直接推送更新(代码部分)。
-
云端构建服务:无需本地配置构建环境,可以使用 Expo 的云服务进行应用构建。
Expo 的劣势
-
原生模块限制:
- 只能使用 Expo SDK 提供的原生模块
- 如需使用自定义原生模块,需要"eject"到"bare workflow"
-
应用体积较大:因为包含了完整的 Expo SDK,即使未使用的功能也会被打包。
-
更新延迟:新的 React Native 特性可能需要等待 Expo 支持后才能使用。
-
性能问题:在某些复杂场景下,可能比纯 React Native CLI 构建的应用性能稍差。
-
eject 过程复杂:一旦需要超出 Expo 限制的功能,转换到"bare workflow"可能会比较麻烦。
Cli
React Native CLI 是官方提供的命令行工具,允许开发者完全控制 React Native 项目的配置和原生代码。
CLI 的优势
-
完全控制:可以直接访问和修改原生代码(iOS 和 Android)。
-
自由集成第三方库:可以使用任何 React Native 生态系统中的库,包括那些需要链接原生代码的库。
npm install react-native-some-module npx react-native link # 在较新版本中通常不需要这一步
-
性能优化:可以针对特定平台进行原生级别的优化。
-
包体积更小:只包含实际使用的功能,应用体积通常比 Expo 生成的小。
-
无版本限制:可以使用最新的 React Native 版本和特性,无需等待第三方支持。
-
特定平台需求:可以实现特定平台的功能或集成,如 iOS 的 Apple Pay 或 Android 的特殊服务。
CLI 的劣势
-
复杂的环境配置:
- 需要安装和配置 Android Studio、Xcode 等开发环境
- 对新手不友好,配置过程容易出错
-
开发启动慢:
- 初始化项目、启动模拟器等操作较为耗时
- 首次编译通常需要较长时间
-
维护成本高:
- 需要同时维护 JavaScript、Android 和 iOS 三套代码
- 版本升级可能需要处理复杂的兼容性问题
-
缺乏统一工具:很多功能需要单独配置或安装额外工具,如打包、部署等。
-
调试体验差异:在真机上测试需要物理连接或复杂的网络配置。
如何选择?
选择 Expo 还是 CLI 取决于你的项目需求和团队情况。以下是几个考虑因素:
选择 Expo 的情况
-
初学者或小型团队:如果你是 React Native 新手或团队规模较小,Expo 可以大大减少入门障碍。
-
快速原型开发:需要快速验证想法或构建 MVP(最小可行产品)时。
-
标准应用功能:如果应用功能都在 Expo SDK 覆盖范围内,无需自定义原生模块。
-
重视开发速度:优先考虑开发效率和简便性,而非极致的性能优化。
-
无原生开发经验:团队中没有 iOS/Android 原生开发经验的开发者。
选择 CLI 的情况
-
需要自定义原生功能:应用需要 Expo 不支持的原生模块或功能。
-
性能敏感应用:如游戏、图形处理等对性能要求极高的应用。
-
已有原生代码:需要集成现有的 iOS 或 Android 代码库。
-
特定硬件集成:需要深度集成设备特定硬件或功能。
-
团队具备原生经验:团队成员已经熟悉 iOS/Android 原生开发。
折中方案:Expo 的 Bare Workflow
值得一提的是,Expo 提供了一个称为 "Bare Workflow" 的选项,这是一种折中方案:
- 初始使用 Expo 快速开发
- 需要时可以 "eject" 到 Bare Workflow
- 保留 Expo SDK 的便利性
- 同时获得直接访问和修改原生代码的能力
这种方式的命令如下:
# 创建项目
npx create-expo-app MyApp
cd MyApp
# 当需要原生代码访问权限时
npx expo prebuild
我的选择
根据我自身的情况,我最终还是选择了Cli来创建项目。
最主要的原因是,我们的项目一开始就要继承微信的openSdk,使用微信的分享好友、分享朋友圈等api,还有微信支付,后续还会有支付宝支付、推送等第三方的sdk集成。
如果选择Expo,第三方SDK基本上没有Expo相关的文档,有的甚至连如何在RN上集成的文档都没有。
所以注定我们的项目是需要完全自由的原生模块开发的流程。
我已经初始化了一个开箱即用的模板(react-native-template),后面我将持续记录所遇到的坑以及经验。