Learn Once, Write Anywhere”是我一直梦寐以求的景象,不要再疲于学习各种语言和框架,最要命的是学的虽杂,每样都不精通,成长有限,毕竟人的精力有限的,每门技术都需要时间成本和实践成本。在国际技术大牛的努力下,跨端开发的曙光开始显现。

目前号称支持跨端开发的技术挺多,最终选择哪种,不仅要看技术本身的发展状况,还要结合自身的状况。粗粒度的看,目前跨端开发技术主要分两类:JavaScript流和Flutter流。JavaScript流下面有各种框架,React是其中最成熟的框架之一。

JavaScript及生态简介

JS诞生于20世纪90年代,直到2015年发布ES6标准时才引入众多现代高级语言的特性。

JS能做什么?

  1. JS最初是用来开发浏览器端应用程序逻辑的,目前最流行的框架有React、Vue等
  2. 之后有大牛开发了脱离浏览器的JS的运行环境 — NodeJS,使得JS可以被用来开发后端程序
  3. 又有大牛把Chrome浏览器内核包装成一个桌面应用容器,比如:Electron。这样JS就可以用来开发PC端跨OS的应用
  4. FB将React的核心技术迁移到了移动平台,诞生了React Native。这样JS可以用来开发安卓和IOS上的应用程序

JS生态的优点

JS拥有非常庞大的开发者群体,使得基于JS的新技术非常容易得到推广。

JS生态缺点

JS语法设计不友好,既没有C语言的简洁,又没有Java的OOP。JS的变量作用域会让代码难于理解,比如:JS早期是用函数来表示对象的,难以用现代OOP语言理解。虽然ES6后引入许多优秀的语法,但是旧的语法依然支持,提高了学习和迁移难度。微软一推出TypeScript就受到JS开发者的拥护,却增加了初学者的难度。因为初学者在看书和源码时,可能是基于函数式的,也可能是基于class式的,也可能是基于TS的。

JS标准委员会只负责制定标准,但是各种JS引擎的实现程度不一样,导致同一段代码在不同端上的执行效果不一样。例如:ES2020引入BigInt的支持,但是RN 0.66 安卓版还不支持,需要将64位整数转字节数组时要自己实现。

JS执行环境众多,跨端开发是学习各种环境的特性,比如:NodeJS、Electron、NWJs都又自己的一些规范。

Flutter简介

谷歌开辟了新的技术路线,2011年推出dart语言,面向“全平台构建快速应用的客户端优化的编程语言”。dart没有任何历史包袱,吸收了各种语言的优秀设计,对初学者和有经验的开发者都很友好。谷歌基于dart语言开发了全平台开发toolkit,目前github上start数130k+。

Flutter短板

官方不支持动态化,在安卓系统上可以自己实现动态化,在IOS上不允许。

案例对比

00.png

功能:
实现一个多tab页面作为主页
实现BLE设备扫描
连接BLE设备,给设备发送配置信息,开启设备Notify,接受Notify数据并转换为业务对象

RN实现情况

代码:http://gitlab.alibaba-inc.com/sparrow_phone_app/SparrowApp
优点:
全部都用js实现,包括权限申请

缺点:
js和React语法上手难度较高,主要是写法太多
只实现了CSS子集,表现力有限,比较酷炫的视觉效果实现成本较高
不支持BigInt,64位整数转字节数组研究了2天

Flutter实现情况

代码:http://gitlab.alibaba-inc.com/sparrow_phone_app/sparrow_app_flutter
优点:
全部都用js实现,包括权限申请
dart语言上手容易
接口丰富,表现力强

缺点:
页面组件嵌套在一起,页面属性无法抽离出来,代码整洁性很容易失控,导致维护难度加大

个人结论

如果团队有较深的前端开发积累,RN是不错的选择,技术成熟,社区比较活跃和繁荣,但是RN做不出一流的APP。如果团队要从0开始,建议走Flutter路线,Flutter代表未来…