java程序编六角星_跨平台移动端解决方案—Weex

跨端方案背景

1

起因

由于客户端Webview内嵌H5的各种受限,例如性能差、JS执行效率低以及伴随着大量的机型兼容问题,于是有了各种混合跨端开发解决方案:Hybrid、React-Native、Weex、Flutter、小程序、快应用等。

2

优势

我们知道各大应用市场对于app的发版都有规定的周期,常常各种端内需求需要集中在某一固定时间进行发版,而跨端方案可以随时发版,不受应用市场的审核限制,然而这有一个前提,开发者所运用的解决方案所对应的Native(端内原生开发)的功能都已完备,且几乎具有与Native一样的能力,例如拍照、上传等。

3

劣势

目前市面上大量的跨端解决方案很难达到传统Web开发语言的能力,例如组件方面仅提供了部分内置组件,暂不能支持所有html规范;样式能力对于不同的客户端也会出现一定的差异。总之在降低开发成本和提升效率的同时也带来了无数细小的坑。

笔者作为刚开始应用Weex的小白以Weex为例跟大家分享一下自己理解的跨端方案。

WEEX

1

简介

“Weex致力于使开发者能基于通用跨平台的Web开发语言和开发经验,来构建Android、iOS和Web应用。在集成WeexSDK之后,可以使用JavaScript语言和前端开发经验来开发移动应用。”目前Vue.js和Rax这两个前端框架被广泛应用于Weex页面开发。致力于将流行的Web开发技术与原生开发技术结合,在开发阶段:一个Weex页面就像开发一个普通网页一样;在运行时:Weex又充分利用了各种操作系统的原生组件和能力。

2

组件能力

Weex提供了一套基础的内置组件,例如

为传统的块级元素,文本则必须用组件才能进行渲染,区别于标签,weex则采用块级组件进行代替。

在框架内容,Weex使用原生组件进行渲染,这一点极大的提升了各种平台、系统、机型的兼容性,但正是因为原生组件,在不同平台上会产生一定的视觉差异,例如组件在不同平台的渲染效果有所差异。

3

模块能力

通常通过 weex.requireModule("xxx")来引入相应的模块,引入之后便可以调用该模块提供的各种方法,Weex提供了网络请求、动画、导航、存储等内置模块。

除了内置模块,Weex同时也支持端内封装自定义模块提供前端调用,利用JSBridge将JS与Native联系起来。

4

JS与Native之间的通信原理

假设我们现在要在Weex页面实现一个拍照功能,对于前端来说,只需要调用Native提供的API即可,使开发者可以在weex页面内调用端内原生的拍照功能,而JSBridge便是Native能提供给API给JS调用的答案。简单来说,JSBridge就是JS与Native之间的桥梁,让两者能够互相调用

4bdf0bba056b92901b75f42241623e6d.png

