用WEB技术栈开发NATIVE应用(二):WEEX 前端SDK原理详解

摘要: WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app。其同时解决了开发效率、发版速度以及用户体验三个核心问题。那么WEEX是如何实现的?目前WEEX已经完全开源,并捐给Apache基金会,我们可以通过分析其源码来一探究竟。

点此查看原文:http://click.aliyun.com/m/43048/

作者:阿里-移动云-大前端团队

传统的移动端开发,一个完整的业务需要维护三份终端代码:Android、iOS、H5,这带来了极大的开发成本以及维护成本。尤其是对处于业务初创期需要快速试错的业务以及需要支持定期运营活动的业务。所以业界也一直在探索跨平台方案,旨在通过一套代码完成各个终端的业务逻辑。相关方案经过不断演化,从早期的H5、Hybrid到如今的Cloud Native(云原生),在开发效率和用户体验上都在一点点逼近最初的设想。
早期H5和Hybrid方案的核心是利用终端的内置浏览器(webview)功能,通过开发web应用满足跨平台需求。该方案可以解决跨平台问题,同时可以提升发版效率。但其最大的弊端在于用户体验相较于native开发的app存在较大差距,经常出现页面卡顿,加载慢等问题。

于是后来业界开始探索依旧利用web技术栈开发出媲美原生体验app的方案,于是以WEEX为代表云原生开发框架开始出现。所谓云原生(Cloud Native)指可以通过云端快速发布(与远程web应用发布流程类似),同时还可以达到媲美原生App体验的方案。WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app。其同时解决了开发效率、发版速度以及用户体验三个核心问题。那么WEEX是如何实现的?目前WEEX已经完全开源,并捐给Apache基金会,我们可以通过分析其源码来一探究竟。

WEEX框架主要分为两部分:
1.前端JavaScript框架
2.Native SDK
在上一篇博客中,我们介绍了Native SDK的原理,本文主要介绍其前端JavaScript框架原理。

1 整体架构

首先还是再来看下WEEX开发的整体架构:
可以看到在JS-Native Bridge将渲染指令发送给Android或者iOS渲染引擎之前,我们的业务代码运行在JSCore/v8的执行引擎之中,而在该执行引擎之中除了执行业务JSBundle,还运行着JS Framework,JS Framework不仅提供了jsbundle必要的运行时环境,同时还提供了与native通信的接口。
而这个JS Framework就是我们今天介绍的重点。
这是前端框架的主要架构:
FRONTEND FRAMEWORK/DSL:这是WEEX的开发框架,目前WEEX主要是使用Vue.js进行开发
WEEX-VUE-LOADER:前端编译器,将vue文件编译成es5代码
WEEX-VUE-FRAMWORK:WEEX核心框架,主要负责将virtual dom转换成weex的native dom api
WEEX-RUNTIME:负责与native渲染引擎对接,将native dom api转换成对应平台(Android、iOS)的platform api,然后传递给native渲染引擎,由后者负责渲染工作。

2 Vue.js

首先来看下前端开发框架Vue.js,Vue.js目前与React 、 Angular构成了三大最流行的前端开发框架,Vue.js具有组件化、virtual dom以及MVVM三大特性,还学习React的Redux,引入了状态管理模块Vuex。同时相比起React主要基于JSX,Vue.js的开发模式更加清晰,简单,上手速度更快。.vue 文件通常可以分为三部分:<template> 、<style> 和 <script>,<template> 是必须要有的,其他可选。其中 <script>中的代码会保留或者被转换成 ES5 的语法;<style> 中的 CSS 在 Weex 平台上会被转换成 JSON 格式的样式声明,放到组件的定义中去;<template> 会被编译生成组件定义中 render 函数,可以理解为 render 函数的语法糖。下文是一个简单的.vue文件:
<template> <div style="justify-content:center;"> <text class="freestyle">Hello World!</text> </div></template><style scoped> .freestyle { text-align: center; font-size: 200px; }</style>

3 WEEX-VUE-LOADER

由于.vue文件并不是标准的JavaScript代码,该代码不能直接被JS执行引擎识别,所以在编译过程中需要将.vue文件转化成标准的es5代码。而负责完成这一操作的就是WEEX-VUE-LOADER。

4 WEEX-VUE-FRAMEWORK&WEEX-RUNTIME

完成编译后,输出的bundle.js即可被JS执行引擎所识别,可以执行其逻辑了。那么接下来就来看下bundle.js的执行过程。

