React Native 用户使用经验

2017/3/9 posted in  ReactNative comments

What we learned after using React Native for a year

5 tips

  • 开始为了效率尽量使用 JS 实现所有功能。
  • 如果 React 优化失败,使用原生以获得更好的性能,但是不要过度使用(原生很快,JS 很快,但 bridge 的速度跟不上)。
  • 尽可能使用声明式的动画库(例如 Animated)来实现动画效果/ 交互。
  • 尽量使用 JPEG 图片格式。
  • 花时间学习 React Native 底层对于更好的开发 App 非常有用。

Switching to React Native in Production on iOS and Android

经验

  • 新功能周期从之前的 1-2 周下降到现在的 1-5 天,app 更新频率由之前的 2 周一次,到现在的每天 1-5 次。
  • Code-Push 可提供热更新和奔溃自动回滚功能
  • React Native 最大的好处是容错率更高了。

React Native at WalmartLabs

生产率

  • 95% 的代码库可以在 iOS 和 Android 之间共用
  • 沟通成本降低,每一个功能都是由一个团队实现的
  • 很棒的开发体验,小变更再也不需要重新编译了
  • 使用 Javascript 开发 RN ,有助于提升团队的编程技能,整合资源。(!!! 并没有什么因果关系好吗?)

代码共享

  • 展现代码可以在 iOS 和 Android 端共享
  • 业务逻辑(redux store)也可与 Web 应用共享 (!!! 嗯,没什么鸟用)
  • 很多代码可以用在多平台上。

App-store 审核

不需要等待 App-store 的审核通过了,bundle 文件放服务器上,更新的飞起。

上市时间

  • 非常快
  • 拥有发布日期的控制权(而不是等待 App-store 审核通过...)
  • 双平台可以同时发布

性能

RN 提供了几乎与原生相同的性能

动画

RN 提供了流畅的动画,因为界面显示之前代码已经转成原生视图。

UX

我们可以使用不同平台的 UI 设计(!!! 意思是不同的设计,用一套代码去实现的意思咯)

自动化

相同的自动化套件可以同时运行 iOS 和 Android 平台。(!!! 前提是你的自动化套件写的足够好好吗?)

Bad Part

  • 性能测试很痛苦,苹果的测试工具可以提供绝大部分我们关注的指标,Android 需要使用多个工具进行收集,此外,很多指标很难得到,所以某些指标只能估计。RN 内置的性能监视器也不够好用。

经验

测试

为保证 RN 代码的质量,我们的目的是 100% 单元测试和集成测试覆盖率

集成测试

我们需要支持很多设备和系统,Sauce Labs 允许我们在多种 iOS 和 Android 设备以及系统版本上进行集成测试。在多个设备上运行集成测试需要很久,所以我们只在每天晚上执行一次。

我们也使用集成测试避免回归,在每一次代码合并请求后将自动运行测试,不像每晚一次的测试,代码合并触发的测试只在一台设备上运行,但仍然可能比想象的要久,所以我们采用一些工具来节省时间。Magellan 是我们的一个开源框架,旨在并行运行测试以极大的减少测试时间。

测试本身是使用 JavaScript 编写的,使用 Mocha 执行,使用 Appium 命令控制手机模拟器。

单元测试

我们使用常用的 React 单元测试工具,例如 Mocha,Chai,Sinon 和 Enzyme,但 RN 具有自己独特的挑战,因为它的组件对环境的依赖都使他无法在 Node 上直接运行。react-native-mock 为我们解决了这一问题。当我们发现我们需要模拟更多的依赖时,我们使用 rewire 模块来解决。

可重用性

我们将相同的自动化测试套件同时运行在 iOS 和 Android 上。

发布

RN 产生的一个巨大挑战是如何使 JS bundle 正常工作,原生端也需要做兼容操作。如果你将原生上的 RN 升至最新版本,用户更新了他们的 app 但是却下载到了老的 bundle,应用将会奔溃。同时如果你将 bundle 升级以适配最新的 App 并同时将新的 bundle 提供给了未升级 App 的用户,也会发生奔溃。

CodePush 可以用于将正确的 bundle 分发给对应的 app 版本。同时支持多个 app 版本是决定使用 RN 之前需要考虑的一件事。

挑战

iOS 和 Android 的差异性

我们发现 iOS 比 Android 拥有更多的功能,所以以 Android 优先的方法来开发双平台的产品。

Development and debugging

开发和运行是在不同的环境中(在 iOS 模拟器和真机以及 Android 模拟器和真机上,RN 使用 JSC ,但使用 Chrome 进行调试时使用的是 V8 内核。 ),所以如果 bug 产生在运行模式中,在开发环境中调试有着天然的困难(!!! 测试做的足够好的前提下,在生产环境产生的 bug 就很有可能是因为运行和开发环境的差异而导致的)。

总结

RN 最大的卖点是它的跨平台性-允许一个团队同时开发 iOS 和 Android,工作成本直接减半。

使用 RN 之前需要注意一些事情:首先 RN 在 iOS 和 Android 之间建立了一座特别好的桥梁,但不能完全使用一种方式完成两个操作系统的工作。有一些明确的事情是一个平台可以实现,另一个平台无法实现的,主要是视图布局相关的,以及像性能测试这种需要着重考虑的方面。开源社区在开发,发布新特性和性能调整这些方面都是十分梦幻的,可实际上升级你的 RN 版本十分痛苦,尤其是你完全基于 RN 平台构建了一个应用。

我们坚信 RN 是一个出色的框架。它实现了所有我们希望它实现的功能,而且结果也十分棒。虽然它也有一些问题,但这些问题会被使用它带来的好处所遮盖。