Tauri:下一代桌面应用开发框架?

大厂技术 坚持周更 精选好文本文为来自 教育-智能学习-前端团队成员的文章,已授权 ELab 发布 。

智能学习前端团队自创立以来,团队专注于打破大众对教育的刻板印象,突破固有的教学思维,攻破各类教学屏障 。旨在为每一位学生制定最合适的学习方案,予以因材施教,使优质教育随 "触" 可达 。
 
桌面应用开发在处于移动互联网的当下,虽然桌面应用的重要性已经不能同往日而语,但在我们平常的日常工作和生活中,还是扮演着非常重要的角色和地位 。在我们的日常工作中,离不开Lark、VSCode等桌面应用 。
相比较于移动端而言,桌面端应用的生态多种多样,因此也诞生了各种各样的桌面应用开发技术栈 。本次分享将会对相关常用的一些桌面应用开发框架进行介绍和分析,同时对当下比较流行(GitHub 50k star)的跨平台桌面应用开发框架Tauri进行介绍 。
 
原生技术栈原生技术栈是指通过操作系统相关API或者操作系统厂家(如Apple/Microsoft)提供的SDK/工具来开发桌面应用的方式 。使用原生技术开发的应用,通常能够在性能、体积以及系统的交互等方面做到非常不错的效果 。
  • 优点
    • 构建产物体积小
    • 性能好
    • 系统API调用方便
    • 兼容性好
    • 和系统应用的交互融合度高,如要实现如下的一些系统原生UI组件非常方便

Tauri:下一代桌面应用开发框架?

文章插图

Tauri:下一代桌面应用开发框架?

文章插图
 
  • 缺点
    • 无法做到跨平台,所开发的应用只能在对应的平台上运行,如果需要跨平台运行,则需要在不同的操作系统上分别开发,开发成本高
    • 对于使用的技术栈有限制(windows使用C#,macOS使用ObjC/Swift)
 
Windows平台作为目前使用率最高的操作系统,Windows平台的GUI程序开发经历了漫长的迭代和演化的过程:Win32 API作为Windows GUI开发的鼻祖,通过C语言调用Windows底层的绘图函数来进行开发;在Win32 API之后出现了MFC(Microsoft Fundation Class),MFC通过C++语法将原有的Win32 API封装成了控件类(对话框控件、按钮控件等);在MFC之后,微软推出了Windows Form(2002年),Windows Form依赖于.NET的运行时,提供了组件化的开发能力;在此之后,微软推出了WPF(Windows Presentation Fundation,2006年),WPF提供了基于XML的语言XAML来描述UI;在Windows8的时代,微软又推出了UWP(Universal Windows Platform,2015年),UWP支持在各种平台上运行(PC/Windows Phone/Xbox),API也支持多种语言(C++/VB/C#/JS) 。
从Windows平台应用的开发技术迭代来看,也可以大致看出GUI程序的技术发展史:
  1. Win32API时代:函数调用,指令式,Windows系统处理
  1. MFC时代:面向对象,把一些指令式调用封装成类,由来自UI的消息驱动程序处理数据
  1. Windows Form时代:组件化,在类的基础上封装成组件,消息被封装成事件,事件驱动
  1. WPF时代:使用类XML语言来描述UI,引入数据驱动UI的理念
  1. UWP时代:跨平台、多语言
 
macOS平台现有的macOS原生应用主要基于Cocoa框架开发,Cocoa是从1980年代由NeXT(macOS的前身)开发的编程环境NeXTSTEP和OPENSTEP演变而来,是面向对象的API 。
在2020年的WWDC上,苹果推出了新一代的UI框架SwiftUI,和Flutter/React等现代GUI框架类似,支持声明式的方式使用Swift语言作为DSL来编写UI,同时也支持跨平台的特性,可以在macOS/IOS/tvOS等多平台运行 。
Tauri:下一代桌面应用开发框架?

文章插图
 
linux平台Linux其源码只包含了操作系统内核的部分,桌面并不属于Linux源码的一部分,因此严格意义上来说,从「使用系统API和操作系统厂商提供的SDK开发的应用为原生应用」的定义上来说,并无所谓「原生技术栈」的概念 。我们日常使用的发行版提供了桌面环境如KDE、Gnome等,Linux发行版的这些桌面环境也提供了相关的一些库或者API来帮助绘制GUI程序,如gtk+等,可以认为是「原生技术栈」 。
 
跨平台技术栈Web技术栈Atwood's Law: Any application that can be written in JAVAScript, will eventually be written in JavaScript.


推荐阅读