以android为例,其核心原理为:(以下代码源自Github:https://github.com/lzyzsd/JsBridge)

native端注册函数供Javascript调用:

// 下面webview是一个自定义的WebView,继承Android原生的WebView对象webView.registerHandler("submitFromWeb", new BridgeHandler() {@Overridepublic void handler(String data, CallBackFunction function) {Log.i(TAG, "handler = submitFromWeb, data from web = " + data);function.onCallBack("submitFromWeb exe, response data from Java");}});

上述则表明了,在Android端注册了一个名为submitFromWeb的函数供Javascript调用,handler为具体的执行内容。String类型的data是JavaScript端调用时传过来的参数,CallBackFunction类型的function是用来将执行的结果回传给JavaScript。

JavaScript调用native端提供的函数

// WebViewJavascriptBridge是提前注入的一个全局变量用于javascript调用native提供的函数WebViewJavascriptBridge.callHandler('submitFromWeb',{'param': str},// 调用native函数成功后的回调函数function callback(responseData){document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData});

上述表明JS通过提前注入的WebViewJavascriptBridge对象调用native端提供的submitFromWeb函数,传递的参数为{'param':str},调用结束后会回调callback函数。

应用

对于一般的app应用少不了网络请求,因此笔者从网络请求为例,简单分享一下应用案例。

在Weex中提供了stram模块来完成基本的网络请求能力,例如GET、POST请求等,用于在组件的生命周期内与服务端进行交互。

API

fetch(options, callback, progressCallback)

options为请求配置项,包括Http请求方法、url、header、body、type等,callback为响应回调,包括状态码,响应数据等。

引入

var stream = weex.requireModule("stream");

请求封装

对于一个长期维护的端内项目通常需要有一个低耦合的接口请求封装函数,通常大部分请求参数需要带上用户的token信息、地理位置信息等,因此我们可以通过端内封装的JSBridge直接获取已经在端内登录的用户信息,地理信息同理。获取这些信息之后再利用Promise.all()来处理最终的业务请求。

requestAgent(obj, isService = false) {var userLocationInfoPromise = new Promise(function (resolve, reject){bridge.getLocationInfo((data) => {resolve(data)});});var userInfoPromise = new Promise(function (resolve, reject){bridge.getUserInfo((data) => {resolve(data)});});Promise.all([userLocationInfoPromise, userInfoPromise]).then((items) => {var userLocationInfo = items[0];var userInfo = items[1];var method = obj.methodswitch (method) {case "GET":break;case "POST":break;}stream.fetch(options, ret => {if (!ret.ok) {obj.fail(ret.statusText)return}var bizRet = ret.dataif (bizRet.errno != 0) {obj.fail(bizRet.errmsg,bizRet.errno);} else {obj.success(bizRet.data);}});});},

调用示例

requestAgent({method: 'POST/GET',path: '/api/donut/uploadResource',headers: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8", },body: obj.body,type: 'json',rawBody: raw,params: {key: value} //根据 GET 和 POST 自动放在 query 或 bodysuccess: function,fail: function});

上面的代码我们可以看到,这样的接口请求封装不仅仅用到了weex的内置模块stream,同样也运用到了自定义模块bridge,通过bridge模块便可以实现JS与Native的通信,去获取当前用户的登录信息和地理信息;避免在每个请求中都插入这些信息的请求函数,同样也避免了定义冗余变量去存储这些信息,也达到了降低耦合的效果。

WEEX跨端方案总结

前端页面原生渲染,增强前端页面体验

一次开发支持多端(Android、iOS、H5)运行

页面更新不依赖版本发布,提升迭代发布效率

单页面开发能力强大

如果尝试利用Weex独立开发App比较困难,它的Native能力并没有ReactNative那样强大且全面,Weex更注重Web的开发体验,强调像开发Web网页一样开发跨平台APP页面,官方也较推荐Weex和Native混合开发方式开发App,即将Weex作为一个组件融入到Native App中,替换传统的Hybrid模式。

因此我们可以大胆猜测,类似上面的这样一个页面,底部导航可以利用Native进行维护,以达到更多机型的兼容,中间的Feed流部分可以选择用Weex进行维护,可以根据业务需求在feed中插入相应的模块需求(聚划算、百亿补贴…),而对于每个feed item的落地页,如果在不复杂的情况下完全可以利用H5进行维护。虽然看似同一个app运用了多种解决方案,但这样便把不同的业务模块根据规模和需求隔离开,交给不同的人员进行维护迭代,进一步提升开发迭代效率。

总的来说,weex是一套很好的跨端解决方案。虽然有很多细节不支持,但总体上提升了移动端的开发效率。

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

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

相关文章

父类可以调用子类的方法吗_python类的继承、多继承及查找方法顺序

讲解类的继承,先用无__init__()方法的类讲解,会更容易理解分三部分讲解1、单继承(无__init__()方法)继承方式:子类(父类):方法重写:防止执行父类的方法。不想继承父类的某个方法,就自己重写一个一样名称的方法执行父类…

解决ASP.NET Core部署到IIS,更新项目另一个程序正在使用此文件,进程无法访问...

问题部署到IIS上的ASP.NET Core项目,在更新的时候会进程占用的错误解决思路初步解决方案:1,关闭应用程序池2,关闭网站3,更新项目缺点:网站没法访问,部署项目停的时间过长答案查询官方文档后&…

下面选项能正确表示JAVA_模拟试题2

Java语言程序设计模拟试题二一、选择题:共20小题,每小题1分,满分20分:请将答案填入题后括号中。1.以下的选项中能正确表示Java语言中的一个整型常量的是 ( )A) 12. B) -20 C) 1,000 D) 4 5 62。下列的变量定义中&#…

使用Redis Stream来做消息队列和在Asp.Net Core中的实现

Redis - Wikipedia写在前面我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消息队列,而不想引入新的服务,kafka和RabbitMQ等&#xff…

windows挂载ext4_使用 UEFI 双启动 Windows 和 Linux | Linux 中国

这是一份在同一台机器上设置 Linux 和 Windows 双重启动的速成解释,使用统一可扩展固件接口(UEFI)。来源:https://linux.cn/article-12891-1.html作者:Alan Formy-duval译者:郑(本文字数&#x…

oh,我的老伙计,你看看这近五十个dapr视频

oh,我的老伙计,你看看这近五十个 dapr 视频。这不就是你想要的视频资料吗?快来捡走吧!开始了,但是没完全开始 Dapr 是一个可移植的、事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的、无状态和有状…

