如何选择移动端/桌面端跨平台方案
跨平台开发优势
一套代码,多端运行
(iOS、Andriod、MacOS、Windows、Linux、Web、小程序...)。
增加业务代码的复用率,减少多个平台适配的工作量,从而降低开发成本
, 带来直接的经济效益
在提高业务专注度的同时,为用户提供一致的用户体验
,达到多快好省
效果。
本文主要探讨如下跨平台方案
Flutter
自带渲染引擎,提供画布达到从业务逻辑到功能呈现的多端高度一致的渲染体验。Web开发+原生渲染
采用类Web标准进行开发,运行时把绘制和渲染交由原生系统接管- React Native
- Weex
Web开发+Web渲染
基于Web相关技术, 通过Web浏览器组件来实现界面及功能- Ionic
- 微信小程序
- Electron
C++
利用高性能可移植的C++语言,一次编码多端编译
来实现跨平台开发, 适用于核心平台是桌面端
的企业- 原生UI + C++
- QT + C++
各个跨平台方案对比
跨平台方案 | Flutter | Web技术+原生渲染 | Web技术+Web渲染 | C++ |
---|---|---|---|---|
性能 | 高 | 一般 | 低 | 高 |
开发效率 | 一般 | 高 | 高 | 低 |
社区生态 | 活跃 | 一般 | 活跃 | 一般 |
Flutter
Flutter是Google的移动UI框架,可以快速在iOS/Android/PC上构建高质量高性能
的原生
用户界面App。
渲染引擎依靠跨平台的Skia
图形库来实现,Skia引擎使用Dart构建抽象的视图结构然后加工成GPU数据,交由OpenGL最终提供给GPU渲染,最大程度上保证App在不同平台、不同设备上的体验一致性。
支持JIT(Just-in-Time,即时编译)和AOT(Ahead-of-Time,预编译), 兼顾开发效率和运行效率
缺点:
- 桌面端功能不够完善, 相信随着后面的迭代会进一步增强
Web开发+原生渲染
裁剪了Web标准
,保留了构建移动端页面必要的Web标准,使用JavaScript开发保证了便捷的前端开发体验;
放弃了浏览器控件渲染,使用原生UI组件
代替核心的渲染引擎,仅保持必要的基本控件渲染能力,从而使得渲染过程更加简化,也保证了良好的渲染性能
。
React Native
和Weex
是这种方案的佼佼者。
Web开发+Web渲染
使用Web开发+WebView/Chromium
加载网页
JS Bridge
(桥): H5与原生代码交互协议,将部分原生系统能力暴露给H5,从而扩展H5的能力。
既有原生代码也有Web代码,因此被称为Hybrid开发模式
。由于H5代码只需要开发一次,就能同时在多个系统运行,大大降低了开发成本。
采用了Web开发技术,社区资源丰富。
浏览器加载H5页面过程
- 加载H5页面的HTML主文档;
- 如果遇到CSS文件,浏览器另外发出一个请求去获取;
- 遇到图片资源,浏览器也会另外发出一个请求去获取。
- 遇到JavaScript文件,由于JavaScript代码可能会修改DOM树,因此HTML文档会挂起渲染(加载解析渲染同步)的线程,
等到JavaScript文件加载解析并执行完毕
,才可以恢复HTML文档的渲染线程
。 - JavaScript代码中有用到CSS文件中的属性样式,于是阻塞,等待CSS加载完毕才能恢复执行。
加载、解析和渲染
过程是耗时操作, 使得这种方案性能很差
。
原生UI + C++
利用高性能可移植的C++语言, 一次编码多端编译
来实现跨平台开发
一次编码, 使用GCC/Clang编译成iOS/mac下的dylib
,Android/Linux下的so
,win下的dll
C++实现核心的网络+数据存储+加解密+核心业务+接口定义, 所以能做到各个平台通用
各个平台基于C++定义的接口开发自己的UI, 所以不存在兼容性问题
C++ 是桌面端开发最重要的语言, Windows/Linux官方语言就是C++, MacOS开发中C++也是很重要的语言
缺点:
- 学习难度高:C++ 语法和概念相对复杂,需要一定的学习和实践经验。
- 开发调试难度大:会出现一些平台特有的问题,需要理解各个系统的差异性和兼容性, 并进行更多的调试和测试。
QT + C++
Qt 是跨平台的 C++ 开发框架。提供了集成的开发环境,跨平台开发桌面、移动和嵌入式App。开发者通过简单的 API 编写可移植的代码。
QT实现了内存管理/网络/数据/UI等功能, 屏蔽了底层的操作系统和平台差异。完美的避免了上一套C++方案的缺点
自绘引擎
,界面上的按钮和文本框,都是Qt引擎自己画的,保证了界面在不同操作系统上的一致性。
缺点:
- 商业授权不太友好,开发商业应用一定要谨慎。个人开发者可以免费使用。
- 移动端兼容不太好
方案选择总结
移动端优先
的企业, 短平快
使用React Native/小程序这种基于 Web 的方案, 追求性能的使用Flutter
桌面端优先
的企业, 短平快
使用QT/Electron, 追求性能和极致用户体验
的使用原生UI+C++