React Native会将JavaScript编译成Java用于Android吗?

88
当我使用React Native开发混合应用时,我所编写的JavaScript代码是否会转换为Java代码或Java字节码,以供在创建Android应用程序时在Dalvik/ART运行时使用?还是只有UI组件编译成本机UI组件?或者像Fetch API这样的库是否将JavaScript代码编译为Java代码或Java字节码?
6个回答

118

基本上,你需要编写Javascript代码。它通过所谓的“桥接”与本地组件通信(Android上的Java,iOS上的Objective C,Windows上的C#)。

如果你感觉这种通信会拖慢速度,你可以选择将Javascript功能分别实现在Java、Objective C或者C#中,以使其完全运行在本地。在这种情况下,你编写的是纯本地代码,不存在Javascript到本地代码的编译过程。

这样做会为性能而牺牲兼容性。通常情况下不需要这么做。

  • 进一步阅读

理解React Native桥接概念


4
因为它非常描述性,所以选择最佳答案。谢谢你。您是否对JavaScript逻辑和Java逻辑进行过性能比较?例如,您是否通过Fetch Api运行网络请求并与retrofit等进行了运行时比较?当然,这更取决于网络速度而不是“本地”速度。也许您还进行了其他性能比较,例如本机获取相机对象和通过JavaScript获取相机对象? - unlimited101
1
它不是类似Ionic这样的混合型框架,你基本上是在webview中运行Web风格的JS。在React Native中,Javascript正在与Java或Objective C通信并创建本地元素。本地可以根据您所在的位置而有不同的含义-这个演讲的这一部分帮助我更好地理解了它(我也推荐观看演讲的其余部分): https://youtu.be/tWitQoPgs8w?t=318 - Nabha Cosley
1
所以,桥本质上是一个JS解释器,对吧? - pavi2410

27

代码仍然保持JavaScript原生代码并未转换成其他格式。混合应用程序在本地容器应用程序内运行,该应用程序调用JavaScript运行时引擎来执行JavaScript代码。希望这能澄清问题。


1
好的。你能告诉我你从哪里得到这个信息的吗? - unlimited101
2
https://facebook.github.io/react-native/docs/javascript-environment.html - Gurdev Singh
6
React Native 不是混合应用! - arled
1
@Owen React Native 是跨平台的,而不是混合式的。这是有区别的,我的朋友。 - arled
3
我认为你对于“混合”的定义可能与世界上其他人的不同。除了流行语之外,“混合”基本上意味着“两者都有一点”。React是JavaScript,React Native Bridge是C / Java——其中包含一点JavaScript和一点本地代码。因此,它是混合的。就像混合动力汽车一样,它既有一点电动,又有一点燃油。如果你理解的“混合”只是指Web视图,那么可以肯定它不使用Web视图。但是它仍然不是完全本地化的,这也属于混合类型——而90%的混合类型都是跨平台的。 - owenmelbz
显示剩余2条评论

10
基于"React Made Native Easy"一书:
实质上,React Native可以被认为是一组React组件,其中每个组件代表相应的本地视图和组件。
另外,React Native架构有两部分:
1. 本地代码/模块:在iOS情况下,大多数本地代码都是用Objective C或Swift编写的,在Android情况下则是用Java编写的。但是,对于编写React Native应用程序,我们几乎不需要为iOS或Android编写本地代码。
2. Javascript VM:运行所有JavaScript代码的JS虚拟机。在iOS / Android模拟器和设备上,React Native使用JavaScriptCore,这是驱动Safari的JavaScript引擎。JavaScriptCore是最初为WebKit构建的开源JavaScript引擎。在iOS情况下,React Native使用iOS平台提供的JavaScriptCore。它首次在iOS 7中与OS X Mavericks一起推出。
并且为了在这些部分之间进行通信:
React Native Bridge: React Native桥是一个C++ / Java桥,负责本地和Javascript线程之间的通信。使用自定义协议进行消息传递。

9

3

React Native

React -> JavaScriptCore -> 原生代码 -> "你所看到的"

混合应用程序

JavaScript -> 原生 WebView 封装器 -> "你所看到的"


1

React Native作为一个包装器。例如:如果您想在布局中放置一个按钮,您只需添加一个button标签。然后,您可以使用UI模块中的特定API在Android上呈现它。您可以轻松地创建自定义本机模块以在React Native项目中使用。但是,原生编写的代码通常更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接