Использование RequireJS с Graal - PullRequest
       6

Использование RequireJS с Graal

0 голосов
/ 29 августа 2018

Я пытаюсь использовать 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 (). Однако при запуске его из API Polyglot, JS запускается, require задан правильно, но функция (mom) {} никогда не вызывается. По сути, я никогда не вижу сообщения «inside require function» и значения moment.now ().

У меня такое ощущение, что это происходит из-за ошибки при загрузке внешнего ресурса (я также безуспешно пытался загрузить файл вместо удаленного URL-адреса). Однако я не вижу никаких ошибок, даже при запуске Chrome Devtools с включенной опцией проверки.

В чем может быть проблема? Спасибо.

1 Ответ

0 голосов
/ 31 августа 2018

Я попробовал ваш пример и заметил, что вызов require() возвращает функцию:

function localRequire(deps, callback, errback) { ...

Я также получаю такое поведение, когда просто беру ваш код JavaScript, использую load("require.js"), а затем вызываю require() - пробовал это на Rhino (1.7.7.2) и Nashorn (1.8.0_172). Похоже, они не загружают URL (moment.js) и не вызывают обратный вызов - идентичное поведение.

Я что-то упустил?

Лучший, Christian

...