5年 iOS 开发经验,日常爱好学习各种开发语言,对移动端有一线技术持续关注,Swift 狂热粉丝,推动 手淘iOS客户端落地 Swift,SwiftUI 实践者。
(关注公众号-app不内卷,可以一对一找我答疑,以及各种iOS干货可以看哦)
————————————————————————————————————
Flutter 包含量大组成部分,Flutter 可移植UI框架与Dart 编程语言。
相信观看此问题的更多同学是移动端开发者,了解Flutter 也基本是从移动端各种公众号,知识分享了解到的。
首先很多人对Flutter的理解会有一点片面,严格意义来说 Flutter 是一个跨平台 UI 框架,并不是一个平台解决方案,比如你说在iOS上开发一个APP,有200-300个公开或者私有的Framework供你使用,但是Flutter只是提供了UIKit 的解决方案,只不过大家的开发工作中大部分时间确实跟各式各样的UI打交道,开发业务逻辑的事件远小于开发UI部分的事件。传统的原生的命令式框架,笨拙又低效。
随着移动端研发效率跨平台的课题进一步发展,跨平台解决方案的热点已经从web系列转为Flutter的Native渲染,(只是热点,不代表web系列失去了活力),Flutter 也在进两年的时间内疯狂发展,国内外大小厂APP都在或多或少的探索或者已经使用了Flutter,在双端UI一致性来说,确实做到了不错的效果,这一切都得益于 SKIA 核心引擎解决跨平台渲染的一致性表达。这也是整个Flutter 的精髓之一,另外一部分就是Dart的工具链。
作为一个中小型的应用来说,使用Flutter确实可以提高开发效率,也值得去尝试一下,不过笔者所在的巨型团队,个人感觉还是要泼一坡冷水的,巨型项目首先不可能完全从0 到1 只采用 Flutter,都是混合型项目, Flutter带来的包大小也是一个非常大的阻力,同时 Flutter 作为一个Native渲染UI框架,还要启动虚拟机引擎,渲染相关的数据,对性能也有较大的损耗,这里很多同学会纠结不是画的也快性能越好?Flutter绘制的FPS不低呀,但是性能是一个综合因素,CPU 内存,网络带宽,电池都是性能所需要考虑的,对于拥有几千万台低性能设备的APP来说,内存 和CPU 负载较多都应用质量与体验下降的根因之一。
就拿 iOS 来说 Flutter 无法做到像 WebKit一样跨进程内存使用就对体验是致命的伤害,另外Flutter的DSL 个人认为不如SwiftUI 先进,SetState 语义比较单一,也会让开发者写出低效的应用。
而 SwiftUI 在目前的版本中,作为iOS开发者,除了感觉框架的理念和设计比较新进来说,对于具体的实现效果也是较差,UI框架渲染有差异,大列表组件有性能问题,不过唯一的优势是苹果是亲爸爸,可以从Widget 的强制使用来看,虽然暂时还有点烂,但是耐不住是亲儿子,前面提到的跨平台部分劣势基本不会出现(不过本身也不是跨平台,好像没什么好比较的)。 另外SwiftUI 因为不开源,也没什么可以深入学习的。
在这么多年的跨平台与原生开发,发展与竞争中,所有的技术是互相竞争互相学习的,没有任何一个语言或者一个框架可以解决所有问题,要不然也不会有几百种编程语言了,重要的还是跟进目前的业务形态,未来发展,架构模型来选择技术方向, 同时学习以上技术从来就不是一件冲突的事情,要在专精一门技术的同时要扩大广度,眼界高了,看得更清楚。
Flutter Desktop 也步入了 Stable 平台,曾经作为移动端UI开发框架的Flutter 正式进军了桌面端,仔细思考下来其实这一支持对移动端从业人员收益不大,但是对桌面端生态却有极大的发展,近些年来,随着移动互联网的快速发展,传统的PC端原生程序开发者从业人数如同珍宝,Windows 开发者纷纷转岗,Linux 桌面端受众小,MacOS 上古时代的 Cocoa 开发框架让近亲的 iOS 开发者望而却不,近些年来比较活跃的基本都是为了减轻开发者理解成本的Electron 等跨平台框架。 Flutter Desktop 对于桌面端的好处是可以让大量的Flutter开发者非常低成本的进入桌面端开发环境。
Flutter Desktop 同时帮助 桌面端开发者自动的解决了 文本编辑,鼠标输入,滚动等与传统移动设备的交互差异较大的事件,得益于Flutter 跨平台UI的高度一致性,开发者可以轻易的用之前的开发经验开发出来一个相对不错的桌面端程序。
SwiftUI 也是一款跨平台的UI框架,但是遗憾的是苹果的跨苹果是自驾平台,不过与Flutter理念不同的是,SwiftUI 只是DSL 表达层一致,实际控件渲染效果差别非常大。 当前很多人会说 MacCatalyst表达很像呀,但是这里笔者所指的 SwiftUI Mac App 与 SwiftUI iPad App run with Mac Catalyst 是两回事。
同时传统桌面端应用有着不同于移动端应用的场景,桌面端应用除了有很多精美的UI展示效果,还有较多逻辑要处理,这些逻辑可能会用到比较多的硬件能力,如果编写这些应用 SwiftUI 可以无缝的编写原生交互,其他的跨平台框架必不可免的需要编写较多的胶水层代码与平台特性通信。
PS: 笔者所在团队因为SwiftUI 带来的便捷性让我们团队开发了数十个研发工具(这在以前只能使用 Cocoa 几乎是不可能完成的是),不得不吐槽,SwiftUI 在MacOS上效果表现不好,UI控件着实会有详细不到的视觉效果,工具逻辑可以轻易的使用熟悉的 Swift 语言来实现,同时 SwiftUI的Apple 框平台也让这个框平台显得有点鸡肋。
如果是一个大型企业的桌面端程序,选择传统成熟的跨平台框架,Electron 会是更好的选择,Flutter 可以作为技术探索尝试一点点,再决定。
如果是个人开发者,只关注MacOS端,那么选择 SwiftUI 确实会减少大量的UI开发时间,同时用一种开发语言开发业务逻辑,也会让项目变得更加纯粹更易维护,比如像 Surge的原生程序。
Flutter 对web平台的支持已经 Stable, Flutter 除了传统的 输出HTML作为渲染构建,Flutter 还发布了CanvasKit使用WebAssembly和WebGL来在浏览器Canvas上渲染Skia绘图指令。
而 SwiftUI 从来没有表现过希望向 Web端 UI 框架发展过。关于 Web 渲染笔者参与不多,就不做过多解释了。
关于开源,开源让整个世界的技术得以低成本的快速发展,开源社区让开发者学习前辈的优秀经验,使用开源框架可以有效减少开发成本,Flutter作为一个开源框架,开源这几年的过程中处理了几万个 ISSUE,几万个 PR, 虽然整体项目由 Google主导,但是也看到全世界的开发者都在为期做贡献,当然也让很多开发者学习优秀的经验, 而SwiftUI 则作为作为 Apple 家的闭源框架,目前未来也没什么机会开源。
作为普通开发者,我们没有什么办法改变 Google 和 Apple 的决策,但是作为技术爱好者,Flutter 让我们有机会学习到最优秀的一批开发者的思想与技术实现。
Dart 主要作为Flutter 的基础开发语言随之发行,发展也随Flutter 一样迅速,目前2.1.2 最主要的发布 空安全,但本人觉得本来并不复杂的功能对于Dart来说来的太晚了,swift 在1.0 版本则强制从语法层面强制了 Optiona的存在,可能会有同学觉得此时发布为什么会晚呢?
笔者曾在公司主 APP 推动了 上千个模块的Objective-C 代码与 Swift 模块的混编支持,经历了将近两年时间,Objective-C模块完成 Swift 类型标注的模块不足20个。覆盖率不足2%,单纯的 Swift 代码确实可以比较安全的享受空安全带来的运行时安全性,但面对沉重的历史包袱,混编部分充满了不安全的校验,开发过程中最不开心的部分便是处理这些 Objective的历史包袱。 同理 Dart 的历史包袱就是早期版本的 Dart 已经早期版本Dart编程风格的开发人员,他们会让历史包袱持续扩大下去。
Dart 的高效编译器可以生成针对x86&ARM的机器码,以及针对Web优化过的JS。其广泛支持了各种目标: 移动设备、桌面PC、后端应用以及更多。
而 Swift 虽然也是可移植性语言,但是近些年来进度是在过分缓慢,迭代了这么多年,稳定支持的本除了 Apple OS 外的主流Linux。
Dart提供的HotReload特性,支持快速的,可交互的开发体验,不论是原生设备还是Web应用均如此。Dart也提供丰富的对象用于应用开发,包括Isolate模型,async/await并发处理,以及事件驱动的开发模式。
Swift 基本只能作为编译型静态语言每次重新编译,开发效率确实较差,async/await 等待3年也为正式发布,不过 Swift 带来的全新范式与语言的整体设计,让整个工程构建变得更加健壮与富有表达性,
比如 值类型与POP,访问级别控制, 让“组合大于集成” 语言的从根本上帮你选择,甚至很多语言特性让很多为了弥补语言的缺陷的设计模式也彻底消失,如状态模式可以直接在 Swift enum中实现状态迁移。
综合以上数据分析,其实会发现,程序员要提高的还是内功,比如你为什么选择 Flutter 或者 SwiftUI, 底层有什么差异,对项目长期的发展有什么优势,相比而言这些才显得尤为重要。
同时个人感觉,SwiftUI 整体API 公开可用部分不过1万行,完全可以花个比较短的时间,去学习如何使用,总价架构的先进性来提升自己。
而学习Flutter 也不能一直停留在表面上,比如这个框架怎么用,而应该深入到渲染去,深入到Dart虚拟机及编译器相关,毕竟像 SKIA 这么优秀的渲染引擎真是不多见。
相信有了这些知识沉淀读者们可以自己回答自己的提问了。