方案 | 框架 |
---|---|
h5+原生 | Cordova、Ionic、微信小程序 |
JavaScript开发+原生渲染 | React Native、Wexx、快应用 |
自绘UI+原生 | QT for mobile、Flutter |
h5+原生
h5部分使用webview渲染,这部分可以动态变化;目前微信小程序则是采用这种方案,以后可能采用原生渲染;这种方案的缺点是体验稍差
JavaScript开发+原生渲染
采用web技术栈,将dom映射为原生控件树,体验好,接近原生
JavaScript开发+原生渲染的方式主要优点如下:
采用Web开发技术栈,社区庞大、上手快、开发成本相对较低。
原生渲染,性能相比H5提高很多。
动态化较好,支持热更新。
不足:
渲染时需要JavaScript和原生之间通信,在有些场景如拖动可能会因为通信频繁导致卡顿。
JavaScript为脚本语言,执行时需要JIT,执行效率和AOT代码仍有差距。
由于渲染依赖原生控件,不同平台的控件需要单独维护,并且当系统更新时,社区控件可能会滞后;除此之外,其控件系统也会受到原生UI系统限制,例如,在Android中,手势冲突消歧规则是固定的,这在使用不同人写的控件嵌套时,手势冲突问题将会变得非常棘手。
flutter
实现一套引擎,使用各个平台的原生api来绘制UI,这样体验很好,接近原生,由于控件都是基于自绘引擎,所以不同平台效果能高度统一
这种平台技术的优点如下:
性能高;由于自绘引擎是直接调用系统API来绘制UI,所以性能和原生控件接近。
灵活、组件库易维护、UI外观保真度和一致性高;由于UI渲染不依赖原生控件,也就不需要根据不同平台的控件单独维护一套组件库,所以代码容易维护。由于组件库是同一套代码、同一个渲染引擎,所以在不同平台,组件显示外观可以做到高保真和高一致性;另外,由于不依赖原生控件,也就不会受原生布局系统的限制,这样布局系统会非常灵活。
不足:
动态性不足;为了保证UI绘制性能,自绘UI系统一般都会采用AOT模式编译其发布包,所以应用发布后,不能像Hybrid和RN那些使用JavaScript(JIT)作为开发语言的框架那样动态下发代码。
也许你已经猜到Flutter就属于这一类跨平台技术,没错,Flutter正是实现一套自绘引擎,并拥有一套自己的UI布局系统。不过,自绘制引擎的思路并不是什么新概念,Flutter并不是第一个尝试这么做的,在它之前有一个典型的代表,即大名鼎鼎的QT。
参考自https://book.flutterchina.club/chapter1/mobile_development_intro.html