4.1 初始化

首先来看下初始化过程。
图中画出了 Weex SDK 的部分内容。其中 weex-vue-framework 和 Vue.js 是对等的,语法和内部机制都是一样的,只不过 Vue.js最终创建的是 DOM 元素,而 weex-vue-framework 则是向原生端发送渲染指令,最终渲染生成的是原生组件。Weex Runtime 用来对接上层前端框架( Vue.js )并且负责和原生端之间的通信。Render Engine 就是针对各个端开发的原生渲染器,包含了 Weex 内置组件和模块的实现,可扩展。

4.2 创建组件

weex接收到bundle.js之后,首先检查其合法性,如果发现用的是Vue版本(weex早期版本使用.we语法),就会调用weex-vue-framework中提供的createInstance创建实例。一个bundle.js对应一个weex实例,且每一个实例都有唯一的instanceId,与之对应。实例与实例之间相互隔离,互不干扰。
在创建实例的过程中,bundle.js会执行new Vue()创建一个vue组件,并通过其render函数创建VNode节点,即virtual dom节点。第二节中的示例代码会最终生成类似如下的vnode节点:
{ tag: 'div', data: { staticStyle: { justifyContent: 'center' } }, children: [{ tag: 'text', data: { staticClass: 'freestyle' }, context: { $options: { style: { freestyle: { textAlign: 'center', fontSize: 200 } } } }, children: [{ tag: '', text: 'Hello World!' }] }]}

4.3 patch

生成了VNode之后,接下来需要将VNode同步到真实的Dom之上,该过程在Vue.js中被称为patch,patch会比较新旧VNode之间的差异,最小化操作集。最后再将Virual Dom整体更新到真实Dom之上。在执行 patch 之前的过程都是 Web 和 Weex 通用的,所以文件格式、打包编译过程、模板指令、组件的生命周期、数据绑定等上层语法都是一致的。

然而由于目标执行环境不同(浏览器和 Weex 容器),在渲染真实 UI 的时候调用的接口也不同。
在vue.js内部,weex平台和web平台的patch方法有所不同。简单来讲,在web平台,patch需要将Virtual Dom利用标准Dom API更新到真实Dom即可。接下来的UI更新就交给浏览器即可。

但是由于在weex平台下,最终的UI渲染是由native渲染引擎执行的,native渲染引擎不能识别Dom API,所以在weex平台下,需要将Virtual DOM转化成native 渲染引擎可以识别的Native DOM API。

4.3 发送渲染指令

在上层前端框架调用了 Weex 平台提供的 Native DOM API 之后,Weex Runtime 会构建一个用于渲染的节点树,并将操作转换成渲染指令发送给客户端。

回顾文中提到的 例子,上层框架调用了 Weex Runtime 中 createBody 、createElement 、appendChild 这三个接口,简单构建了一个用于渲染的节点树,最终生成了两条渲染指令。

Platform API 指的是原生环境提供的 API,这些 API 是 Weex SDK 中原生模块提供的,不是 js 中方法,也不是浏览器中的接口,是 Weex 内部不同模块之间的约定。

目前来说渲染指令是基于 JSON 描述的,具体格式大致如下所示:
{ module: 'dom', method: 'createBody', args: [{ ref: '_root', type: 'div', style: { justifyContent: 'center' } }]}

{ module: 'dom', method: 'addElement', args: ['_root', { ref: '2', type: 'text', attr: { value: 'Hello World!' }, style: { textAlign: 'center', fontSize: 200 } }]}

4.4 渲染原生组件

接下来就是WEEX NATIVE SDK的工作了,具体逻辑在上一篇博客已经详细说明了,此处仅简单说明。
原生渲染器接收上层传来的渲染指令,并且逐步将其渲染成原生组件。

渲染指令分很多类,文章中提到的两个都是用来创建节点的,其他还有 moveElement 、updateAttrs 、addEvent 等各种指令。原生渲染器先是解析渲染指令的描述,然后分发给不同的模块。关于 UI 绘制的指令都属于 "dom" 模块中,在 SDK 内部有组件的实现,其他还有一些无界面的功能模块,如 stream 、navigator 等模块,也可以通过发送指令的方式调用。

