跨平台GUI框架AvaloniaUI/Flutter/Electron的对比
时代的车轮滚滚前行,世界已经从移动应用主宰驶向了AI主宰,但作为这个IT世界地基,桌面应用,依然顽强的支撑着这个世界。不论是兼容性强到可怕的Windows,美轮美奂的MacOS,自由奔放的Linux,都逐渐褪去了大部分休闲娱乐消费的功能,班味缠身,成了生产力平台。各种工具和桌面应用,也都开始重视跨平台的开发。
在这些跨平台开发框架中,有一个叫做Skia的图形库一枝独秀。Chrome浏览器,Android都使用它来作为自己的基础图形库。因此,Skia有很优秀的性能和跨平台。基于Skia图形库有3个比较常见的跨平台开放框架,分别是:
- Flutter:Google的一下代用用开发框架。Flutter Desktop将Flutter的能力也带到了桌面端,让我们能很容易的一套应用,全平台运行。
- Electron:将NodeJS和Chromium浏览器结合的应用开发方式,将网页开发带入了桌面端。
- AvaloniaUI:将微软的dotnetcore跨平台能力,WPF的XAML绑定架构,Skia能力结合在一起,让传统的C#Windows生态在跨平台舞台上重燃生命力。
这三个框架,结合了Skia图形库的高性能和 C#/Dart/Typescript的高开发效率,是制作跨平台生产力工具的优秀选择。我们会结合自己的开发经验,对这三个框架进行一个简单的对比,方便读者根据自己的情况进行技术选型。
为什么这三个看似完全不同的框架能一起竞争
首先,自然是他们之间有极强的相似性
从语法来看,这三者是极为接近的。C#和Typescript都是传奇程序员Anders Hejlsberg在微软创立的。而Dart一开始是作为Javascript的替代品设计出来的,因此和Typescript的关系极为相似,甚至很多Flutter的库都是从知名的Javascript/Typescript库转写而来。因此,一个团队同时能熟练的掌握这三门语言并切换使用是意见很容易的事。
从性能来说,都是基于Skia(Flutter在iOS和Android下开始切换为Impeller引擎,AvaloinUI也在跟进),性能和使用场景表现基本一致,因此不会因为性能使用场景导致某一方直接从出局。
从生态来说,3者也更有擅长。C#有微软本身桌面端的历史积累,能共用很多库和代码,有NuGet进行支撑。Typescript更是了得,直接利用了整个WEB前端的生态,npm上有无数的软件包。Flutter/Dart虽然是后起之秀,但由于是Android的拥有者Google主推的框架,有大量互联网服务商的支持。
因此,三者还是有资格作为候选人一齐出现在技术选型的视野中的。
Electron:一切能用Javascript重写的,终将由Javascript重写。
从Web2.0时代以来,开启了大前端时代。可以说,前端(Javascript/Typescript)程序员的数量相对于山头林立的后端程序员来说是压倒性的优势,更不提已经式微的其他领域了。
可以说,Electron是最容易推进的桌面端开发方式了。
Electrion和操作系统进行交互的方式为使用 NodeJS的N-API写原生扩展或者FFI-NAPI扩展调用DLL
Electron开发桌面应用的优势
- 开发速度快,迭代快,程序员多
- 极强的文字排版功能
- 海量开源免费的UI组件
Electron开发桌面应用的劣势
- 应用场景单一
- 性能劣势,对于需要大量计算或者直接对Canvas进行直接写屏的性能有点不足
Electron的明星项目:微软的Visual Studio Code
Electron适合的场景:快速开发,对设计要求高,重视文字排版,需要热更新,不需要性能,不注重文件体积和内存占用的场景。
Flutter:开源最重要的三点就是一个好爹,一个好爹,一个好爹。
Web2.0时代最大的胜利者:谷歌
移动时代最有统治力的操作系统:谷歌的安卓
占有率最高的浏览器:谷歌的Chrome
Flutter:谷歌的亲儿子
所有的技术优势都是虚的。对于Flutter来说,谷歌的资源,移动平台的优势,是类似的项目完全无法比拟的。
Flutter和操作系统进行交互的方式为通过plugin机制,与各个平台的相应的原生代码进行交互,在3个框架中相对最复杂。
Flutter的优势
- Goole出品
- 移动端支持优秀
- 对发布到各个市场(Google Play/Apple App Store/Microsoft store)的支持度最高
- 各个互联网服务供应商都会提供 Flutter插件
- 体积小,3个框架中产物体积最小
- Fluttr doctor能方便的进行环境配置
Flutter的劣势
- 由于使用Dart语言,成熟的工具库相对最少
- 与操作系统交互复杂
- 更新多,频率高,代码经常有Breaking change,升级flutter库后需要对代码进行相应调整
- 没有XAML/HTML这类声明型的布局文件,界面复杂后组件层级过多,相对不利于维护
Flutter的明星产品:Google Pay
Flutter适合的场景:有移动端需求,规模不复杂,有对接互联网厂商现有插件的需求。
AvaloniaUI:微软黄金时代的遗老
实际上,AvaloniaUI作为C#平台的跨平台开发框架的代表,是有点让人觉得意外的。
微软在dotnetcore跨平台支持后,是有一个官方UI框架 Maui。
然后Maui支持Windows/MacOS/Android/iOS,不支持Linux。
可如果你不能真正跨平台的话,被人为什么要用这个框架呢?
哪怕Windows自身,Maui也只支持win10及win11上运行,兼容性不如Avalonia。
所以,Avalonia基本上是这个赛道上最强的选手了。
Avalonia和操作系统交互的方式为通过Pinvokde,直接和DLL交互
Avalonia的优势
- 标准的桌面软件的体验
- 多窗口支持良好
- 大量C#库
- 可以通过与其他软件共享代码/导出标准DLL的形式复用代码
- C#本身在三种语言中相对性能最好,适用场景最多
Avalonia的劣势
- 公司小
- 组件少,很多都是商业组件,需要授权/收费
- XAML,Command和event的响应机制极为复杂,更依赖IDE
- 文档相对最简陋,需要搜索/查看代码/AI辅助
AvaloniaUI适用的场景:需要传统桌面软件体验,不重视界面,需要性能或者对接现有C#资源,有在不同场景中复用的传统软件开发需求。