【翻译】全新 React Native 架构解析:第二部分

0 阅读3分钟

原文链接: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++ 代码的大门,同时简化了既有项目的改造流程。

若将架构图中的第二部分替换为新版对应组件(完整架构图详见首篇文章),变更效果如下所示:

至此,我们对重构架构的探索进入第二阶段。未来几周我们将陆续发布更多文章,深入剖析其余模块。在此期间,请记得将本文分享给开发者同仁,或通过推特(私信通道已开启)提出后续问题。

想必各位已预见,这些变革为后续模块的优化铺平了道路。我们期待这些改进能激发大家对代码库影响的热切期待——更令人振奋的是,这一切无需重写代码即可实现。

快上这趟期待之车吧!

系列文章:

第一部分 | 第三部分 | 第四部分