Weex工具链的奥秘

news2024/11/26 16:29:52
 在2017年1月12日 Weex Conf 2017上,来自阿里的卜道依据Weex开发中的痛点介绍了Weex的打包和插件机制,同样来自阿里的归影介绍了Weex的调试工具Devtools,共同揭秘了Weex的工具链。本文是卜道和归影关于Weex工具链实践的分享整理。

Weexpack与插件机制

Weex开发中的痛点

Weex提供了一个高效的引擎,但是开发者仅有这个SDK是不够的,我们还需要更完善的类库和强大的调试工具,遇到问题可以用工具来解决,复杂的场景需要用工具来消解其复杂度,把复杂问题简单化。

Weex工具链

Pack一键打包,适合纯前端的开发者建立Weex应用,不需要关心native的具体做法。Devtools主要解决Weex代码的调试问题。插件机制能够让开发者从Weex市场安装插件到本地的工程中, 以搭积木的方式开发app。IDE还在持续建设中。

Weex SDK支持的扩展方式

Module是一些非UI的特定功能,sendHttp、openURL等可以作为module来扩展。Component是一些UI控件,RichText、DatePicker等可以作为component来扩展。Adapter/Handler是SDK内置的一些适配器接口,没有指定具体的实现,可以根据自己APP的情况选择合适的实现来作为功能的扩展,例如图片加载器等。

插件机制

示意图最上方是市场,市场中会有开发者发布的很多的可复用的插件。中间是我们的应用,与OS进行通信的是SDK,基于SDK有一个APP Framework(应用容器,包括了一些页面控制逻辑,解析插件的配置文件),Plugin Framework插件容器是插件安装的target,插件既可以从市场下载安装,也可以从本地或者github安装。插件是上述SDK的三种扩展方式的封装,可以调动native的接口,具有和native通信的能力,极大地扩展了应用的能力,扩展了Weex应用的边界。

插件到插件容器的映射

左侧是插件结构的示意图,配置文件为Plugin.xml,里面配置了插件的组成和相应平台需要安装的资源、源码及依赖,安装到了Plugin Framework中后,映射为了右侧的相应文件,分别对应到android平台和IOS平台。

打包及插件相关命令

左图是打包命令,Weexpack create创建一个新工程,包括必要的目录和一些配置文件,Weexpack platform add/remove用来安装或者移除应用模版,它的参数是相应平台的应用模板, Weexpack plugin add/remove用来安装和移除插件,参数为插件名,它是打包流程的一个可选项。右图是插件开发者的一些命令,通过Weexpack plugin create创建插件,配置好相关命令,通过publish发布。

插件的安装使用

打包及插件机制应用示例

上图案例中的插件是一个复杂插件,我们设置了其对其它插件的依赖关系,Weex-gcanvas插件提供基础的绘图能力,Weex-chart基于其所依赖的Weex-gcanvas进一步提供图表的能力。具体的步骤如上图所示。

Weex-gcanvas安装怎么完成的?首先,插件在plugin.xml定义了其依赖关系以及需要暴露的接口;然后,我们的工具会根据plugin.xml的配置去维护几个文件——config.xml和build.gradle, 如果涉及权限或者其他资源相应的也会去修改AndroidManifest, 源码和资源会被复制到插件容器对应的目录中。

插件机制的优点

  • 按需打包,插件可以按需灵活配置打包,app完全自主;
  • 独立升级,插件可独立升级,支持细粒度的版本控制;
  • 支持二次开发,插件可以二进制库或者源码形式发布,方便二次开发;
  • 流程自动化,提供完善的命令行工具,自动合并代码、资源及编译脚本;
  • 面向定制,可按需定制自己的插件仓库和平台模板;
  • 集成一键打包,插件工具和打包工具彻底打通,降低开发app的门槛。

展望——插件化的Weex APP

如果插件市场已经有了很多插件,功能很丰富,前端的开发者只需要写最熟悉的业务逻辑就能生成应用;而native开发者也能参与开发发布Plugin和Framework中来。

调试工具Devtools

Weex的调试需求

作为前端的开发者,需要哪些功能?在逻辑方面,最重要的,我们需要断点调试js,最好能直接在we文件里打断点;在渲染方面,需要可以查看dom层级结构(前端)/native view层级结构(native端)的工具;在优化方面,能不能看到native的各种网络加载信息,如加载bundle的信息和时间,或者JS运行时的堆快照(heap snapshot)等等。

Weex Devtool主要功能

上图是Weex Devtool提供的主要功能。Debugger可以远程调试Weex源码,可呈现原始的we代码结构并打断点。Inspector展示渲染节点的层级结构,可随时切换dom tree和native view tree,可以高亮某一个节点。

