【问题标题】:How to create a node.js Native Image with GraalVM如何使用 GraalVM 创建 node.js 原生镜像
【发布时间】:2018-12-12 00:57:27
【问题描述】:

我正在尝试从一个简单的 node.js example.js 应用程序创建本机图像。

当运行应用程序时:

 node --native -i --native example.js

然后应用程序正在启动并按预期工作。

现在我想创建一个原生图像。我尝试了以下命令:

 native-image --language:js example.js

但是由于错误,它不起作用:

Build on Server(pid: 77626, port: 64052)
[example.js:77626]    classlist:   3,964.04 ms
error: Main entry point class 'example.js' not found.
Error: Processing image build request failed

作为解决方案,我在example.js 中创建了一个主入口点,例如:

function main(args) {
  console.log("Main app started")
}

但是这不起作用。

有没有办法通常为 js/node.js 应用程序创建原生图像?

【问题讨论】:

    标签: javascript node.js graalvm


    【解决方案1】:

    没有。目前,截至 2018 年 12 月,无法为 node.js 应用程序创建 GraalVM 原生镜像。本机映像实用程序采用 Java 字节码并提前对其进行编译。 GraalVM JavaScript 引擎是一个 Java 程序,可以编译为原生镜像。这是您在执行$GRAALVM_HOME/bin/js 时实际运行的内容。它仍然在运行时加载 JavaScript,对其进行解释并将其即时编译为机器代码。

    GraalVM 的节点实现是一个普通的node,一个本机应用程序,其中 JavaScript 引擎被 GraalVM 的引擎取代。

    GraalVM 团队正在尝试一些可能的方法来保存 JavaScript 程序的预编译部分,可能是标准库,或应用程序的一部分,但何时可用以及以何种形式尚不清楚。

    【讨论】:

    • 如果这将很快被包括在内,是否有任何时间表?
    【解决方案2】:

    AFAICT GraalVM 中的 JS 支持有两个方面:“vanilla” JS 支持和 nodejs 支持。

    Oleg's answer here https://stackoverflow.com/a/53749052/202168 清楚地解释了为什么无法为 nodejs 应用构建本机映像。

    但似乎可以构建一个运行“vanilla”JS 的本机映像:
    https://www.graalvm.org/examples/native-image-examples/#polyglot-capabilities

    您还可以尝试更复杂的 ExtListDir 示例,它利用了 GraalVM 的 Java 和 JavaScript 多语言功能。

    该示例的代码位于:
    https://github.com/graalvm/graalvm-demos/blob/master/native-list-dir/ExtListDir.java

    在这种情况下,JS 应用程序有一个 Java“包装器”。我相信这是一个必要的部分——换句话说,GraalVM 不会“将 JavaScript 编译为本机”,而是编译一个 Java 应用程序,其中包括一个用 Java 实现的 Javascript 引擎。

    也许这就是 Oleg 所说的 “GraalVM 团队正在试验保存 JavaScript 程序的预编译部分的可能方法”,即拥有一些用于运行 JS 应用程序的标准 Java 样板,这样你就可以直接将纯 JS 应用程序编译为原生图像。我想这实际上类似于 Node 或 Deno,但用 Java 实现。

    问题的另一面是如果您想使用 NodeJS 功能或在您的 JS 应用程序中包含来自 npm 模块的代码。

    GraalVM 声明 Javascript 引擎实现了 ES11,基本上都是现代 JS: https://www.graalvm.org/reference-manual/js/JavaScriptCompatibility/

    似乎可以使用http://browserify.org/ 之类的 JS 工具将 nodejs JS 代码转换为可以由 Graal 的 JS 引擎运行的“vanilla” JS。

    然后使用适当的 Java 包装器代码,您可以将所有这些编译成本机映像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 2020-09-09
      • 2021-02-03
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2019-08-20
      相关资源
      最近更新 更多