跨端技术概述|青训营笔记

94 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 13 天

跨端是什么

跨端背景

业务场景越来越多,端也越来越多。传统场景下每个端单独配置开发人员,开发维护成本高,Android和IOS发版周期长。

跨端技术方案目标

  1. 研发效率高

    • 学习成本低
    • 多端一致性高
  2. 用户体验好

    • 稳定性好
    • 性能体验好
  3. 动态化

    • 支持动态化下发,满足业务需求

跨端技术方案介绍

Hybrid方案

  • 基于Webview渲染通过JS Bridge把一部分系统能力开放给JS调用
  • 多端都支持webview,该操作等价于打开一个网页
  • 蓝牙等系统能力通过JS Bridge调用
  • 开发者层面:JS代码和bridge
  • 平台层面:webview,画布与事件
  • 服务层面:位置、蓝牙、音频、相机、传感器……

原生渲染方案

  • 使用JS开发,通过中间层桥接后使用原生组件渲染UI页面

React Native

  • Facebook发布
  • 开发者可使用JS和React开发跨平台应用
  • 开发者层面:与Hybrid相同
  • 平台层面:OEM widgets,画布与事件
  • 服务层面:与Hybrid相同
  • 原生组件渲染效率更高

1.png

  • React层面(上半) :转化代码,优化代码,生成组件
  • Native层面(下半) :系统层面调用

自渲染方案

  • 更底层的实现,利用Skia重新实现渲染管线,不依赖原生组件
  • Skia是一个开源的渲染引擎,高度自由

Flutter

  • Google发布
  • 开源应用开发框架
  • 开发者层面:没有bridge,一般也不用JS,直接接触渲染方向的widgets和系统方向的channels
  • 平台层面:画布与事件
  • 服务层面:与Hybrid相同

2.png

  • 上层:开发者使用,基于widgets开发功能
  • 中层:内核部分,C++实现
  • 下层:对接系统底层

小程序方案

  • 小程序DSL+JS开发,通过中间层桥接后调用原生能力,webview渲染UI页面

字节小程序

  • 渲染层:webview容器

  • 逻辑层:JSC,JS内核(运行环境),开发者代码

  • 平台层:对接渲染和逻辑层,网络通信

  • 运行过程

    • 用户点击
    • 如有缓存,优先使用缓存打开
    • 分成逻辑和渲染两个线程
    • 分别加载基础库
    • 逻辑线程创建App,渲染线程初始化环境
    • 逻辑线程创建page,渲染线程收取数据渲染页面
    • 逻辑线程受到渲染完成,运行回调

基于小程序的跨端实践

开发流程

  1. 下载开发者工具
  2. 小程序开发调试
  3. 上传小程序

性能优化

优化意义

  • 留住用户
  • 提升转化率
  • 提升用户体验

性能指标

  • 一开始是加载状态loading
  • 然后是部分内容状态FP
  • 最后是全部内容状态LCP
  • 我们希望LCP尽可能早地出现

优化手段

启动性能

  • 减少包体积,加快下载:合理分包,移除无用包,控制包内静态资源
  • 减少同步逻辑,减少阻塞:优先使用异步API,避免启动时运行过多同步代码
  • 更早展示首屏数据:尽早调用关键API请求,接入数据预取,避免非必要重启
  • 合理缓存:网络数据/API数据缓存
  • 图片优化:图片格式,合理压缩,使用CDN&缓存
  • 其它:框架骨架屏,占位组件

运行性能

  • setData:减少频率,只发送有用的数据,动画不使用setData(容易丢帧)
  • 合理自定义组件:合理拆分组件,只注册当前使用的,同步修改初始data
  • 合理监听处理事件:scroll事件(触发很频繁,需要节流),去掉不必要的绑定
  • 内存优化:及时解除绑定,及时清理定时器
  • 导航栏适配:适当开启自定义导航栏,避免导航和状态栏及按钮冲突
  • X分屏适配:高度大小变化,使用onResize而不是scroll监听区域大小