React Native 到 Flutter,移动跨平台解决方案的真相
2018 年 12 月,Google 发布了 Flutter 1.0 正式版,似乎重新点燃了人们对于移动跨平台开发的热情。上一次类似的情况发生是在 2015 年初 Facebook 发布 React Native 的时候。不到四年的时间,两家大公司推出了自己的移动跨平台解决方案(当然,2016 年微软收购了 Xamarin,但就没那么有趣了)如前两个)。与此同时,市场也对这一计划进行了宣传。这些现象似乎表明跨平台开发是移动开发的未来,或者说跨平台开发是一种更好的开发方式。
既然是热门话题,就一定有讨论的话题。不过,在我们谈论React Native和Flutter之前,我认为我们需要先谈谈“跨平台开发”。
移动跨平台解决方案
那么什么是“跨平台开发”呢?
一般来说,如果你想在iOS和Android上提供相同内容的应用程序,那么使用Apple的构建工具来开发该应用程序,然后将其放在AppStore上并使用Google提供的构建工具。开发一个应用程序并将其上传到 Google Play。除了用于实现两个应用程序的工具不同之外,大部分业务逻辑是相同的。你可能会发现这个过程中有一个“重复”。
重构时,如果项目中存在大量重复代码或重复逻辑,我们通常会将这些代码或逻辑以函数、模块或库的形式进行封装。这个过程最大限度地消除了重复代码。最终达到简化项目代码的目的。
所以,在我看来,“跨平台开发”也是基于这个思想。人们想要一个能够减少甚至消除编写重复逻辑的解决方案,然后市场就会给人们他们所期望的解决方案。跨平台解决方案的最大特点可以用Sun公司推广Java的口号来概括:“Write Once, Run Anywhere”。如今的React Native和Flutter也都引用或者继承了这句话。
React Native
React Native 是 Facebook 主导的跨平台解决方案。由于 Javascript 和 ReactJS 的流行,React Native 一经推出就获得了很高的人气。除了跨平台的特性之外,React Native最大的特点就是可以使用Javascript来创建移动应用程序,并且最终应用程序的呈现方式可以与使用原生开发工具包开发的应用程序几乎相同。
React Native
能够做到这一点的React Native的核心是JavaScriptCore,一个JavaScript虚拟机。通过JavaScriptCore,Javascript可以与其他语言相互转义。同时,JavaScriptCore可以运行在iOS、Android等平台上。这些功能共同成为 React Native 的基础。在此基础上,Facebook封装了各个平台的应用层接口,定义了Javascript与封装的接口之间的通信协议,最终实现了利用JavaScript开发不同平台上的原生体验。应用。
从实现原理和架构来看,React Native 似乎是一个不错的跨平台解决方案。只要封装好各个平台的API,我们就有理由相信人们可以使用React Native来开发高质量的应用程序。但现实中,理想与现实还是有差距的。 2018 年,AirBnB 和 Udacity 连续发表博客文章,宣布他们将完全放弃 React Native,转向原生应用程序开发。在他们的文章中,他们大多提到 React Native 是一个不成熟的解决方案。虽然它有很多优点,但不足以弥补其缺点造成的损失。 AirBnB 和 Udacity 可能出于各种预期原因放弃了 React Native,但在看到 Discord 团队发布的博客文章 Why Discord is Sticking with React Native 后,我彻底放弃了在生产中使用 React Native 的想法。环境。读完整篇文章,似乎Discord团队继续使用React Native的最大原因是因为项目已经使用了它并且没有办法阻止它。
JavaScriptCore 的局限性、Facebook 项目管理的不成熟以及不断的放弃公告最终让人们认识到 React Native 是一个有趣的解决方案,但不是一个成熟稳定的解决方案。
Flutter
正当React Native的热度持续下滑之际,Google适时推出了跨平台解决方案:Flutter,让人们重新将目光聚焦到跨平台开发上。
Flutter 使用相对冷门的 Dart 语言进行开发。基本引擎主要由运行Skia和Dart组成。 Flutter通过Skia连接各个平台的核心图形库,并提供了许多基于Skia的控件来实现跨平台开发。 React Native封装了各个平台的应用层接口,而Flutter则直接构建了针对不同平台的应用层开发套件。对于这两种不同的方式,我们可以直观的判断出Flutter在性能方面要优于React Native。因为这种Flutter的实现方式其实已经被广泛的、广泛的应用了。最明显的例子是游戏引擎。
各种比较和迹象表明,Flutter 似乎是比 React Native 更好的跨平台解决方案。目前Flutter仍呈上升趋势,阿里巴巴等各大公司都纷纷背书Flutter。雄心勃勃的基础框架让开发者有理由相信,如果投入足够的人力,Flutter 可以和原生开发一样出色。
不过,Flutter 的缺点也源于它本身的框架。 Flutter 目前不支持很多平台功能,例如密码管理、光标选择等。未来能否支持,还要打一个大大的问号。平台功能可以与原生组件深度耦合,目前还没有其他接口,所以 Flutter 目前只能放弃对这些功能的支持。值得一提的是,React Native 在这方面并没有太大的问题。
尽管存在一些问题,但Flutter所展现出的潜力仍然让人觉得只要Google提供足够的支持,这个解决方案就值得尝试。那么谷歌也会吗?
结论
那么,我应该选择哪个选项呢?答案:这取决于你。
事实是,没有完美的解决方案,每个解决方案都有其优点、缺点和权衡。如果你想使用Javascript开发应用程序,那么使用React Native;如果你想构建高性能的跨平台应用,Flutter是一个不错的选择;如果想要最大限度地发挥平台的功能,自然就采用原生开发方式。
除了比较跨平台解决方案之外,跨平台解决方案还与原生开发方法进行竞争,而且这种竞争往往是不平等的。在支持新功能时,跨平台解决方案总是比原生解决方案慢。开发方式,所以在市场占有率方面,原生开发方式有着天然的先发优势,而且这个差距是很难弥合的。最后,您可能会发现原生开发方式可能是最合适的,因为除了“重复”之外,原生开发方式与跨平台解决方案相比没有其他缺点。
作者:LeanCloud
链接:https://juejin.im/post/5cd4059851882547a572f540
来源:掘金
。商业转载请联系作者获取授权。非商业转载请注明出处。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。