为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

交互式爱情 2022-07-08 16:57:03
我有一些 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。
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

从一个模块导出的值可以由另一个模块使用该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};


查看完整回答
反对 回复 2022-07-08
?
holdtom

TA贡献1805条经验 获得超10个赞

以下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对象的方式有问题。


查看完整回答
反对 回复 2022-07-08
  • 2 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号