# 由 V8 提供支持的新 iOS 运行时
# 什么是 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 Inspector 和 Chrome DevTools
- 没有 armv7 架构
- 没有记录
- 缺乏错误处理
- HMR 仅适用于真实设备
- interop.Reference API 可能不适用于更复杂的类型
# 下一步
首先,如果您尝试一下-请务必让我们知道您的想法!如果发现任何问题,请在 V8 iOS 存储库中报告这些问题,并且不要忘记提及您正在使用 V8 alpha。由于仍未启用日志记录,因此您将需要附加问题的样本示例,以便我们对其进行调试。
我们希望在今年年底发布 BETA 和更稳定的版本。您的反馈对于及时解决最重要的问题以及相应地确定发行范围至关重要。