Как создать собственный образ 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 ответа

Решение

Нет. В настоящее время, по состоянию на декабрь 2018 года, создание собственных образов GraalVM для приложений node.js невозможно. Утилита родного изображения берет Java-байт-код и компилирует его заранее. Движок GraalVM JavaScript является Java-программой и может быть скомпилирован как собственный образ. Это то, что вы на самом деле запускаете, когда выполняете $GRAALVM_HOME/bin/js, Он по-прежнему загружает JavaScript во время выполнения, интерпретирует и точно компилирует его в машинный код.

Реализация узла GraalVM является нормальной node, нативное приложение, с движком JavaScript, замененным на GraalVM.

Команда GraalVM экспериментирует с возможными способами сохранения предварительно скомпилированных частей программ JavaScript, возможно, стандартной библиотеки или частей вашего приложения, но когда это может стать доступным и в какой форме неясно.

AFAICT есть две стороны поддержки JS в GraalVM: «ванильная» поддержка JS и поддержка nodejs.

Ответ Олега здесь /questions/4196401/kak-sozdat-sobstvennyij-obraz-nodejs-s-pomoschyu-graalvm/4196406#4196406 четко объясняет, почему создание собственного образа для приложения nodejs невозможно.

Однако похоже, что можно создать собственный образ, который запускает "ванильный" 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, которое включает движок Javascript, реализованный на Java.

Возможно, это то, что Олег имел в виду, говоря : «Команда GraalVM экспериментирует с возможными способами сохранения предварительно скомпилированных частей программ JavaScript», то есть иметь некоторый стандартный шаблон Java для запуска приложений JS, чтобы вы могли напрямую скомпилировать чистое приложение JS в собственный образ. Я предполагаю, что это будет что-то вроде Node или Deno, но реализовано на Java.

Другая сторона проблемы - если вы хотите использовать функции NodeJS или включить код из модулей npm в свое приложение JS.

GraalVM заявляет, что движок Javascript реализует ES11, в основном все современные JS: https://www.graalvm.org/reference-manual/js/JavaScriptCompatibility/

Похоже, что можно было бы использовать инструменты JS, такие как http://browserify.org/, для преобразования JS-кода nodejs в "ванильный" JS, который мог бы запускаться JS-движком Graal.

Затем с помощью соответствующего кода оболочки Java вы можете скомпилировать все это в собственный образ.

Другие вопросы по тегам