远程调试

在解决问题之前需要抽象问题,一个客观事实是如果想在Chrome里面调试JS,那这个JS必须运行在Chrome的运行时里面。Weex现有的流程概括为用户写的业务代码运行在native的运行时(android是V8,IOS是JSCore)里面,由这些运行时和JS的worker负责与native渲染引擎的通信。那么,问题抽象为如果要实现远程的运行时——Chrome,并实现运行时和native渲染引擎的通信。运行时环境哪家强?显然是worker,基于worker的前端是浏览器解决多线程的一种技术手段。今天用到的是其灵活和隔离性,一个worker可以很方便的创建和销毁,而且它又有比较好的独立性,所以是一个比较好的运行时环境。通信方面,利用一种计算RPC的方式,制定自己的协议,并通过这个协议与native的渲染引擎进行通信。优化方面,Weex加载Bundle的方式是直接加载Bundle的运行源码,调试时没办法打断点,所以调试工具做了一个中间层,将Bundle包装成一个函数并将其放在一个JS文件里面,利用Chrome的运行时去加载这个文件。还原成源码中打断点,即提供一个Sourcemap。

Inspector原理

Inspector是模仿Chrome的Inspector制作的。Chrome的调试工具是一个Web APP,是纯前端技术写出来的APP。其数据是Chrome通过remote debug protocol协议发送给Devtool工具,这些数据一部分来自渲染引擎,另外一部分来自V8引擎。对于前端来说,无论是渲染引擎还是V8都在一个Chrome里面,但是对于Weex的场景并不是这样的。Weex的JS是运行在Chrome的运行时里面,渲染是在手机native端,调试这些调试信息需要通过Chrome的V8来获取,而且只能给到原生的Devtool。而我们的层级信息需要手机的native端给到,所以只能自己做了一个extension页面去承载和表现这部分的数据。

整体架构

分三层:最上层是Devtool的前端;中间是Node Server,主要负责RPC消息转发、维持session多实例管理的功能;最下层是Native Inspector。这些RPC是需要在native端安插内应的,即android和IOS的Native Inspector模块,它会截获本身Weex的SDK应该发给native runtime的所有信息,然后将这些信息转发给远程的Weex调试工具。

困境和展望

最大的困境是调试体验太分离,因为分为两个界面,并且一部分的功能需要extension提供。但是,Weex Devtool 1.0.0已经正在开发,逐步完善解决这些问题。

更多linux咨询请查看www.linuxprobe.com

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

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

相关文章

MyBatis各种类型查询数据的数据绑定

文章目录 1、前言2、查询一个实体类对象字段名和属性名无法映射处理方式一:起别名方式二:使用全局配置文件配置映射规则方式三:自定义resultmap 3、查询一个list集合4、查询单个数据5、查询一条数据为map集合6、 查询多条数据为map集合方式一…

Python中使用Scipy模块中root函数求解非线性方程的解法举例

Python中使用Scipy模块中root函数求解非线性方程的解法举例 Python中的SciPy模块功能强大,下面举例说明使用该模块求解非线性方程或非线性方程组。在求解时候,用到scipy.optimize模块中的root函数。 1.root函数的调用格式 调用它们的格式为 from scipy…

使用MinIO文件存储系统【完成视频断点续传】业务逻辑

目录 视频上传 接口一:检查该视频/媒资文件是否已经上传完成 接口二:检查视频分块是否已经在minio中已经存在 接口三:上传分块文件到minio中(已经上传的分块会在接口二进行校验) 接口四:合并上传的分块…

git生成密钥方法

1、密钥生成 打开Git Bash,查看ls ~/.ssh下是否有密钥文件id_rsa*,有的话可先进行备份。 然后用如下命令生成新密钥: ssh-keygen -t rsa -C "your_emailexample.com" 参数含义: -t 指定密钥类型,默认是 …

chatgpt赋能Python-pythonbif

Python Bif: 简介和使用指南 Python Bif是一种用于机器学习和数据科学的强大包。它提供了一些重要的功能,例如分类、集成和回归。这篇文章将向您介绍Python Bif的主要特性和如何使用它来完成各种数据科学任务。 什么是Python Bif? Python Bif是一个通…

Spring源码阅读:AOP原理

