如何使用GraalVM创建Node.js本机映像

时间:2018-12-12 00:57:28

标签: javascript node.js graalvm

我正在尝试通过简单的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应用程序创建本机映像吗?

2 个答案:

答案 0 :(得分:5)

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

GraalVM的节点实现是普通的node,这是一个本机应用程序,其中的JavaScript引擎已由GraalVM的Java引擎代替。

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

答案 1 :(得分:0)

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

Oleg 在这里的回答 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 程序的预编译部分” 即有一些标准的 Java 样板来运行 JS 应用程序,所以你可以直接将纯 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 包装器代码,您可以将所有这些编译成本机映像。