这个例子里,第一个 createBody 的指令就创建了一个 <div> 的原生组件,同时也将样式应用到了改组件上。第二个 addElement指令向 <div> 中添加一个 <text> 组件,同时也声明了组件的样式和属性值。
上述过程不是分阶段一个一个执行的,而是可以实现“流式”渲染的,有可能第一个 <div> 的原生组件还没渲染好,<text> 的渲染指令又发过来了。当一个页面特别大时,能看到一块一块的内容逐渐渲染出来的过程。

5 总结

通过本文以及上一篇:WEEX NATIVE SDK原理详解,总算是将weex的大致原理介绍清楚了,当然还有很多实现细节文中并未展开,有兴趣的朋友可以留言大家一起讨论下,另外文章中有错误的地方也请大家指正!

识别以下二维码,干货

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

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

相关文章

cad查看_CAD与天正软件对齐命令实例讲解

好课推荐&#xff1a;1、CAD2014&#xff1a;点击查看 2、室内&全屋&#xff1a;点击查看 3、CAD2019&#xff1a;点击查看4、CAD2018&#xff1a;点击查看5、Bim教程&#xff1a;点击查看 6、室内手绘&#xff1a;点击查看7、CAD三维&#xff1a;点击查看8、全屋定制&…

Storm精华问答 | storm与Hadoop区别?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理大量数据。它是一个流数据框架&#xff0c;具有最高的摄取率。今天&#xff0c;我们就挑一些Storm的安装配置问题来看看吧。1Q&#xff1a;…

weex 在 iOS 上如何实现常见的网络缓存

摘要&#xff1a;weex 旨在兼顾web动态性与native的用户体验&#xff0c;如果想将两者的优势最大化&#xff0c;那么缓存就显得格外重要&#xff0c;本文介绍如何利用缓存&#xff0c;实现weex页面迅速打开&#xff0c;甚至“秒开”的效果。点此查看原文&#xff1a;http://cli…

python实现多智能体一致性_促进产学研,多智能体协同控制——科研与实践教学齐飞...

对多智能体感兴趣欢迎Wangzaixiaolatiao&#xff08;VX&#xff09;沟通。一、引言1.1、概述多智能体协同控制系统即多个智能体组成的集合&#xff0c;它的目标是将大而复杂的系统集成设成小的、彼此互相通信和协调的、易于管理的系统。多智能体协同控制系统在表达实际系统时&a…

android 汇编 参数,安卓ARM汇编基础知识

ARM 是 Advanced RISC Machine 的缩写&#xff0c;可以理解为一种处理器的架构&#xff0c;还可以将它作为一套完整的处理器指令集。RISC(Reduced Instruction Set Computing) 精简指令集计算机&#xff1a;一种执行较少类型计算机指令的微处理器。处理器指令集: 计算机处理命令…

移动推送消息送达常见问题与解决办法

摘要&#xff1a; 一、 收到重复的推送内容 * 收到重复的推送内容&#xff0c;排除了业务自身的推送逻辑之外&#xff0c;重点介绍一下部分机型多渠道推送可能带来的重复推送问题。 * 对于Android系统&#xff0c;对于设备已经在某些三方系统中注册过&#xff0c;并且通过该三方…

帮助你驾驭 Kubernetes 的 4 个工具 | Linux 中国

学习如何驾驭 Kubernetes 比如何建造它更重要&#xff0c;这些工具可以帮助你更快上路。-- Scott Mccarty译者|Xinyu Wang来源|Linux中国在本系列的第三篇文章中&#xff0c;Kubernetes 基础&#xff1a;首先学习如何使用&#xff0c;我强调你应该学会使用 Kubernetes&#xff…

三大新功能发布 阿里云短视频SDK玩法多 优惠更多

摘要&#xff1a; 近日&#xff0c;阿里云短视频SDK进行了重大升级&#xff0c;对视频滤镜和视频特效方面进行了功能更新&#xff0c;助力用户快速接入带来更多的玩法。 短视频SDK介绍 短视频SDK提供短视频录制、导入和编辑的高级功能&#xff0c;支持多种分辨率选择、实时美颜…

html asp 日历_全球第一本《2021世界艺术日历》,正式发售!

原标题&#xff1a;全球第一本《2021世界艺术日历》&#xff0c;正式发售&#xff01;艺术&#xff0c;人类精神文明的美丽结晶。作为一名资深艺术爱好者&#xff0c;多希望 每天都能和名画为伴&#xff0c;接受各个时期艺术佳作的熏陶。 记得2020年的开头&#xff0c; 我买了好…

三星计划替换所有日产半导体材料;美企过度响应“禁令”,华为被曝祭出数亿索赔;苹果iPhone 11发布日期刚刚泄露...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