极速理解设计模式系列:2.观察者模式(Observer Pattern)

4个角色:被观察者(Subject/目标对象接口),具体被观察者(ConcreteSubject/具体目标对象),观察者(Observer),具体观察者(ConcreteObserver) 被观察者(Subject/目标对象接口):目标对象的抽象接口 …

16年微软/腾讯云/华为云MVP是怎样炼成的

自由、创新、研究、探索,很难想象到一个IT大神的博客,会将“自由”放在第一位,也许这二字代表的,既是精神,又是情怀。搞微软技术的,大家或多或少都有听说过微软的“最有价值专家”(MVP&#xff…

.NET中的设计模式---由吃龙虾想到的

作者: 倪大虾 发表于 2010-07-18 18:10 原文链接 阅读: 725 评论: 20今天吃小龙虾的时候忽然想到了以前一个湖北朋友讲的虾的故事.这位朋友是湖北人,据他说在他小时候他们那里很多虾,特别是夏天雨后,满地爬的都是.因为传说那是美国对付中国的秘密武器,居然没有人敢吃.后来偶然有…

【需要重视的BUG】:偷权限的情况

!!如果您生产环境用到了Blog.Core系统(本文是我自己逻辑问题,和官方没关系哈),且没有做其他修改,且没有使用Ids4认证中心来授权认证,请看完本文,并即时做系统维护。-----…

Angular运行在java_在本地运行现有Angular项目

我是Angular的新手,我正在尝试在我的机器上运行Angular的现有项目 . 我做了很多测试并且跟着很多文章 . 但无法运行我的项目 .我有这样的项目文件:我在我的系统上安装了nodejs . 并根据文章按照以下说明操作:将目录更改为我们的仓库cd myproj…

自找麻烦

2019独角兽企业重金招聘Python工程师标准>>> 真是想狗想的要发疯了,所以想买条狗,但是阿拉斯加,哈士奇,金毛,拉布拉多,苏牧,喜乐蒂现在我都买不起,他们都是很听话的狗&am…

Prism+WPF使用DependencyInjection实现AutoMapper的依赖注入功能

前言在使用PRISMWPF开发项目的过程中,需要使用AutoMapper实现对象-对象的映射功能。无奈PRISM没有相关对AutoMapper相关的类库,于是转换一下思想,在nuget 中存在有关使用Microsoft.Extensions.DependencyInjection来实现AutoMapper的依赖注入…

webSocket原理及其案例

常见的消息推送方式 1:轮询方式 浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实现试试返回数据给浏览器 缺点:数据有延时、服务器压力较大。 2:长轮询 浏览器发出ajax(异步)请求,服…

这是啥?也太秀了吧?

1 请坐下2 这是什么愿望,感觉老天都看不下去了!3 像极了手机落在上铺的你!4 真正智慧家居,免通电。5 你以为它是土豆,其实。。6 葫芦不一定叫葫芦葫芦有各种奇奇怪怪的形状和名字7 我发光去了!你点的每个赞…

爱数应用容灾部署方案三

级联复制的异地容灾方案部署 爱数应用容灾部署方案可在异地部署远程容灾站点实现远程应用容灾方案,采用级联复制模型,在本地和远程分别部署容灾站点,克服实时复制对带宽延迟较高的缺点,获得最佳的容灾效果。并且可根据用户的网络和…

30张不明觉厉的照片,看几遍终于看懂了

全世界只有3.14 % 的人关注了爆炸吧知识网络上很多照片,虽然没经过PS,第一眼还是会觉得诡异。仔细看看才发现....哇噢!总觉得她的头上有一撮尖尖的毛?狗狗怎么做得出这个表情?震惊!发现没脖子的长颈鹿&…

排序集合的一个小坑

原来一直用SortList,SortedDictionary来作为键值对存储的排序集合来用,心中就默认是以key按ascall排序来存放的,在之前的案例中也没有出现问题,在最近一个demo中,打破了原来的自以为是的认识,因为在key中不…

爱是天时地利的迷信

1 别人撒娇你撒娇2 据说套着这个白袋子晒鞋鞋就不会发黄了。。3 蚂蚁:为什么要欺负我!4 这是天空的心电图吗5 有回应的喜欢真好 6 随主人这事儿原来是真的…7 被别人喜欢时的心理活动图自回忆专用小马甲你点的每个赞,我都认真当成了喜欢

Juniper Firewall多进单出配制实例

Technorati 标签: juniper,多进单出,配置实例,firewallJuniper firewall多進單出配置。想法是這樣的用一台firewall將這幾條ISP線路都接入,再通過一個trunk口出來,通過一台L2 switch劃分出幾個VLAN,分別對應不同的ISP線路。這樣做的好處就不多…