wusb / blog

🖋 Personal blog, Welcome Fork, Watch & Star
http://simbawu.com
MIT License
50 stars 14 forks source link

跨平台技术演进 #16

Open wusb opened 5 years ago

wusb commented 5 years ago

前言

大家好,我是simbawu,关于这篇文章,有问题欢迎来这里讨论。

随着移动互联网的普及和快速发展,手机成了互联网行业最大的流量分发入口。以及随着5G的快速发展,未来越来越多的“端”也会如雨后春笋般快速兴起。而“快”作为互联网的生存之道,为了占领市场,企业也会积极跟进,快速布局。同一个应用,各个“端”独立开发,不仅开发周期长,而且人员成本高。同时,作为技术人员,也不应该满足于这种重复、低能的工作状态。在这样的形势下,跨平台的技术方案也受到越来越多人和企业的关注。接下来,我将从原理、优缺点等方面为大家分享《跨平台技术演进》。

H5

说到跨平台,没人不知道H5。不管是在Mac、Windows、Linux、iOS、Android还是其他平台,只要给一个浏览器,连“月球”上它都能跑。

浏览器架构

下面,我们来看看让H5如此横行霸道的浏览器的架构:

浏览器架构

浏览器由以上7个部分组成,而“渲染引擎”是性能优化的重中之重,一起了解其中的渲染原理。

渲染引擎原理

不同的浏览器内核不同,渲染过程会不太一样,但主要流程还是一致的。

WebKit 主流程

分为下面6步骤:

  1. HTML解析出DOM Tree
  2. CSS解析出CSSOM
  3. DOM Tree与CSSOM关联生成Render Tree
  4. Layout 根据Render Tree计算每个节点的尺寸、位置
  5. Painting 根据计算好的信息绘制整个页面的像素信息
  6. Composite 将多个复合图层发送给GPU,GPU会将各层合成,然后显示在屏幕上。

从以上6步,我们可以总结渲染优化的要点:

以上就是浏览器端的内容。但H5作为跨平台技术的载体,是如何与不同平台的App进行交互的呢?这时候JSBridge就该出场了。

JSBridge原理

JSBridge,顾名思义,是JS和Native之间的桥梁,用来进行JS和Native之间的通信。

JS

通信分为以下两个维度:

那么App内加载H5的过程是什么样的呢?

App打开H5过程

打开H5分为4个阶段:

  1. 交互无反馈
  2. 打开页面 白屏
  3. 请求API,处于loading状态
  4. 出现数据,正常展现

这四步,对应的过程如上图所以,我们可以针对性的做性能优化。

优缺点分析

下面,我们进行H5的优缺点分析:

优点

缺点

虽然H5目前还存在不足,但随着PWA、WebAssembly等技术的进步,相信H5在未来能够得到越来也好的发展。

小程序

2018年是微信小程序飞速发展的一年,19年,各大厂商快速跟进,已经有了很大的影响力。下面,我们以微信小程序为例,分析小程序的技术架构。

小程序跟H5一样,也是基于Webview实现。但它包含View视图层、App Service逻辑层两部分,分别独立运行在各自的WebView线程中。

View

可以理解为h5的页面,提供UI渲染。由WAWebview.js来提供底层的功能,具体如下:

每个窗口都有一个独立的WebView进程,因此微信限制不能打开超过5个层级的页面来保障用户体验。

App Service

提供逻辑处理、数据请求、接口调用。由WAService.js来提供底层的功能,具体如下:

运行环境:

仅有一个WebView进程

View & App Service通信

视图层和逻辑层通过系统层的JSBridage进行通信,逻辑层把数据变化通知到视图层,触发视图层页面更新,视图层将触发的事件通知到逻辑层进行业务处理。

优缺点分析

优点

缺点

既然WebView性能不佳,那有没有更好的方案呢?下面我们看看React Native。

React Native

RN的理念是在不同平台上编写基于React的代码,实现Learn once, write anywhere。

Virtual DOM在内存中,可以通过不同的渲染引擎生成不同平台下的UI,JS和Native之间通过Bridge通信

React Native 工作原理

在 React 框架中,JSX 源码通过 React 框架最终渲染到了浏览器的真实 DOM 中,而在 React Native 框架中,JSX 源码通过 React Native 框架编译后,与Native原生的UI组件进行映射,用原生代替DOM元素来渲染,在UI渲染上非常接近Native App。

React Native 与Native平台通信

优缺点分析

优点

缺点

展望未来

虽然RN还存在不足,但RN新版本已经做了如下改进,并且RN团队也在积极准备大版本重构,能否成为开发者们所信赖的跨平台方案,让我们拭目以待。

  1. 改变线程模式。UI 更新不再同时需要在三个不同的线程上触发执行,而是可以在任意线程上同步调用 JavaScript 进行优先更新,同时将低优先级工作推出主线程,以便保持对 UI 的响应。
  2. 引入异步渲染能力。允许多个渲染并简化异步数据处理。
  3. 简化 JSBridge,让它更快、更轻量。

既然React Native在渲染方面还摆脱不了原生,那有没有一种方案是直接操控GPU,自制引擎渲染呢,我们终于迎来了Flutter!

Flutter

Flutter是Google开发的一套全新的跨平台、开源UI框架,支持iOS、Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件。渲染引擎依靠跨平台的Skia图形库来实现,依赖系统的只有图形绘制相关的接口,可以在最大程度上保证不同平台、不同设备的体验一致性,逻辑处理使用支持AOT的Dart语言,执行效率也比JavaScript高得多。

Flutter架构原理

Dart优势

很多人会好奇,为什么Flutter要用Dart,而不是用JavaScript开发,这里列下Dart的优势

优缺点分析

优点

缺点

总结

移动互联网的普及和快速发展,跨平台技术风起云涌,这也是技术发展过程中的必经之路,等浪潮退去,才知道谁在裸泳。我个人更看好H5或类H5方案,给它一个浏览器,连“月球”都能跑,这才是真正的跨平台,其他都是浮云。