DSBridge---跨端的原生与H5的通信框架

dsBridge介绍

dsBridge是一个三端易用的现代跨平台 Javascript bridge, 通过它,你可以在Javascript和原生之间同步或异步的调用彼此的函数。

最近在开发h5相关的需求,而且相关的h5页面会嵌入到app,h5页面有拍照、上传照片、上传文件等,拍照和上传照片可以使用UI组件提供的功能,但是上传文件这块需要用到原生的上传方法了。调研之后,我选择了dsBridge这个跨平台的Javascript bridge。

我们先看一下如何在项目中使用的:

npm i dsbridge

我目前用的dsbridge版本是3.1.4

首先先封装dsbridge相关的方法
scr/lib/dsbridge.js
代码如下:

import dsBridge from 'dsbridge'export default {// js调用原生(native)的方法入口callHandler(name,data,callback){dsBridge.call(name,data,callback)},// 原生(Native)调用的方法使用此方法注册registerHandler(tag,callback){dsBridge.register(tag,callback)}
}

然后在main.js中进行全局注册

// 集成jsbridge
import Bridge from './lib/dsbridge.js'app.config.globalProperties.$bridge = Bridge

在对应的组件中使用的话

<script setup>
import { getCurrentInstance } from "vue"const { proxy } = getCurrentInstance() // 获取// 拍照、上传照片、上传文件
function uploadFile(item){proxy.$bridge.callHandler('photo.selectFileAndUpload',{action:item.value,url:`${import.meta.env.VITE_APP_BASE_URL}/api/outer/file/upload`,fileType:item.fileType,recordId:item.recordId},(res)=>{if(res.status != 'error'){dealFile(res)...}})
}
</script>

这个就是在项目中使用的流程。

我们来看一下在dsBridge的内部原理

1、JavaScript

核心原理
  • 封装DSBridge
    提供注册js的方法register: function (name, fun, asyn);
    调用原生Native的方法call: function (method, args, cb) 等
  • 使用全局对象window,往window注入全局参数,如存储js的注册方法等。
  • native调用的js方法动态注入
    提供bridge.register(name, fun)接口,使用key-value的方式将方法func和方法名method_name。

源码核心

  • JS ----> Native核心:以下是源码缩减版本~
var bridge = {// js调用native的方法入口call: function (method, args, cb) {arg = JSON.stringify(arg)if(window._dsbridge){ret=  _dsbridge.call(method, arg)}else if(window._dswk||navigator.userAgent.indexOf("_dsbridge")!=-1){//使用时Native会注册_dswk参数// 调用prompt函数,Native会拦截prompt事件,然后执行ret = prompt("_dsbridge=" + method, arg);}return  JSON.parse(ret||'{}').data},// 原生Native调用的方法使用此方法注册register: function (name, fun, asyn) {//注册的方法会保存到_dsaf或_dsf中var q = asyn ? window._dsaf : window._dsf//object类型保存到_obs下,方法直接保存到_dsf(_dsaf)下if (typeof fun == "object") {q._obs[name] = fun;} else {q[name] = fun}}
};
  • Native---->JS核心:以下是源码缩减版本~
