猿问

如何使用 GraalVM 从 Java 访问 JS 导出的模块对象?

我有一些 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");


但这总是返回 null。


交互式爱情
浏览 226回答 2
2回答

森林海

从一个模块导出的值可以由另一个模块使用该import语法导入。例如,您可以让另一个文件加载您的模块,例如:// -- some-module-file.mjsimport 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};

holdtom

以下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对象的方式有问题。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答