返回博客首页
← 所有帖子

由 V8 提供支持的新 iOS 运行时

2019 年 9 月 19 日 - 作者 Emil Tabakov

什么是 iOS 运行时,它是如何工作的?

运行时是连接“原生”和“JavaScript”世界的原生桥梁。Android 和 iOS 各有一个,这两个运行时是框架的核心,它支持 NativeScript 中许多独特的功能。由于运行时负责评估我们在应用程序中编写的 JavaScript 代码,因此它们自然需要一个嵌入式引擎来处理此职责。出于各种遗留原因,这两个运行时使用不同的 JavaScript 引擎 - V8 用于 Android 运行时,而 JavaScriptCore 用于 iOS 运行时。有关所有这些操作方式的更多信息,可以在 文档 中找到。

为什么我们需要改变它?

维护两个具有两个不同 JavaScript 引擎的运行时会带来一些挑战。

  • 它需要巨大的努力来跟上维护。特别是如果 JavaScript 引擎不是像 JavaScriptCore 那样为嵌入式设计,则可能涉及大量的自定义,这使得升级变得很困难。
  • 功能一致性也不是开箱即用的东西 - 在某些情况下,它甚至是不可能的。NativeScript 支持 Android 的快照就是这种情况,可以提高你的启动时间。此功能来自 V8,并且在 JavaScriptCore 中没有等效的功能。

我们选择了哪种方法?

我们选择对两个平台都使用 V8,原因有以下几个。

  • 我们使用的 JavaScriptCore 版本已经与主存储库大相径庭,以便能够支持框架需要的所有内容。这使得每次升级不仅具有挑战性,因为更改通常并不微不足道,而且还非常耗时 - 可能需要 3 个月的人工才能完成。
  • V8 非常适合嵌入,现在 支持无 JIT 模式,这使得它可以在 iOS 上使用。
  • 这使得我们能够在将来提供 Bitcode 支持,这是其他令人兴奋的功能(例如在 NativeScript 中编写 Apple Watch 应用程序)的障碍。

几个月前,运行时团队的 Darin Dimitrov 开始了一个 POC 来验证这是否可行,并且一步一步地,他最终发现这个选项变得非常现实。作为这项工作的核心驱动者,Darin 与 Google 的 V8 团队进行了广泛的合作,他们在这一过程中提供了极大的帮助。现在,我们要向 Jakob Gruber 表示衷心的感谢,感谢他一路以来的帮助。

在这一点上,我们的大部分测试都通过了新的运行时,我们也设法让一些内部应用程序可以使用它。性能与官方版本类似,即使没有提供对快照的支持。也就是说,我们非常高兴与大家分享这些内容。

试一试!

测试新的 iOS 运行时非常容易。你需要一个可以工作的 NativeScript 应用程序 - 你可以在一个全新的空白项目上尝试,也可以在一些现有的应用程序上尝试(确保备份!)。你只需要运行以下命令

tns platform add ios@alpha-v8

之后,以通常的方式运行应用程序

tns run ios

你就完成了!

已知限制

以下功能尚未实现,并且无法正常工作。

  • 向量类型
  • 不支持 Safari 检查器和 Chrome DevTools
  • 没有 armv7 架构
  • 没有日志记录
  • 缺乏错误处理
  • HMR 仅适用于真实设备
  • interop.Reference API 对于更复杂类型可能无法正常工作

下一步

首先,如果你尝试过了,请务必告诉我们你的想法!如果你发现任何问题,请在 V8 iOS 存储库 中报告,并且不要忘记提及你正在使用 V8 alpha 版本。由于日志记录尚未启用,你需要附加问题的样本重现,以便我们调试它。

我们计划在年底之前发布一个 BETA 版本和更稳定的版本。你的反馈对于及时解决最重要的问题和相应地确定发布范围至关重要。