在Graal中使用RequireJS

时间:2018-08-29 11:29:17

标签: requirejs graalvm

我试图将requireJS与GraalVM(Polyglot API)结合使用,以在来宾语言脚本中加载外部JS代码。 我要解决的方法是先在上下文上运行requirejs:

    Context importCtx = Context.create();

    String libraryUrl = "file:/require.js";
    Source librarySource = Source.newBuilder("js", new URL(libraryUrl)).build();

    importCtx.eval(librarySource);

这导致需要将其添加到JS全局变量中,这使我可以在运行于同一上下文的以下JS脚本中使用它。然后,我只运行我的来宾脚本:

    String scriptUrl = "test.js";
    Source scriptSource = Source.newBuilder("js", new URL(scriptUrl)).build();

    importCtx.eval(scriptSource);

我的来宾脚本如下:

console.log("start of script");

require(['http://momentjs.com/downloads/moment.js'], function(mom) {
    console.log("inside require function");
    debugger;
    console.log(mom.now();
});

debugger;
console.log("end of script");

在浏览器中运行此脚本时,它可以正常工作,并输出moment.now()的值。但是,当使用Polyglot API运行它时,JS会运行,正确设置了require,但是从未调用function(mom){}。基本上,我从来没有看到“内部需求函数”消息和moment.now()的值。

我有这种感觉,因为加载外部资源时发生错误(我也曾尝试加载文件而不是远程URL,但是没有运气)。但是,即使启用了inspect选项运行chrome devtools,我也看不到任何错误。

可能是什么问题? 谢谢。

1 个答案:

答案 0 :(得分:0)

我尝试了您的示例,并注意到调用 byte[] byteArray = File.ReadAllBytes(tempFolderLocation + "\\" + fileName); using (MemoryStream stream = new MemoryStream()) { stream.Write(byteArray, 0, (int)byteArray.Length); WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true); File.WriteAllBytes(fileLocation + Filename + ".docx", stream.ToArray()); } wordDocument = OpenWordDocument(fileLocation + Filename + ".docx"); 返回一个函数:

require()

当我只使用您的JavaScript代码,使用function localRequire(deps, callback, errback) { ... 然后调用load("require.js")时,也会遇到这种现象-在Rhino(1.7.7.2)和Nashorn(1.8.0_172)上尝试过。他们似乎没有加载URL(moment.js)或调用回调-行为相同。

我想念什么吗?

最好, 基督徒