//立即执行函数
!function () {//判断是否需要给window进行参数添加,如果没有添加会把ob内参数进行一次添加if (window._dsf) return;var ob = {_dsf: {//存储同步方法_obs: {}//存储同步方法相关object},_dsaf: {//存储异步方法_obs: {}//存储异步方法相关object},dscb: 0,//避免方法同名每次加1dsBridge: bridge, _handleMessageFromNative: function (info) { //处理Native调用js方法,核心实现如下// 通过info.method 获取方法实现var f = this._dsf[info.method];// 通过info.data 获取入参,数组形式var arg = JSON.parse(info.data);// 使用apply函数,调用函数f.apply(ob, arg)} //end} // var ob end}//func end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OneFlow深度学习简介

介绍 OneFlow是一个基于深度学习的开源框架,主要面向机器学习工程师和研究人员。它提供了类似于其他深度学习框架(如TensorFlow和PyTorch)的API,同时具有高性能和高效的特点。OneFlow专注于在大规模数据集和分布式环境下的训练和推理,以及在生产环境中的部署和优化。其设计…

HBuilderX 中开发vue,引入百度地图获取当前ip地址定位

实现功能&#xff1a;使用百度地图获取IP地址&#xff0c;定位到当前位置 参考文档地址&#xff1a;MapVGL | 快速入门 一、在有外网的情况下&#xff0c;常规引入百度地图的方法如下&#xff1a; 1、在index.html中引入 <script src"//api.map.baidu.com/api?v1.…

Python100个库分享第14个—plyfile(将ply文件展示3d模型)

目录 专栏导读库的介绍库的安装ply文件格式介绍ply下载网址&#xff08;是斯坦福大学的3d模型下载网址&#xff09;报错解决完整代码参考&#xff1a;总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️…

理解Go语言中上下文

开发人员有时会误解context.Context类型,尽管它是Go语言的关键概念之一,也是Go中并发代码的基础之一。接下来让我们看看这个概念,并确保我们理解为什么乃如何有效地使用它。 根据官方文档: 上下文(context)携带最后期限、取消信号和其他跨API边界的值。 下面让我们来看下这…

C语言单链表详解

链表和顺序表的区别 顺序表的底层存储空间是连续的&#xff0c;链表的底层存储空间是不连续的&#xff0c;链表的每个节点需要额外的指针来指向下一个节点&#xff0c;占用更多的存储空间。 顺序表的随机访问性能好&#xff0c;时间复杂度为O(1)&#xff0c;链表的随机访问性能…

接口优化技巧

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案 二、接口优化方案总结 1.批处理 批量思想&#xff1a;批量操作数据库&a…

几分钟学会TypeScript

目录 一、类型推断和类型注解二.类型注解&#xff0c;声明时指定类型三、类型断言四、基础类型和联合类型字符串数字和浮点类型布尔空和undefined多类型值限定 五、数组 元组 枚举数组元组,?代表可选参数枚举枚举使用 六、函数函数作为参数 七、类、接口与抽象类类访问修饰符类…

蓝桥杯省B组复习(小白篇)

个人经历与感受&#xff1a; 本周六也就是4月13号蓝桥杯竞赛&#xff0c;时间还剩下不到两天&#xff0c;我也是一名大一新生第一次接触这个竞赛&#xff0c;最开始只是单纯的抱着觉得算法有意思于是就开始接触算法&#xff0c;到此时此刻&#xff0c;我也发布了很多有关算法的…

python怎么输出小数

先将整型转换成float型&#xff0c;再进行计算&#xff0c;结果就有小数了。 >>> a 10 >>> b 4 >>> c a/b >>> a,b,c (10, 4, 2) >>> a float(a) >>> d a/b >>> a,b,d (10.0, 4, 2.5) >>> 注意&…

在Linux中查看进程的优先级

在Linux中&#xff0c;可以通过多种方式查看进程的优先级。进程的优先级有两种类型&#xff1a;一个是“nice值”&#xff0c;它是用户空间的优先级&#xff0c;用于影响进程的调度&#xff1b;另一个是“实时优先级”&#xff0c;用于实时任务。以下是几种查看这些优先级的方法…

“AttributeError: module ‘numpy‘ has no attribute ‘float‘”的成功解决方法

问题描述 使用NumPy库时遇到&#xff1a;AttributeError: module numpy has no attribute float. 具体报错提示&#xff1a;np.float was a deprecated alias for the builtin float. To avoid this error in existing code, use float by itself. Doing this will not modify…

前端常用加密小技巧:encode, MD5,JSEncrypt

最近工作的时候&#xff0c;写了一个登录注册相关功能&#xff0c;用到了些加密的东西&#xff0c;特此分享~ 什么是 MD5 MD5&#xff08;Message Digest 5&#xff09;是一种加密算法&#xff0c;用于生成数字消息或数据的固定长度&#xff08;128 位&#xff09;散列值。它…

螺栓拧紧工具选择——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 螺栓拧紧工具的选择遵循以下几点&#xff1a; &#xff08;1&#xff09;工艺要求精度。目前拧紧工具有两大类&#xff1a;一类是气动拧紧&#xff1b;另一类是电动拧紧&#xff0c;前者精度较后者精度低&#xff0c;发…

从HashMap了解二叉树、平衡二叉树、红黑树

前言 面试过程中&#xff0c;多多少少会问一点数据结构&#xff08;二叉树&#xff09;的问题&#xff0c;今天我们来复习一下二叉树的相关问题&#xff0c;文末总结。 1. 二叉树的由来 在 jdk1.8 之前&#xff0c;HashMap 的数据结构由「数组链表」组成&#xff0c;数组是 Ha…

免费插件集-illustrator插件-Ai插件-批量替换链接图

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行批量替换链接图。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&am…

SAP NACE V1 销售订单打印配置

在项目上&#xff0c;经常会有一些打印的需求&#xff0c;实现的形式也是五花八门&#xff0c; 有通过写一个打印程序&#xff0c;集成所有打印的&#xff0c;也有通过配置NACE 来完成标准打印输出的 今天我们来记录一下&#xff0c;如何通过NACE 的配置一个标准销售订单的打…

【C++软件调试技术】C++软件开发维护过程中典型调试问题的解答与总结

目录 1、引发C软件异常的常见原因有哪些&#xff1f; 2、排查C软件异常的常用方法有哪些&#xff1f; 3、为什么要熟悉常见的异常内存地址&#xff1f; 4、调试时遇到调用IsBadReadPtr或者IsBadWritePtr引发的异常&#xff0c;该如何处理&#xff1f; 5、如何排查GDI对象泄…

滑动窗口最大值(力扣239)

解题思路&#xff1a;首先是用暴力循环来解&#xff0c;其次便是用队列来模拟这个滑动窗口&#xff0c;同时要自定义三个函数&#xff0c;一个pop用来弹出来保证滑动窗口的移动&#xff0c;同时我们把最大的放在队列口那里&#xff0c;当每次有更大的就把原来的挤出栈外&#x…

Newspaper Premium高级主题:新闻网站的最佳选择,快速、SEO优化与丰富功能

Newspaper Premium高级主题&#xff0c;作为WordPress平台上最畅销且时尚的新闻主题&#xff0c;以其卓越的性能和丰富的功能&#xff0c;深受新闻网站创作者的青睐。无论是新闻中心还是其他利基市场&#xff0c;这款主题都能完美应对&#xff0c;助力您快速搭建起一个引人注目…

openstack安装dashboard后登录网页显示404错误

1. 2.进入该目录vim /etc/httpd/conf.d/openstack-dashboard.conf 增加这一行 WSGIApplicationGroup %{GLOBAL} 重启httpd后就可以访问了