button hover逐渐变色_两当水库界桩@产品长久不变色 - 两当安全防护

河北合诺电力设备有限公司成立于2009年&#xff0c;位于河北省石家庄市新华区&#xff0c;是一家富有高科技生产力与完善服务体系的综合性企业。公司集科研、生产、销售及服务于一体&#xff0c;厂区占地50余亩&#xff0c;现有员工135人&#xff0c;专业资质技术人员26人&…

I+关系网络分析发布,提供完整的可视化分析和关系引擎功能

摘要&#xff1a; I关系网络分析是以OLP模型为核心&#xff0c;面向业务快速建模&#xff0c;为开发者和终端用户提供大数据关系计算引擎&#xff08;含API服务&#xff09;和可视化交互分析能力&#xff0c;面向安防、关税、银行、保险、互联网等提供的产品化方案。目前&#…

赞,全网开发者都在学的 26 门 AI 课程!

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;免费的在线学习课程一直是大多数人学习 AI 知识和技能的方式之一。今天&#xff0c;基于 Github 上一位小姐姐 Chip Huyen 分享的 10 门机器学习课程&#xff0c;AI科技大本营将这份收藏大礼包进…

结构损伤检测与智能诊断 陈长征_宿迁厂房安全检测多少钱介绍说明

检测与鉴定1. 混凝土类材料(混凝土试块和混凝土芯样抗压强度、砂浆试块抗压强度)试验&#xff1b;2. 钢筋及接头(钢筋原材和焊接接头、钢筋后锚固件)力学工艺性能试验&#xff1b;3. 混凝土结构检测混凝土预制构件结构性能检测、钻芯法检测混凝土强度、混凝土回弹法检测强度、钢…

阿里云ECS开放批量创建实例接口,实现弹性资源的创建

摘要&#xff1a;为了更方便的实现弹性的资源创建&#xff0c;方便用户一次运行多台ECS按量实例来完成应用的开发和部署&#xff0c;阿里云开放了ECS的批量创建实例接口RunInstances&#xff0c;可以单次最多创建100台实例&#xff0c;避免重复调用和创建。点此查看原文&#x…

项目是如何死掉的?太过真实!

戳蓝字“CSDN云计算”关注我们哦&#xff01;做项目多年&#xff0c;见过成功的项目&#xff0c;也见过太多失败的项目&#xff1b;成功或失败&#xff0c;都是项目的宿命。我总结了项目失败的几点要素&#xff0c;供有志于将项目做失败的同学参考。绝大多数人在面对失败的可能…

igmp是哪个层协议_通俗易懂网络协议(IP)

之前写过一篇《通俗易懂TCP/IP(概述)》&#xff0c;广受欢迎和好评&#xff0c;有网友催更&#xff0c;便抽空续写IP章节&#xff0c;回应粉丝期待。TCP/IP网络模型TCP/IP网络模型分为4层&#xff0c;自下而上分布为链路层(又叫网络接口层)、网络层、传输层、应用层。链路层&am…

opporeno3pro可以刷鸿蒙系统吗,华为P40放大招!鸿蒙系统+120Hz+徕卡五摄,明年2月发布!...

自OPPO副总裁沈义人在微博上多番爆料后&#xff0c;机粉们对于OPPO Reno3 Pro的期待值上升到了一个新高度。在期待了近一个月后&#xff0c;12月26日&#xff0c;全新OPPO Reno3系列将正式发布——OPPO Reno3 Pro这次真的来了&#xff01;而与此同时&#xff0c;OPPO也在近期官…

三款新功能发布,助力阿里云表格存储再次升级

摘要&#xff1a;阿里云表格存储于近期功能再升级&#xff0c;升级后的表格存储支持对DataHub采集的数据进行持久化存储&#xff0c;其Python SDK新增支持Python 3.x&#xff0c;以及最新发布的TimelineLib能够帮助用户轻松构建千万级IM和Feed流系统。点此查看原文&#xff1a;…

基于阿里云实现游戏数据运营(附Demo)

摘要&#xff1a; 原作者&#xff1a;阿里云解决方案架构师&#xff0c;陆宝。通过阅读本文&#xff0c;您可以学会怎样使用阿里云的maxcompute搭建一套数据分析系统。一、总览一个游戏/系统的业务数据分析&#xff0c;总体可以分为图示的几个关键步骤&#xff1a;1、数据采集&…