为什么 React Native (RN) 不能将 main.bundle.js 转换为原生代码,以避免 VM 和原生模块之间的 RN 桥接



我想知道为什么我们需要 React Native 引擎中的 RN 桥,它将 Javascript VM(JavascriptCore(与原生模块连接起来。这种桥接和消息传递设置只会减慢应用速度并造成瓶颈。为什么 React Native CLI 生成的包包包器不能仅仅将 javascript 代码捆绑到 main.bundle.js 中,还可以将其转换为原生代码?我听说的一个原因是 coz javascript 不是强类型,但这个原因似乎并非无法解决。还有其他原因吗?

事实上,将javascript转换为本机代码将提供巨大的性能改进,但这根本不是一件容易的事情。话虽如此,从一种语言到另一种语言的转换有很多原因,如果我们认为宿主语言是javascript,目标语言是java或类似的东西,如C#和目标c,则尤其如此。

Javascript与这些语言截然不同,许多想法很难映射到一对一,思维方式也完全不同。

javascript的另一个特别之处在于,很难将其转换为另一种语言,那就是javascript永远不能成为版本控制的语言,并且由于它是Web的语言,因此必须始终支持向后兼容性。这意味着如果一个工具要从javascript转换为另一种语言,这个工具需要支持javascript支持的所有内容 - 有人可能会争辩说,一个工具可能只支持javascript的最新子集,比如es6,但是这很危险,原因有两个,一个是很难准确定义这个子集,因为许多es6功能都是通过es5的polyfills工作的, 第二,这意味着这个工具将无法支持所有的JavaScript生态系统。

以下是有关JavaScript的一些具有挑战性的部分的一些细节,这些部分将被转换为Java等语言:

JavaScript
  • 是一种动态语言,不仅对类型没有限制,而且 JavaScript 在不同条件下的不同操作中做了极其复杂的类型强制技术
consider this
true + 1 === 1 + '1' // false
true + 1 === 1 + +1 // true
  • Javascript最近才引入模块系统(从es6开始(,这实际上意味着任何程序都是一个巨大的代码块,变量贯穿整个程序。
  • Javascript继承系统(Prototypal继承系统(与这些语言中的经典继承系统截然不同,例如在javascript中,运行时可以更改对象的类,同时在运行时也可以更改类的方法。

现在,除了所有技术挑战之外,请注意,在制作这样的RN时,这里有一个产品明智的决定。这使得 RN 能够更快地进入市场,并且不受某些本机语言的束缚,这意味着只需将 UI 控件转换为该环境的本机 UI 并保持 JavaScript 原样,就可以更轻松地支持新环境。最重要的是,如果明天有人找到一种方法将javascript转换为java,那么该工具可以轻松地集成到RN管道中,而不会影响RN的其他组件和支持的环境。

最新更新