Как я могу получить доступ к JS -экспортированному объекту модуля из Java, используя GraalVM? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть JS код, который выглядит примерно так:

let ssr = async (arg) => arg || "hello js";
export {ssr as default};

Я хочу получить доступ и позвонить ssr с Java.

Как я могу это сделать ?

Я пробовал что-то вроде этого:

var ctx = Context.newBuilder("js")
                .allowIO(true)
                .allowHostAccess(HostAccess.ALL)
                .build();

        var ssrResource = new String(Server.class.getResourceAsStream("/ssr.mjs").readAllBytes());

        ctx.eval(Source
                .newBuilder("js", ssrResource, "ssr.mjs")
                .build());
        var ssr = ctx.getBindings("js").getMember("ssr");

Но это всегда возвращает ноль.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Значения, экспортируемые из модуля, могут быть импортированы другим модулем с использованием синтаксиса import. Например, у вас может быть другой файл, загружающий ваш модуль, например:

// -- some-module-file.mjs
import ssr from 'ssr.mjs'
ssr;

, а затем выполните файл с помощью:

File file = loadSomehow("some-module-file.mjs");
Source mainSource = Source.newBuilder("js", file).mimeType("application/javascript+module").build();
Value ssr = context.eval(mainSource);

Здесь Value ssr - это значение, экспортируемое вашим модуль с export {ssr as default};

1 голос
/ 22 апреля 2020

Следующий java код

import org.graalvm.polyglot.*;

class Main {
    public static void main(String[] args) {
        var ctx = Context.newBuilder("js").allowAllAccess(true).build();
        ctx.eval("js", "let ssr = async (arg) => arg || \"hello js\"");
        var v = ctx.getBindings("js").getMember("ssr");
        System.out.println(v.execute());
    }
}

выводит

Promise{[[PromiseStatus]]: "resolved", [[PromiseValue]]: "hello js"}

На GraalVM CE 20.0.0, поэтому я предполагаю, что что-то не так с тем, как вы строите Source объект.

...