如何使用 GraalVM 创建 node.js 本机映像
How to create a node.js Native Image with 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 应用程序创建通常的原生图像?
没有。目前,截至 2018 年 12 月,无法为 node.js 应用程序创建 GraalVM 本机映像。本机图像实用程序采用 Java 字节码并提前编译它。 GraalVM Java脚本引擎是一个 Java 程序,可以编译为本机映像。这就是你执行$GRAALVM_HOME/bin/js
时实际运行的内容。它仍然会在 运行 时间加载 Java 脚本,对其进行解释并及时将其编译为机器代码。
GraalVM 的节点实现是一个普通的 node
,一个原生应用程序,JavaScript 引擎被 GraalVM 的引擎所取代。
GraalVM 团队正在试验可能的方法来保存 JavaScript 程序的预编译部分,可能是标准库,也可能是您的应用程序的一部分,但是何时可以使用以及以何种形式保存尚不清楚.
AFAICT GraalVM 中的 JS 支持有两个方面:“vanilla”JS 支持和 nodejs 支持。
Oleg 在这里的回答 清楚地解释了为什么无法为 nodejs 应用构建本机图像。
然而,似乎可以构建 运行s“vanilla”JS 的本机图像:
https://www.graalvm.org/examples/native-image-examples/#polyglot-capabilities
You can also experiment with a more sophisticated ExtListDir
example, which takes advantage of GraalVM’s Java and JavaScript polyglot capabilities.
该示例的代码位于:
https://github.com/graalvm/graalvm-demos/blob/master/native-list-dir/ExtListDir.java
在这种情况下,JS 应用程序有一个 Java 'wrapper'。我相信这是一个必要的部分 - 换句话说,GraalVM 不会“将 JavaScript 编译为本机”,而是编译一个 Java 应用程序,其中包括一个 Javascript 引擎,在 Java.
也许这就是 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 包装器代码,您可以将所有这些编译成原生图像。
我正在尝试从一个简单的 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 Java脚本引擎是一个 Java 程序,可以编译为本机映像。这就是你执行$GRAALVM_HOME/bin/js
时实际运行的内容。它仍然会在 运行 时间加载 Java 脚本,对其进行解释并及时将其编译为机器代码。
GraalVM 的节点实现是一个普通的 node
,一个原生应用程序,JavaScript 引擎被 GraalVM 的引擎所取代。
GraalVM 团队正在试验可能的方法来保存 JavaScript 程序的预编译部分,可能是标准库,也可能是您的应用程序的一部分,但是何时可以使用以及以何种形式保存尚不清楚.
AFAICT GraalVM 中的 JS 支持有两个方面:“vanilla”JS 支持和 nodejs 支持。
Oleg 在这里的回答
然而,似乎可以构建 运行s“vanilla”JS 的本机图像:
https://www.graalvm.org/examples/native-image-examples/#polyglot-capabilities
You can also experiment with a more sophisticated
ExtListDir
example, which takes advantage of GraalVM’s Java and JavaScript polyglot capabilities.
该示例的代码位于:
https://github.com/graalvm/graalvm-demos/blob/master/native-list-dir/ExtListDir.java
在这种情况下,JS 应用程序有一个 Java 'wrapper'。我相信这是一个必要的部分 - 换句话说,GraalVM 不会“将 JavaScript 编译为本机”,而是编译一个 Java 应用程序,其中包括一个 Javascript 引擎,在 Java.
也许这就是 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 包装器代码,您可以将所有这些编译成原生图像。