闲聊 Flutter
移动端开发从08年开始就有个大家前赴后继不断追求的目标:跨平台,15年时 nwind 有篇 雄文,详细调研了跨平台各流派,其中最后的 Dart 栏可以看到现在 Flutter 的雏形。可以看出来,Flutter 是从精简浏览器的思路演化过来的,实际上 web 与 Flutter 从底层看是一致的,web 是提供了一层平台无关的独立引擎,可以看成平台只提供了画布,所有的UI组件、框架、事件处理都是 web 引擎封装处理。其实这种虚拟机方式是跨平台的正道,在 GUI 跨平台的道路上,JAVA 、FLASH 都是这种方式,在 PC 时代都取得过成功,只不过移动端时代只有 web 这种开放标准能平衡各大公司利益,延续下来了。
原本 web 作为跨平台的解决方案很完美,FB最初也信心满满用 web 技术做主 APP,但到最后还是搞不定性能问题,被迫回归原生。为什么web性能不行,上面雄文也说了,历史代码兼容,CSS复杂,DOM接口粒度大等问题,自然有牛人们继续不断去尝试解决这些问题,面对历史包袱满满的 web 引擎,首先尝试的当然是不断删代码删功能,做个精简版的 web 引擎,完全抛弃兼容性,只保留最主要的功能,据 Eric Seidel 说删完后快了 20 倍,于是朝这个方向经过几年的努力逐渐演化出 Flutter。(国外大厂可以花三四年时间做一个引擎且还在Beta,怕不怕?)
Flutter 的推出为略为沉闷的移动端技术注入了一些活力,底子强,包装好,只要接入引擎就能获得跨平台+高性能的特性。不过 Flutter 还是有不少缺陷:
- 动态化,国外对跨平台有偏执,国内对动态化的偏执更高,高速发展高压环境,随时发版修改是基础能力,Flutter Release 是 AOT 无法动态化,理论上可以用 JIT 模式做动态化,但目前 Release 上没有 JIT 模式,不确定是否有性能上的问题,国内大厂接入使用少了一个很重要的理由。
- 体积,编译后iOS双架构15M+,Android单架构约7M,不算太大,对小APP可以接受,但在大厂大APP普遍严格控制体积的情况下,使用又多一个大障碍。
- 语言,从 web 演化过来的框架,为什么不使用 JS 而是使用 Dart?可能出于性能考虑,Dart有 AOT 模式,但使用 Dart 绝对是 Flutter 推广的一大劣势,学多一门新语言就多一层障碍,Java 对 Android 开发的推动,JS 对 nodeJS 的推动,换个语言就不一样了。
- 生态,Flutter 刚推出不久,组件功能的完善度和丰富程度自然不能跟发展了十几年的iOS/Android原生以及web相比,虽说生态都是慢慢建立,但这一个从语言到工具到组件都是几乎从零开始积累,无法借用强大的前端生态或其他生态,难度会高很多,堪忧。
不管怎样,Flutter是一个宝库,一个完整的比 webkit 简单得多的引擎,源码很值得挖掘学习,现阶段国内关注 Flutter 也是学习居多,直接使用 Flutter 目前吸引力还不够大,但国内可能有另一个利用 Flutter 的途径:小程序。Flutter 从 web 引擎简化中来,使用的也是 CSS flexbox 布局,但抛弃历史包袱重定规则,不兼容 web 也不是 dom 那套玩意,需要上层业务根据新规则限制写法,而小程序就是这样的限制框架,可以参考 Flutter 构建小程序渲染引擎,相对于 web 渲染性能好,相对 RN 渲染,同渲染引擎坑少,无需维护两个平台框架。可行性待研究,算是一个有趣的课题。