一、概述 以下便是Spring Aop的流程,下面我将一一介绍下面的各个方法。 下面是流程中的主要方法。 二、测试代码 下面我将写一个例子介绍Spring Aop的流程。 被增强类: public class MyCalculator {public Integer add(Integer i, Integer j) throw…

逼近GPT-4!BLOOMChat: 开源可商用支持多语言的大语言模型

背景 SambaNova和Together这2家公司于2023.05.19开源了可商用的支持多语言的微调模型BLOOMChat。 SambaNova这家公司专注于为企业和政府提供生成式AI平台,Together专注于用开源的方式打造一站式的foundation model,赋能各个行业。 OpenAI的GPT-4和Goo…

【将maven源改为国内阿里云镜像】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 1. 如何配置Maven镜像? 2. Idea中m…

【Java入门】初识Java

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Java入门篇系列,该专栏主要讲解:什么是java、java的数据类型与变…

MATLAB|004|MATLAB M-Files|MATLAB数据类型

MATLAB M-Files 我们一直强调MATLAB是一个功能强大的编程语言及交互式计算环境,之前学习的内容中,我们学会了在 MATLAB 命令提示符下输入命令,而且我们主要是把MATLAB环境作为一个计算器使用。其实,MATLAB 还允许写入到一个文件中…

5分钟掌握利用pycharm插件BitoAI 实现chatgpt自动编写代码

一、BitoAI 简介 最近出现了一款新型编程助手BitoAI。今天的主要内容就是给大家介绍它,号称 IDE 的“瑞士军刀”,可以提升开发 10 倍的效率。 简言之它的强大之处就是可以通过类似于ChatGPT对话的方式来编写代码,分析代码,生成代…

Flutter控件之Tab选项卡封装

Tab选项卡,这是一个非常常见且权重很高的一个组件,随便打开一个App,比如CSDN,如下图,首页顶部就是一个Tab选项卡,这个功能可以说,几乎每个App都会存在。 在Android中,我们可以使用Ta…

“Shell“iptales防火墙设置

文章目录 一.Linux防火墙基础1.1Linux包过滤防火墙概述1.2四表五链1.3规则链之间的匹配顺序1.4规则链内的匹配顺序1.5总结 二.编写防火墙规则2.1iptables防火墙的配置方法2.2规则的匹配2.3命令使用 一.Linux防火墙基础 1.1Linux包过滤防火墙概述 Linux 系统的防火墙: IP信息包…

惯性导航论文详解:神经惯性定位

来源:投稿 作者:小灰灰 编辑:学姐 论文标题:Neural Inertial Localization 论文链接: https://arxiv.org/pdf/2203.15851v1.pdf 图1.从IMU测量到位置估计。给定惯性传感器数据(左),我们的方法…

C#,生信软件实践(04)——DNA数据库EMBL格式文件的解释器之完整源代码

EMBL文件的格式详解请阅读前面的文章: C#,生信软件实践(02)——DNA数据库EMBL格式详解及转为FASTA格式文件的源代码https://blog.csdn.net/beijinghorn/article/details/130462070 本文的代码用于: (1&a…

Linux---文件操作命令(cp、mv、rm)

1. cp命令 cp命令可以用于复制文件\文件夹,cp命令来自英文单词:copy。 语法:cp [选项] 参数1 参数2 参数1:Linux路径,表示被复制的文件或文件夹 参数2:Linux路径,表示要复制去的地方 选…

《Java 核心技术面试》课程笔记(十一)

Java 提供了哪些 IO 方式? 典型回答 Java IO 基于不同的 IO 抽象模型和交互方式,可以分为: BIO,传统的 java.io 包,它基于流模型实现。 提供了我们最熟知的⼀些 IO 功能,比如 File 抽象、输入输出流等。交…

安装编译PostgreSql15.3.0

一、下载源码 方式一 官网手动下载 https://www.postgresql.org/download/. 解压 tar -zxvf postgresql-14.2.tar.gz方式二 git clone git clone https://github.com/postgres/postgres.git解压或下载后计入postgres目录 cd postgres-15.3二、创建目录 用root账户创建 创建…

[iOS开发]<多线程-NSOperation操作队列NSOperationQueue>

前言 寒假期间学习过GCD。今天学习NSOperation。同样都是多线程封装,NSOperation和NSOperationQueue是基于GCD的更高一层的封装,完全的面向对象,相比于GCD复杂的各种API方法,它的优势就是更加的简单实用,代码的可读性…

电力电子课设—数控产生PWM波——使用51单片机输出占空比可调PWM波(按钮控制、数码管显示)控制速成教程

我们学校电气专业开始做电力电子的课设了,小组选了一项制作硬件电路的任务,里面有要求采用数控方式实现DC-DC电压变换的输出电压调节,数控在电路中的体现就是用单片机输出可调占空比的PWM作用于产生PWM波控制IGBT的芯片。考虑到可能有同学没接…