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

Javascript 如何使用GraalVM创建node.js本机映像,javascript,node.js,graalvm,Javascript,Node.js,Graalvm,我正在尝试从一个简单的node.jsexample.js应用程序创建一个本机映像 使用以下命令运行应用程序时: node --native -i --native example.js 然后,应用程序启动并按预期工作 现在我想创建一个本地映像。我尝试了以下命令: native-image --language:js example.js 但是,由于以下错误,它无法工作: Build on Server(pid: 77626, port: 64052) [example.js:77626]

我正在尝试从一个简单的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应用程序创建本机映像的方法?

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

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


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

AFAICT在GraalVM中,JS支持有两个方面:“香草”JS支持和nodejs支持

Oleg在这里的回答清楚地解释了为什么不可能为nodejs应用程序构建本机映像

但是,似乎可以构建运行“香草”JS的本机映像:

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

该示例的代码位于:

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

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

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

GraalVM指出Javascript引擎实现ES11,基本上是所有现代JS:

似乎可以使用JS工具将nodejs代码转换为“普通”JS,由Graal的JS引擎运行


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

如果很快会包括这些,是否有时间表?