Airbnb 的 React Native 经验:放弃 React Native (译)

原文使用 Sunsetting React Native, 语气感觉没有‘放弃’那么重的负面语义,大致就是逐步停止使用的意思。

由于技术和组织方面的一系列原因,我们准备放弃使用 React Native ,并致力于让原生体验更优异。

这是 Airbnb 使用 React Native 的经验以及下一步在移动端做些什么的系列博文第四篇。今天,我们身处何方?

尽管有很多团队依赖于 React Native ,并计划在可预见的未来使用它,但我们最终没有达到当初的目标。另外,还遇见了很多技术上组织上的无法克服的挑战,使技术投入 React Native 变得十分困难。

因此, 要奋勇向前,我们决定在 Airbnb 停止使用 React Native ,重新把我们所有的精力投入原生开发。

未能达到我们的目标

迭代更迅速

在 React Native 能够如预期工作时,工程师们能维持一个相当快的迭代速度。然而,本系列里提到的许多技术上组织上的问题,增加了很多项目里的挫败和意外的耽搁时间。

保持质量标准

近期,随着 React Native 的逐渐成熟,我们也累积了不少的专业知识,我么已经能够完成不少当初不确定能够做到的事情。我们构建了共享元素转换,(滚动)视差,并戏剧性的提高了一些过去经常丢帧的屏幕的性能。但是,例如初始化和异步首次渲染这样的技术挑战,想要达到既定目标的话是非常具有挑战性的。内部与外部资源的缺乏导致这更加困难。

只编写一次代码而不是两次

即便 React Native 的代码特性几乎是可以跨平台的,我们仍只是在非常少一部分的 app 上使用 React Native。此外,为了让工程师能够有效地工作,还需要大量的桥接基础架构。因此,我们最终是在三个平台上支持代码,而非两个平台。我们看到了在移动端和 web 端共享代码的潜力,也能够共享一些 npm 包,但除此之外,再没有以有意义的方式实现了。

提升开发者体验

开发者们使用 React Native 的开发体验各有不同。从某些角度来讲,比如构建时间上,体验就要好得多。然而在其他方面,例如调试,情况就非常糟糕了。这些细节在本系列的第二部分中有讲到。

停止使用的计划

由于我们无法达到我们的特定目标,我们做了个决定,就是 React Native 不在适合我们了。目前,我们在和团队一起制定一个合适的过渡计划。我们已经停止了 React Native 新特性的使用,并且计划年底前将大多数访问量高的页面换成原生编写。这得益于一些已经敲定好了的重新设计计划。我们的原生框架团队将在2018年继续支持 React Native。在2019年,将开始逐步减少支持并降低 React Native 的开销,例如启动时的初始化运行时。

在 Airbnb,我们是开源的坚定支持者。我们积极地使用和贡献很多世界各地的开源项目,并开源一些我们的 React Native 相关的工作。鉴于我们开始不再使用 React Native ,我们没办法像社区一样去维护 React Native。为了让社区变得更好,我们准备将一些 React Native 相关的开源工作转移到 react-native-community,我们已经开始使用 react-native-maps,且将会使用 native-navigationlottie-react-native

这并非全是坏事

尽管我们无法使用 React Native 达到目标,但使用 React Native 的工程十分还是有一些不错的体验。这些工程师中:

  • 60%的人认为他们的体验是绝佳的
  • 有20%认为还不错
  • 15%认为不太好
  • 5%的人认为非常糟糕

有63%的工程师表示有机会的话会再次选择 React Native,74%的人会考虑使用 React Native 开发新项目。不过值得注意的是,这个结果是存在固有的选择性偏差的,因为接受调查的人都是选择过 React Native 的人。

React Native 在走向成熟

这一系列的文章真实地反映了我们现阶段使用 React Native 的经验。然而,Facebook 和更开放的 React Native 社区致力于让 React Native 在混合应用上成规模使用。React Native 在以前所未有的规模发展。去年有超过 2500 个 commit,Facebook 刚刚宣布他们正在解决我们正面临的一些技术挑战。即便我们不在继续使用 React Native,我们仍然很高兴可以继续关注这些进展,因为 React Native 的技术优势转化成了为真实世界的我们的用户提供的便利。

小贴士

我们将 React Native 集成在一些现有的大型项目中,并以非常快的速度迭代。我们遇到的很多困难都是由于我们使用了混合模型方法。然而,我们的规模容许我们去解决一些小公司没有时间解决的难题。想让 React Native 跟原生一起无缝合作是可以做到的,但是非常具有挑战性。每个使用 React Native 的公司由于他们的团队组成、现有应用、产品需求和 React Native 成熟度不用而有不同的独特的感受。

当这一切结合在一起时,就对许多特性都起了作用,迭代速度,质量,开发体验能够匹配甚至超越了我们的目标和期望。这时候,我们真的感觉像要是接近于改变移动开发的游戏规则了。尽管这些体验很振奋人心,但当我们权衡这些优点和痛点,以及当前的需求和工程组织的资源的时候,我们还是决定它不再适合我们了。

决定使用一个新平台与否,是一个主观的决定,它取决于你团队独有的一些因素。我们的经验和放弃的理由不一定适合你的团队。事实上, _很多_ _公司_现在还在继续成功地使用 React Native,对其他的一些公司来说,React Native 仍然可能是最好的选择。

尽管我们从未放弃过使用原生,但停止使用 React Native 后可以释放出更多的资源来把原生优化的更好。跟我们一起进入本系列的下一部分,来学习一下我们在原生方面要做的新的事情。


这是本系列博文的第四篇,主要讲述了我们在 React Native 方面的经验以及下一步在移动端要做的事情。

  • 第一弹:在 Airbnb 使用 React Native (译文)
  • 第二弹:技术 (译文)
  • 第三弹:组建一个跨平台移动端团队 (译文)
  • 第四弹:在 React Native 方面做个决定 (翻译中…)
  • 第五弹:在移动端接下来要做的事情 (翻译中…)