React Native 项目初始化:cli 还是 Expo ?

182 阅读5分钟

公司产品目前上线的是微信小程序,业务需求开发已经处于相对完善阶段。现在计划开发APP,一开始在 React Native 和 Flutter 之间考虑许久后,决定还是用学习成本较低的 RN 来做。在决定使用 RN 后,创建项目的时候,又在架构上研究了大半个月。不确定应该使用 cli 还是 expo 来创建项目。网上的相关知识太少,大多数不符合当前的 RN 版本了。那就自己花时间尝试吧,并且将自己的实践过程记录下来。然后想着反正闲着也是闲着,那就将笔记发掘金吧,这样就可以跟大家一起交流学习。

Expo

Expo 是一个围绕 React Native 构建的开发工具和服务平台,旨在简化 React Native 应用程序的开发、构建和部署过程。

Expo 的优势

  1. 快速上手:无需配置 Android Studio 或 Xcode 即可开始开发,只需一个命令就能创建新项目。

    npx create-expo-app MyApp
    
  2. 开发体验优秀

    • 热重载功能让更改立即可见
    • Expo Go 应用让你可以在真机上即时预览(无需连接数据线)
    • 提供了良好的错误提示和调试工具
  3. 跨平台解决方案:一套代码可以同时运行在 iOS、Android 和 Web 平台上。

  4. 内置组件和API:Expo SDK 提供了大量预构建的组件和API,如相机、地图、通知、传感器等。

  5. OTA更新:可以不通过应用商店审核直接推送更新(代码部分)。

  6. 云端构建服务:无需本地配置构建环境,可以使用 Expo 的云服务进行应用构建。

Expo 的劣势

  1. 原生模块限制

    • 只能使用 Expo SDK 提供的原生模块
    • 如需使用自定义原生模块,需要"eject"到"bare workflow"
  2. 应用体积较大:因为包含了完整的 Expo SDK,即使未使用的功能也会被打包。

  3. 更新延迟:新的 React Native 特性可能需要等待 Expo 支持后才能使用。

  4. 性能问题:在某些复杂场景下,可能比纯 React Native CLI 构建的应用性能稍差。

  5. eject 过程复杂:一旦需要超出 Expo 限制的功能,转换到"bare workflow"可能会比较麻烦。

Cli

React Native CLI 是官方提供的命令行工具,允许开发者完全控制 React Native 项目的配置和原生代码。

CLI 的优势

  1. 完全控制:可以直接访问和修改原生代码(iOS 和 Android)。

  2. 自由集成第三方库:可以使用任何 React Native 生态系统中的库,包括那些需要链接原生代码的库。

    npm install react-native-some-module
    npx react-native link # 在较新版本中通常不需要这一步
    
  3. 性能优化:可以针对特定平台进行原生级别的优化。

  4. 包体积更小:只包含实际使用的功能,应用体积通常比 Expo 生成的小。

  5. 无版本限制:可以使用最新的 React Native 版本和特性,无需等待第三方支持。

  6. 特定平台需求:可以实现特定平台的功能或集成,如 iOS 的 Apple Pay 或 Android 的特殊服务。

CLI 的劣势

  1. 复杂的环境配置

    • 需要安装和配置 Android Studio、Xcode 等开发环境
    • 对新手不友好,配置过程容易出错
  2. 开发启动慢

    • 初始化项目、启动模拟器等操作较为耗时
    • 首次编译通常需要较长时间
  3. 维护成本高

    • 需要同时维护 JavaScript、Android 和 iOS 三套代码
    • 版本升级可能需要处理复杂的兼容性问题
  4. 缺乏统一工具:很多功能需要单独配置或安装额外工具,如打包、部署等。

  5. 调试体验差异:在真机上测试需要物理连接或复杂的网络配置。

如何选择?

选择 Expo 还是 CLI 取决于你的项目需求和团队情况。以下是几个考虑因素:

选择 Expo 的情况

  1. 初学者或小型团队:如果你是 React Native 新手或团队规模较小,Expo 可以大大减少入门障碍。

  2. 快速原型开发:需要快速验证想法或构建 MVP(最小可行产品)时。

  3. 标准应用功能:如果应用功能都在 Expo SDK 覆盖范围内,无需自定义原生模块。

  4. 重视开发速度:优先考虑开发效率和简便性,而非极致的性能优化。

  5. 无原生开发经验:团队中没有 iOS/Android 原生开发经验的开发者。

选择 CLI 的情况

  1. 需要自定义原生功能:应用需要 Expo 不支持的原生模块或功能。

  2. 性能敏感应用:如游戏、图形处理等对性能要求极高的应用。

  3. 已有原生代码:需要集成现有的 iOS 或 Android 代码库。

  4. 特定硬件集成:需要深度集成设备特定硬件或功能。

  5. 团队具备原生经验:团队成员已经熟悉 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),后面我将持续记录所遇到的坑以及经验。