Airbnb弃用之后,我们还应该用React Native吗?
近日,Airbnb发表了一组由5篇博文组成的系列文章,他们在文章中宣布停止使用React Native,并将其从代码库中移除,转而使用Swift/Objective-C/Java/Kotlin。
在过去的几年中,在谈及“是否应该使用React Native”这个话题时,通常都会有人指出,Airbnb这家世界级的公司在产品方面做得非常出色,他们在React Native上投入了大量精力,并且正在使用它。然而,现在出现了大反转:一家关心产品质量的顶级公司对React Native进行了大量投入,在经过非常仔细的研究之后,决定弃它而去。对于任何想使用React Native的人来说,这都是一件非常可怕的事情。
另一方面,Airbnb是React Native开源社区的重要贡献者。react-native-maps和Lottie是两个非常重要的库(都包含在Expo SDK中),最初由Airbnb开发。Leland Richardson在进入谷歌之前,曾经是该社区最著名的人物之一。人们肯定会记住他们所做出的贡献。
不过,如果你仔细阅读这一系列文章的内容,他们大部分时间都在说React Native相当不错,但不适合Airbnb。就个人而言,这并不会让我感到十分惊讶。数以万计的开发者正在考虑使用React Native,我与他们中的很多人进行过交谈,我发现考虑使用React Native的团队大致可以分为三大类,其中两类团队很可能会取得成功并乐在其中,而对另外一类团队来说可能是个噩梦。
我应该在项目中使用React Native吗?
这里有一个快速指南,可以帮助你和你的团队决定是否应该在项目中使用React Native。
1.你使用React Native从头开始构建一个新应用,并希望使用JavaScript开发所有的东西
如果是这种情况,人们通常都会很开心,并可以获得更好的结果。这个时候Expo非常适合你,你可以使用大量内置的原生模块,在不需要使用Xcode或Android Studio的情况下即可完成所有的事情,升级到新版本几乎毫不费劲,而且可以随时轻松推送代码更新,无需向应用商店提交新版本。如果由于某种原因,你需要使用原生代码开发一两个页面,并且已经定义好这些页面的边界,那么这么做通常也没什么问题。如果是我从头开始创建一个新应用,我会选择使用Expo/React Native。
2.你正在使用React Native开发少量的二级页面
如果你正在考虑使用React Native开发一些简单的二级页面,如设置、常见问题解答或“关于”页面(可能只需要把它们嵌入到WebView),那么你就走运了。从使用体验方面看,这些东西不需要与应用程序的其他部分有密切联系,但整体观感却更像是“原生”的。
3.你有一个使用Swift/Java/Objective-C/Kotlin开发的应用程序,现在你想要使用React Native开发其中的一部分
这种“棕色地带”(brownfield)的例子——你有一个使用Swift和Java开发的应用程序,你想要在跨多个视图或屏幕的地方引入React Native——更难应付。对于Airbnb在这条道路上遇到了很多挫折,我并不感到惊讶。有经验的原生开发者在学习第二种完全不同的技术栈时也会感到沮丧。如果你在同一屏幕上同时使用原生视图和React Native视图,在React Native方面,你会将数据保存在JS对象中,而在原生方面,你会将数据保存在Swift/Java的数据结构中,要跟踪客户端状态就会变得很困难。因为React Native目前只有一个异步桥接,要在这个层面进行集成,可能会非常复杂,而且效率低下。现在想象一下其他10个类似的问题(导航、布局、委托方法、版本控制等)。如果一种技术的开发者总是要去处理另一种技术的最坏情况,那么最终一定会走上一条不归路。
4.你的公司里有一个iOS团队和一个Android团队
即使你是前面两种情况中的一种,那些自认为拥有最强iOS程序员和Android程序员的公司也很难对React Native感到满意。iOS程序员对此尤为不满,他们一般会认为JS是对公司代码库的污染,Android程序员的感受则相对缓和一些。
即使你将React Native用在它所擅长的领域,但因为一些非技术问题,要让原生开发和React Native开发在企业中大规模并存仍然很困难。
至于它的价值,我几乎赞同Airbnb博文中列出的所有对React Native的指责。我们可以在Expo中发现很多相同的东西。而且我自己列出的受挫清单比这个要长得多。不过,这项技术在很多方面都表现得非常好,而且会越来越好。例如,人们普遍认为,想要获得良好的导航观感就要使用原生导航,但现在来自Expo团队的Brent已经在react-navigation库上进行了大量工作,它很好用,观感也很不错。它已经成为大多数React Native应用程序导航的最佳选择。
我对这个项目表示乐观,因为Facebook的一些最有热情的人(特别是Hector、Sophie和Ram)正在重构React Native,并制定了很多明智的计划,解决了一些最重要的问题。
我认为React Native正处在一个很好的位置,其中的一个原因是微软在新版本的Office中使用了React Native。
从宏观角度来看,使用像JavaScript这样的脚本语言来开发移动应用程序几乎是不可避免的,因为使用Swift/Objective-C/Java/Kotlin这些语言来开发UI效率太差。此外,每个应用程序都要开发两次(或者如果算上Web就是三次),这根本就是个大麻烦。无论是React Native、Flutter还是其他羽翼未满的新产品,它们也都大致如此。就我个人而言,我对获胜者的机会猜测如下:React Native 55%、Flutter 15%,其他我们还看不到的30%。