【问题标题】:Node native add-on, dependent on V8Node 原生插件,依赖 V8
【发布时间】:2019-03-21 22:38:57
【问题描述】:

我正处于应用程序的早期设计阶段,并试图对期望和要求进行推理,以确保我不会花费大量时间陷入死胡同。我从未使用过 V8 或节点原生插件,所以请耐心等待。

假设我正在构建一个 Electron 应用程序。出于性能原因,某些功能将在独立库中以本机代码编写,该库将从本机 Node 插件调用。本机库需要执行 JavaScript。所以:

Electron App -> 原生插件 -> 原生库 -> V8

首先,这可行吗?例如,尝试构建/运行 V8 上下文是否会由于其在 Electron V8 上下文中执行而失败?我在考虑死锁、中止等。

【问题讨论】:

  • 不管怎样,V8 的速度惊人地快。如果您始终使用 Javascript,您可能不会失去太多性能。甚至用于信号处理。当您构建这个多语言解决方案时,新版本的 V8 的性能可能会超过您的解决方案。这是来自痛苦的经验,因为今天的软件/硬件太慢了,所以做昂贵的高度优化的解决方案。明天可能不会。
  • 假设这是一个选项,我似乎找不到任何方法来满足从 npm/electron 运行外部任意 JavaScript 的要求。我将要处理的文件包含嵌入式 JS,我需要能够执行它们。
  • 我不确定我是否正确理解了 q - 你是说你想运行一些用本机编写的代码并在 v8 隔离之间传递值,还是想设置另一个 v8 隔离并运行 javascript代码在那里?
  • 应用程序将处理包含 JavaScript 的文件,并正确处理在沙盒到该文件的上下文中执行 JS 所需的文件。例如,考虑包含嵌入式 JavaScript 的 PDF 文件。在示例中,本机库将是包含 V8 依赖项的 PDF 库(ala Pdfium)。它将由本机插件加载并从电子执行,电子本身在 V8 中运行。
  • +1 给 O.Jones。您的计划在技术上听起来可行,但相当复杂。请注意,跨语言函数调用比较繁重。拥有两个 V8 副本似乎也很奇怪。也许您可以重构流程,使本机库成为一个“端点”,其函数将控制权返回到其环境以执行任何所需的 JavaScript?

标签: node.js npm electron v8


【解决方案1】:

我已经提出了从 cmets 到主要问题的行动计划。不幸的是,这使得很难相信任何特定的用户或评论的答案。具体来说:

  • 重组数据流。允许 Native Add-on 使用其 V8 副本来执行任何必要的 JavaScript,而不是将其作为对 Native Library 的依赖项。 (comment)
  • 支持在另一个 V8 隔离中输入单独的 V8 隔离。 (comment) (docs)

原生库组件的构思是因为要支持的文档类型很大(文件大小)并且需要 JavaScript 处理和昂贵的渲染。最初我认为这是一个支持文档类型的大型单体库,但实际上它可以(并且可能应该)被分解。

  • 解析二进制文件。由于 V8 的速度,这可能可以在我的 Node.js 应用程序本身中完成,并且可能比跨语言障碍封送数据更快。如果没有,我可能会考虑使用 N-API Native Add-on 来解析文档并返回一个表示解析数据的 JS 对象。 (comment)
  • 执行文档级 JavaScript。这应该可以通过输入单独的 V8 隔离在 Native Add-on 中实现。 (见上文。)
  • 将文档渲染到画布/位图。这是一个未知数,因为它取决于由复杂路径等组成的绘制性能。我可能会首先尝试直接在 Node.js 应用程序中执行此操作,如果性能不够,我会考虑类似 N -API 原生附加组件,例如Skia 作为渲染数据的依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2015-03-26
    • 1970-01-01
    • 2019-04-29
    • 2019-02-21
    相关资源
    最近更新 更多