受益于开源技术的发展,以及响应快速开发的实际业务需求,跨平台开发不仅限于移动端跨平台,桌面端虽然在市场应用方面场景不像移动端那么丰富,但也有市场的需求。 相对于个人开发者而言,跨平台框架的使用,主要为了满足以下三个主要能力:
- 生产力提升 :框架能够帮助开发者实现快速开发,这是降本增效的根本。如果不能实现「快速」,那也就比自己从零开始写代码快不了太多了。
- 框架打包后的 体积轻量 :开发者大部分是普通用户,不会安装基础环境(不会运维,不会运维,不会运维)。
- 跨平台 :许多开发者日常开发还是以Mac做为主力开发机,所以强烈需要跨平台(跨移动平台,跨移动及桌面平台)。
今天,我们就在本篇文章中盘点下,跨平台桌面应用开发的5大主流框架:Electron、wxPython、FinClip、Tauri、Flutter。
Electron
相信这个框架大家都不陌生。 首先,Electron 本身是基于 Node.js 的,这样就可以利用 Node.js 的现成资源。 其次,Electron 是跨平台的,换句话说,它可以同时开发 Web 应用和桌面应用,一些常规的资源,如:UI,代码(JS)等资源都可以共享,为开发者大大减少了工作量,甚至企业也无需重复投入人力来开发系统。 再有,Electron 不仅支持 Web API,完成与 Web 应用相同的工作,还允许调用很多操作系统底层 API 来与硬件设备交互,甚至可以用 C++、Go 来编写本地模块,这样一来就可以完成很多 Web 应用无法做到的事情。
小结:使用语言html,js,css等,功能强大,界面绚丽,跨平台,开发成本低,可以说是集优点于一身。除了,性能不敢恭维~~
wxPython
wxPython和pyqt 两者类似,都是用python语言开发。前者是对wxWidgets的封装,后者是对大名鼎鼎的qt的封装。wxWidgets 是基于操作系统的 API 来做桌面应用的,也就是说,在 Windows 下开发一个桌面应用时,看起来就像是传统的 Windows 桌面软件的风格,在 Mac 下则是 Mac 的风格,而前面三个都有自己的自绘引擎。
也就是说,使用wxWidgets 在三个平台上都是按照三个平台自己的 API 来绘制这个按钮的。wxWidgets 提供了非常多的操作系统的 API,并且可以做到静态链接,但小问题比较多。
Tauri
“Build an optimized, secure, and frontend-independent application for multi-platform deployment.” 从Tauri官网的宣传语可以看出Tauri主打的几个卖点:
- optimized:性能高、体积小
- secure:安全性强
- frontend-independent:前端独立
- multiplatform:跨平台
Tauri框架是由Rust语言实现的,同时Tauri应用的后端也是由Rust来编写的。Rust是由Mozilla主导开发的通用、编译型的系统编程语言。Rust语言自身有如下的一些特性:
- 性能高(optimized) :Rust的性能和C/C++的性能不相上下,由于Rust的「所有权」机制,Rust不需要GC,同时也能避免如C/C++之类需要手动管理内存的语言忘记释放内存导致的内存泄露的问题;
- 安全性强(secure) :Rust设计了一个所有权系统,其中所有值都有一个唯一的所有者,并且值的作用域与所有者的作用域相同。值可以通过不可变引用(&T)、可变引用(&mut T)或者通过值本身(T)传递。任何时候,一个变量都可以有多个不可变引用或一个可变引用,这实际上是一个显式的读写锁。Rust编译器在编译时强制执行这些规则,并检查所有引用是否有效。能够有效避免C/C++等语言中的悬垂指针等问题;
- FFI编译友好(multiplatform) :FFI是可以用一种编程语言写的程序能调用另一种编程语言写的代码的机制,使用Rust可以方便地提供接口给其他语言调用;
Rust语言的一些特性,也增强了Tauri框架的可靠性和框架价值。此外,hello word打包后果然只有10m,而且开发还是能用html+css技术,效率非常高。
FinClip
FinClip sdk,也可以说是小程序沙箱 Runtime/Engine,提供 Runtime 基于浏览器内核,采用动态语言(JS)和声明式 View 构建(XML),兼容互联网主流小程序技术,可采用 Vue、react 基础上的 DSL 框架。 与Electron、Flutter、Tauri等跨端平台不同的是,FinClip严格意义上讲是一项容器技术。与跨端平台不仅不冲突,还可以完美融合。移动端跨平台开发框架中,不管是通过Flutter、Taro、 kbone等开发出来的小程序均可在FinClip当中运行。 这种小程序容器技术,将视图层与逻辑层分离也带来了许多好处: