React Native项目中什么是“本地的”,什么不是?

8

我对React Native的工作原理仍感到很困惑。也许是因为我没有足够的移动开发背景(虽然我尝试过一两次本地Android开发)。

如果我没记错,像Phonegap或Ionic这样的混合框架会在“WebView”中运行整个项目(或大部分项目),我错了吗?

而本地框架,如React Native,意味着要使用本地资源而不是纯Web技术。

但我们仍然编写Javascript代码,而React Native执行得非常快,它可能仍在使用我们刚编写的Javascript代码(我的意思是,它没有解析、翻译成本地代码并重新编译)。

我想知道的问题是,在React Native项目中什么是本地资源,什么不是?如果不是在“WebView”中运行我们编写的Javascript代码,那么它在哪里运行?是否存在本地库来创建Javascript与Objective-C和Java的接口以支持两个平台?在Web解决方案中,它只是将整个代码注入WebView中吗?

额外问题:仅因为我们为许多不同的平台编写一个代码,我们就可以将React Native视为混合框架,还是这不是正确的术语?

3个回答

12
如果我没错的话,类似Phonegap或Ionic这样的混合框架将在“WebView”中运行整个项目(或大部分),我错了吗?
是的。Phonegap和Ionic(使用PhoneGap实际上是Cordova作为框架的一部分)利用HTML、CSS和JavaScript来呈现UI。只有Cordova提供对设备本地API的访问(例如传感器)(据我所知)。
而原生框架如React Native则旨在使用本地资源而不是纯Web技术。
是的,RN的方法是使开发人员能够使用JavaScript和React框架同时保留本地开发的优势(性能、外观和感觉等)。
但我们仍然要编写JavaScript,而React Native完成工作的速度非常快,以至于它可能仍在使用我们刚刚编写的JavaScript(我的意思是,它没有解析、转换为本地代码并重新编译)。
这里我认为你的误解在于:你必须把React Native看作是一个“桥梁”,它连接着一个仍然依赖于iOS/Android/Windows本地API的本地应用和一段JavaScript代码。这个桥梁允许JS访问这些API,并关心渲染UI和其他不同的本地方面,以及提供相反方向的数据(从Native到JS)。JS代码永远不会被“转换”成Java或Swift/Obj-C。它的执行方式与您编写它的方式相同。但是,您有可能要求RN使用一些来自JavaScript的本地组件(比如,<Text>将在iOS中实例化一个UILabel)。然后,库使用一些组件来实现这种方法,如布局、视图、控件等,但基本原理仍然如上所述。
引用:
我想知道的问题是,在React Native项目中什么是本地资源,什么不是?
那么... 基本上,任何用JavaScript编写的东西都不是本地的,但是通过它的执行,您可以获得本地组件。使用本地API直接编写的任何内容(这是RN的优势之一,如果你感觉能力足够或库中没有实现某个本地组件,你仍然可以进行本地开发)都可以被认为是“本地的”。
如果不是在“webview”中运行我们编写的JavaScript,那么它在哪里运行?有原生库可以为两个平台创建JavaScript与Objective-C和Java之间的接口吗?
如前所述,React Native就是JS和Objective-C之间的接口。JavaScript在任何时候都不会在WebView中呈现。
在Web解决方案中,它只是将整个代码注入到WebView中吗?
React Native并不适用于Web...除非您使用this
额外问题:我们是否可以认为React Native是混合框架,因为我们为许多不同的平台编写了一种代码,或者这不是正确的术语?
嗯...我会说混合框架是一种结合不同开发资源(比如Web技术和本地API)的工具。在这种情况下,React Native属于该类别。我不会仅仅因为它在多个平台上工作而称其为混合框架(我只会简单地称其为多平台)。

你的意思是UI组件将由每个平台的本地组件支持?例如,在RN中的ListView将在Android中注入一个ListView布局?更具体地说,当我在RN中向我的React代码添加ListView,然后重新运行应用程序时,它会在Android方面编程实例化一个新的Android ListView并将其附加到布局中?这就是你的想法吗? - Victor Ferreira
是的,那正是它所做的。 - martinarroyo
你在这里提到了Windows,但据我所知,RN不支持Windows手机。 - HendraWD
1
虽然官方没有提供,但微软的工程师们维护了一个适用于UWP和WPF的版本。不过,某些组件还未实现:http://github.com/Microsoft/react-native-windows/ - martinarroyo
React-Native创建/桥接原生元素。很好,但是即使通过空中更新,如何修改UI呢?移动平台是否允许根据新的JavaScript包从基于JavaScript的JavaScript重新编译原生UI元素?如果可以,那么具体是如何实现的?底层实现是什么? - Marc
1
@JackBlack 原生组件不是从JavaScript编译的,而是实例化的。每次启动应用程序时都会执行JS代码,并且它可以调用本机API来创建UI(这就是为什么它被称为“桥接”)。由于将JS代码打包为本机应用程序的资产,因此可以通过空气中的不同版本进行交换(这在iOS和Android上都被允许)。下一次应用程序启动时,它将读取更新后的JavaScript代码版本,可能定义一个新的UI。 - martinarroyo

0
据我所知,本地资源是由框架/操作系统(Android/iOS)纯粹提供的组件。您必须具备相应的Android/iOS知识才能制作本地UI。
谈到ReactNative,它将使用您的JavaScript或HTML代码创建/生成本地组件。我可以说它将您的代码视为生成所需本地组件的命令。

0

来自https://hub.packtpub.com/react-native-really-native-framework/

“重要的是要知道所有操作都在三个主线程上完成:

  • UI(应用程序主线程)
  • 本地模块
  • JavaScript运行时”

基本上,主线程是JS(在JS运行时中,JS事件循环),其他所有内容都委托给本地模块。


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