我试图将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,我也看不到任何错误。
可能是什么问题? 谢谢。
答案 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)或调用回调-行为相同。
我想念什么吗?
最好, 基督徒