JsBrigde和路由实现

本文最后更新于 1 年前,文中所描述的信息可能已发生改变。

WebView

如何通信

通信实现两个基本能力:

  • 应用侧调用js侧方法
  • js侧调用应用侧方法

应用侧通过执行 runJavascriptExt,调用js侧的函数

js侧通过创建一个iframe,加载约定的url路径,会被应用侧webview组件拦截

这是一个循环:

  1. 应用侧执行注入的js代码(包含触发load的方法)
  2. js侧改变loadUrl
  3. 应用侧拦截到url,再次执行js侧代码,获取数据
  4. …loop

在实际情况中,会有相互回调通知的过程,将其抽取封装出来,就是jsBridge

jsBridge

基本构成

  • globalStore 将一对一的jsBridge和webview实例存储起来,应用场景在跨页通知时,触发send方法,将向所有的webview实例派发消息

应用侧:

  • messageHandlers:存储通过registe方法注册的原生事件
  • responseCallbacks:当应用侧调用前端成功后,如果有回调需求,将会以[uId = callback]形式存储回调事件

前端:

  • messageQueue:存储通知应用侧的消息
  • messageHandlers:存储通过registe方法注册的js事件
  • responseCallbacks:当前端调用应用侧成功后,如果有回调需求,将会以[uId = callback]形式存储回调事件
  • msgFromHom:供应用侧runJavaScriptExt执行的方法

通信方法实现

应用侧:

  • send:本质上是执行前端的一段js代码,传递json对象
  • call:是对send传递对象的数据封装
  • register:注册事件

前端:

  • send:向消息队列存储一个事件对象
  • call:对send传递对象的数据封装
  • register:注册事件

前端最终的调用都是通过send向消息队列中存一个数据对象,然后更新iframe的url,触发webview拦截,应用侧再执行前端的fetchQueue方法,获取消息

路由实现

路由有两种实现方式

  • Router
  • Navigation

区别

相比Router,Navigation

  • [UIBuilder](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builder-V5)

路由搭建

  1. 我们的页面始终依赖于webview组件,所以路由不能声明路由,只能选择动态路由
  2. 始终复用webview组件,但作为页面,需要和参数做映射
  3. 首页tab的缓存实现

路由实现结合router和navigation一起实现

  • pages:约定两个entry路由(router),Login和Index页面,应用默认进入Index
  • Index页面默认内置Tab组件,组件分别放置webview组件和需要的原生页面,tab可以实现页面的懒加载和缓存
  • 为Index分配一个路由栈对象
  • 每个页面都可以获取路由栈对象进行路由操作
  • 如果跳转登录页直接通过Router跳转(为什么不用navigation?可以直接走Index完整的生命周期,而不是将特殊逻辑内嵌在Index中)
pnpm&monorepo
css 3d轨迹动画