111

JS Native:覆盖阿里几乎所有产品的全新开发模式,到底有何高明之处(二)? - 恒生技...

 6 years ago
source link: http://rdc.hundsun.com/portal/article/847.html?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

JS Native:覆盖阿里几乎所有产品的全新开发模式,到底有何高明之处(二)?

上一文中,我们主要介绍了JS Native和其主要的应用场景,以及优缺点分析。下节我们继续深挖S Native的开发原理以及其性能表现,敬请关注!

【JS Native的原理】

看完了JS Native的介绍是不是觉得这种开发模式非常的神奇呢,下面就试着简单的解释一下JS Native的原理。

首先要明白的一点是,即使使用了JS Native,我们依然需要各系统SDK等框架,调用的是原生代码。总之,JavaScript只是辅助,它只是提供了配置信息和逻辑的处理结果。JS Native与Hybrid也完全没有关系,它只不过是以JavaScript的形式告诉系统该执行什么原生代码。

其次,JS Native能够运行起来,全靠原生代码和JavaScript的交互。对于没有接触过JavaScript 的人来说,非常有必要理解JavaScript代码如何被执行。我们知道C、Java等语言,经过编译,链接等操作后,会得到一个二进制格式的可执行文,所谓的运行程序,其实是运行这个二进制程序。

而JavaScript是一种脚本语言,它不需要经过编译、链接等操作,而是在运行时才动态的进行词法、语法分析,生成抽象语法树(AST)和字节码,然后由解释器负责执行或者使用JIT将字节码转化为机器码再执行。整个流程由JavaScript引擎负责完成。

原生代码与JavaScript交互
无论是Google的V8引擎还是苹果的JavaScript Core引擎都提供了给原生代码调用JavaScript的能力,原生代码可以轻松简单的执行JS代码并得到执行结果。

▲ JavaScript调用原生代码
由于上面说的这些JavaScript引擎是面向原生代码的框架,在原生代码这一端,我们对JavaScript上下文知根知底,可以很容易的获取到对象,方法等各种信息,当然也包括调用JavaScript函数。
真正复杂的问题在于,JavaScript 不知道 Objective-C 有哪些方法可以调用。

解决这个问题的通常方案是在原生和JavaScript两端都保存了一份配置表,里面标记了所有原生代码暴露给JavaScript的模块和方法。这样,无论是哪一方调用另一方的方法,实际上传递的数据只有ModuleId、MethodId和Arguments这三个元素,它们分别表示类、方法和方法参数,当原生代码接收到这三个值后,就可以通过反射机制唯一确定要调用的是哪个函数,然后调用这个函数。

▲ 闭包与回调
既然说到函数互调,那么就不得不提到回调了。对于原生代码来说,执行完JavaScript代码再执行原生回调毫无难度,难点依然在于JavaScript代码调用原生代码之后,如何在原生代码中,回调执行JavaScript代码。

目前普遍的做法是:在JavaScript调用原生代码时,注册要回调的信息,并且把注册id作为参数发送给原生代码,调用完原生代码函数后根据注册id找到要执行的JavaScript回调代码并通过JavaScript引擎调用。

【JS Native的性能】

在了解了JS Native的原理之后大家不免心生怀疑,这JS Native虽然最终执行的是原生代码,但毕竟多了一层JavaScript引擎,性能会不会打折扣呢。
我们来看下阿里在WEEX发布时公布的WEEX、React Native、Web、原生四者的性能对比:

f_782dfcbfb8aa266f09c1869c5ebfe50b.png

从图中我们可以看出在渲染时间、内存使用、CPU占用、帧率这四方面原生的性能是最好的,而两个JS Native框架在这四方面均不同程度优于Web。

恒生技术之眼原创文章,未经授权禁止转载。详情见(点击)转载须知

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK