原文链接:nearform.com/digital-com…
作者:Lorenzo Sciandra
第二部分:JSI 与 JSC
React Native 重构计划始于2018年,这是Facebook为解决该跨平台移动解决方案长期存在的问题所进行的重大努力。
本系列文章将概述构成React Native新架构的核心要素。为使说明尽可能通俗易懂,我们将避免展示代码,同时分享我们对这项新实现的兴奋之情。
本文将深入解析 React Native 如何处理开发者编写的代码,以及架构重构带来的变革。
基于 JavaScript 的特性,React Native 团队必须依赖引擎进行解释,才能在原生移动应用中运行。在现有架构中,团队遵循苹果 iOS 规范中"使用适当的 WebKit 框架和 WebKit JavaScript"的要求(JSC 即 WebKit 所使用的引擎),直接采用了 JavaScriptCore(JSC)。
为强化这一组件(即当前React Native架构的第二层),开发者决定将编写代码生成的打包压缩JavaScript与"消化"这些代码的引擎彻底分离。这一目标通过在两者之间引入第三层组件实现,该组件被明确命名为JavaScript接口(JSI)。
JSI本身并非React Native的组成部分——它是一个统一、轻量、通用的接口层,理论上可适配任何JavaScript引擎。但将其嵌入新架构的整体框架后,便能实现若干关键性改进。
首要改进显而易见——JSC引擎如今可更便捷地替换为其他引擎(或JSC的新版本,如近期在RN 0.59中实现的更新)。其他可选方案包括微软的ChakraCore和谷歌的V8引擎。
第二项改进——或许可称之为整个重构架构的基石——在于"通过使用JSI,JavaScript能够持有对C++宿主对象的引用并调用其方法"。这意味着我们终于解决了前文阐述的核心问题:JavaScript与原生两个领域将真正实现相互感知,无需再将消息序列化为JSON进行传递,彻底消除桥梁上的拥堵(下文将深入探讨)。
这一变革意义重大,因为长期以来C++是Android与iOS间实现跨平台代码共享的少数途径之一——无需依赖JavaScript。Android的原生代码采用C/C++编写(Java和Kotlin需通过Java原生接口进行"下层转换"),而iOS同样默认支持C++(Objective-C本质上就是C语言的严格超集)。
React Native 的这次架构重构不仅实现了对现有结构的重大变革,更开启了为应用编写更多 C++ 代码的大门,同时简化了既有项目的改造流程。
若将架构图中的第二部分替换为新版对应组件(完整架构图详见首篇文章),变更效果如下所示:
至此,我们对重构架构的探索进入第二阶段。未来几周我们将陆续发布更多文章,深入剖析其余模块。在此期间,请记得将本文分享给开发者同仁,或通过推特(私信通道已开启)提出后续问题。
想必各位已预见,这些变革为后续模块的优化铺平了道路。我们期待这些改进能激发大家对代码库影响的热切期待——更令人振奋的是,这一切无需重写代码即可实现。
快上这趟期待之车吧!
系列文章: