传统移动端应用的开发的问题
原生开发的优势
- 用户体验感好:基于原生客户端语言开发,能最大化的利用设备的性能,提供最优的产品体验
- 能力强:可以直接和操作系统交互并调用其API,可以实现几乎全部能在移动设备实现的功能和场景
原生开发的劣势
- 动态性:客户端开发通常是有固定的版本发布计划,而且受限于Apple的APP Store审核规则,版本发布的不确定性还会受到政策影响,Android在国内的渠道众多,每次发版都要反复检查渠道,一旦发现线上问题,需要依赖再发版本,容错成本非常高,这也大大增加了对业务的局限性
- 开发成本:客户端的开发成本高,然而生态还不如Web丰富,npm社区的几万开源包,就爱生更活跃的开发者社区,导致企业来讲客户端的研发成本高于Web开发
- 跨端一致性:传统客户端开发一套业务,需要实现Android和IOS两套代码,而且由于Android和IOS的操作系统能力差异,同样的需求往往会用不同的视觉和交互来实现,这也导致业务成本居高不下
Hybrid开发
一、JSBridge + webView
H5 + 原生的开发形式,是混合开发的主流。使用原生技术搭建APP框架,使用H5动态下发内容。由于H5代码只需要开发一次,就能够同时在Android和iOS两个平台同时运行,减小开发成本。H5部分功能越多成本越小。我们称这种H5 + 原生的开发模式为混合开发,采用混合模式开发的APP我们称之为混合应用或Hybrid APP,如果一个应用的大多数功能都是H5实现的话,这就是一个Web APP。混合开发的技术难点原生和H5之间的交互。一般情况下,而JSBridge就是H5与原生交互的方式。例如微信内部的H5开发
问题:性能瓶颈导致用户体验不佳,复杂功能难以实现
性能差:除了H5与原生不搭配,H5本身就会出现先要在服务器上下载模板、加载资源,资源加载完毕后JS执行阶段才会发起请求获取数据进行渲染、JS的单线程 、交互体验需要专门处理, 调用原生能力复杂,需要客户端进行桥接,提前封装并规定好对接协议,提供给H5、大量重排会容易产生卡顿和掉帧
优化:
二、JS + 原生UI
JavaScript开发 + 原生渲染的开发方式目前特指Facebook开源的React Native以及阿里开源的Weex。其核心技术点就是:把DOM树映射成原生的控件树。框架会把DOM树自动转化为不同平台的控件树,其最终还是调用原生API来绘制,JS还是和webView一样,再打开APP时会拉去bingdomjs
混合开发的优点
- 社区庞大,开发成本低
- 使用前端技术框架,原生渲染,性能可以接受
- 支持热更新;(目前iOS端有风险,热更新应用禁止上架到APP Store)
性能能:打开APP会异步去请求jsbundle,获取到jsbundle后使用JavaScript引擎解析它,渲染成对应平台的原生控件树,与原生通信频率增加性能缺陷越明显
优化:预请求或缓存jsbundle,减少资源请求,节流防抖出发通信
混合开发的缺点
- 因为要和原生通信,难以胜任复杂的绘制与动画工作
- js为脚本语言,解释执行,性能和原生开发编译后运行,有一定差距
- 调用系统硬件功能非常麻烦,频繁渲染造成频繁通信导致性能缺陷,
三、自绘引擎
不依赖操作系统提供的布局、原生组件能力,直接调用GPU或者地城抽象层进行绘制的渲染引擎。
QtMobile
基于c++,最终表现不佳
Flutter
2018年Flutter诞生,通过Dart语言构建一套跨平台的开发组件,所有组件基于Skia引擎自绘,在性能上和Native平台的View相媲美,同时解决了上一代框架难以解决的双端一致性等问题,引起大家广泛关注,充分验证了通过绘制构建组件做到Native View 媲美的UI渲染引擎的可行性
Flutter是Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过Dart语言开发APP,一套代码同事运行在iOS和Android平台,Flutter提供了丰富的组件、接口,开发者可以很快的为Flutter添加Native扩展。
**跨平台自绘引擎skia **
dart语言
高性能
AOT(提前编译)
JIT(即时编译)
支持Android iOS 车载 手表