React native 与 Flutter
React native已经用在了很多线上产品上,前段时间flutter release已经推出,相信很多应用也会使用flutter。
本文我们就讲讲这两者多个方面的异同吧。
1、成熟度、社区大小
首先一个框架或者技术,性能、难易度很重要,但是让更多公司或者个人选择在线上使用此产品必然是比较
成熟、稳定,以及活跃而又强大的社区,RN在2015年前后就已推出,更经过Facebook等顶级公司专业线上产品验证,再加上js成熟度,RN在稳定、成熟度方面相比于flutter自然无可争议。本人两年前就接触了flutter(当时尝试的项目),那时flutter刚发布到github不久的早期beta版本, 但是flutter release 1.0版本与2018年12月发布,所以只能算刚刚起步。
稳定成熟度有待考察,虽然本人感受来说已经比较成熟了,毕竟作为后起之秀,google借鉴了很多前人、之前框架的经验,从底层到上层无论架构、性能、开发效率等方面责无旁贷的选择更高效的方式,RN使用js天然自带了js语言上的缺点,比如消耗内存、内存容易泄漏、非强类型。flutter使用的dart可以强类型也可类型推断或者运行中检查,强类型使无论在编译阶段避免错误,还是在开发效率(因为类型、API提示等)、后期维护方面,简单很多。js非强类型使其在大型项目上比较乏力,eslint、jslint、flow的出现相对缓解了这方面分问题,但是从根本上解决问题ts是个比较好的选择,但是无论怎样,js用在大大小小的专业产品上,成熟度由于dart。消耗内存和内存泄漏问题这里简单说说,针对这个问题要看开发者写出的代码质量,以及产品的复杂度上,通常来说出现的概率并非太高,所以不做太多的比较。
由于RN出现的早,又是使用reactjs作为开发框架,社区的强大毋庸置疑。出现什么问题很容易从网络上找到解决版本。
综上:成熟、稳定、流行度、社区方面,RN用实实在在的项目证明其优于flutter,而flutter需要时间去证明。
2、性能
讨论性能是一个很有争议的问题,虽然性能很重要,但是很多时候底层性能上没有太大差异,上层相同复杂度的代码,那么性能表现上不会太大。比如java与c比较性能,同样的算法,java运行速度是不可能跑过c的。即使c的算法实现上更耗性能,运行时间上java还是很可能低于c。所以由于RN与flutter底层是现实都是原生代码或者C++,性能差距不会太大,所以相同复杂度的上层项目,运行速度差距很小,当然不同性能的机型上会表现不同,这不过是边界条件、超出最低要求。更多的性能比较可以见咸鱼的分享。过多的比较意义不大,因为虽然c比java性能好,然而在绝大部分业务项目中,开发者仍然选择java这类语言。
综上:性能差距不大
3、开发效率
虽然性能排在第二,但是对于业务来说,效率更重要,性能往往其次,因为公司管理者希望尽可能快的产品上线,那么RN、flutter比较好的选择,RN不必说,前端的开发方式,比如语言js、样式类似css、布局flexbox、热更新,flutter有同样的优势,只是RN使用的jsx明显好于flutter函数调用陷阱模式,flutter widget如果界面结构复杂,最好封装到不同的widget中,但是对开发速度上影响不大。另外RN的缺点是开发出的iOS与Android需要统一好UI,需要iOS、android原生支持,即使这样开发出的页面一致性可能也不一致,所以要注意调整,flutter一致性就比较好,另外flutter提供了丰富的UI组件,以及简单的可定制化的组建,实现绚丽的样式、复杂的交互逻辑相对于RN,flutter简单很多。热更新方面以本人的感受来说flutter更好一些,虽然两者都有,但是好于原生开发。
综上:RN、Flutter各有缺点,但是明显好于iOS、Android原生的开发效率,但是flutter效率会高。
4、动态更新
这也是非常重要的一个功能,对于发版速度、bug修复都很重要,RN由于使用的js,apple公司没有限制js的代码下发,但是使用其他语言不行,所以flutter使用的dart至少目前做不到。
综上:Flutter在此上的欠缺必然限制其在某些场景以及需求上,不如RN
5、学习曲线
这也是和第3条密切相关,由于RN使用的reactjs,对前端开发门槛很低,几乎可以直接上手。而flutter需要先了解dart,在了解flutter的开发模式、组建的生命周期、熟悉API等,当然这并非太大难度。
综上:RN在门槛上优于Flutter
6、app包大小
不必说集成flutter的app bundle更大,因为flutter从底层构建的sdk,而RN相对SDK较小,rn使用的javascript解释器来自平台,比如iOS的JavaScriptCore,js部分可以网络请求获取。
综上:RN比Flutter优
7、调试
对于Flutter在vscode上调试很方便,flutter 1.2发布的dart devtools,更有助于开发者调试和分析他们的应用程序。RN的调试依赖pc浏览器js解释器,可能会出现手机平台的JavaScript与PC端Chrome的js解释器不同,从而出现效果不一致,达不到想要调试的目的。
综上:Flutter优于RN
最后总结
虽然列了7条,但是有些场景并非特别重要,比如第6条,看看微信、淘宝、天猫、京东等iOS端app,基本200M以上,有的甚至逼近300M。从经验来说如果产品迭代比较快,不要犹豫请使用RN,否则可以选择flutter,不会错。