#javascript #google-chrome #chromium #graalvm
Вопрос:
Следующий код выполняет фрагмент кода javascript на движке GraalVM Javascript:
try (Context context = Context.newBuilder("js").option("inspect", "4444").build()) {
Value hello = context.eval(Source.newBuilder("js", "some minified javascript", "sample.js").build());
// E.g.: Sleep a bit so I can open the debugger in chrome and start debugging
} catch (IOException e) {
e.printStackTrace();
}
Как я могу прикрепить исходную карту к этому уменьшенному javascript?
Я попытался добавить следующее в конец уменьшенного javascript, но порт 8080 даже не был пропингован:
//# sourceMappingUrl=http://localhost:8080/sample.map
Кроме того, если я щелкну правой кнопкой мыши в окне разработчика и выберу Добавить исходную карту…, введенный мной URL-адрес не будет загружен (я проверил это, реализовав пример сервлета на этом порту, который регистрирует каждый сетевой запрос).
Пожалуйста, обратите внимание, что я открываю отладчик так, как сценарий запускается в JVM, и подключаюсь к нему, введя URL-адрес в chrome следующим образом:
devtools://devtools/bundled/js_app.html?ws=127.0.0.1:4444/xxxxxxxxxxxxxx
Ответ №1:
Я думаю, что это должно работать как обычно.
Насколько я знаю, в настоящее время нет способа указать исходные карты через API.
Однако //#sourceMappingUrl=
комментарий работает (обратите внимание, что в вашем комментарии отсутствует Url
часть).
Вот пример примера файла машинописного текста:
declare var myClass: any;
interface Pointlike {
x: number;
y: number;
}
interface Named {
name: string;
}
function logPoint(point: Pointlike) {
console.log("x = " point.x ", y = " point.y);
}
function logName(x: Named) {
console.log("Hello, " x.name);
}
const obj = {
x: 0,
y: 0,
name: "Origin",
};
logPoint(obj);
logName(obj);
console.log("0: " myClass.id);
console.log("1: " myClass.text);
console.log("2: " myClass.arr[1]);
console.log("3: " myClass.ret42());
console.log("Done");
и tsconfig.json:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"outDir": "out",
"sourceMap": true,
"rootDir": "."
},
"exclude": [
"node_modules",
"resources"
]
}
и файл java Main.java
:
import org.graalvm.polyglot.*;
import java.io.*;
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) throws Exception {
File file = new File("out/logpoints.js");
String language = Source.findLanguage(file);
Source source = Source.newBuilder(language, file)
.build();
try (Context context = Context.newBuilder("js")
.allowAllAccess(true)
.option("inspect", "4444")
.build()) {
context.getBindings("js")
.putMember("myClass", new MyClass());
Value hello = context.eval(source);
}
}
public static class MyClass {
public int id = 42;
public String text = "42";
public int[] arr = new int[]{1, 42, 3};
public Callable<Integer> ret42 = () -> 42;
}
}
Скомпилируйте файл ts, в главном директории запустите tsc
без аргументов:
tsc
Откройте out/logpoints.js
и измените sourceMappingURL, чтобы он указывал на http вместо относительного пути в локальной сети, созданного компилятором ts:
//# sourceMappingURL=http://localhost:8000/out/logpoints.js.map
В главном директоре запустите сервер python:
> python -m SimpleHTTPServer 8000
Serving HTTP on 0.0.0.0 port 8000 ...
Запустите файл java:
$ javac Main
java Main
Debugger listening on ws://127.0.0.1:4444/Nh_8EndzB0jCaOfA1giEpld5C1ilx5OeyWbmA3zFDEc
For help, see: https://www.graalvm.org/docs/tools/chrome-debugger
E.g. in Chrome open: devtools://devtools/bundled/js_app.html?ws=127.0.0.1:4444/Nh_8EndzB0jCaOfA1giEpld5C1ilx5OeyWbmA3zFDEc
Откройте devtools
URL-адрес в Chrome. Он должен открыть файл js и файл машинописного текста, полученные с помощью сопоставления источников. А точки останова и пошаговое выполнение работают над файлом машинописного текста.
Вы даже можете передавать объекты Java через привязки и проверять их как в консоли, так и на вкладке «Локальный» в отладчике:
Комментарии:
1. В моем исходном коде это sourceMappingURL. Это была моя проблема с копипастом. Позвольте мне проверить ваш ответ на самом деле. Однако на скриншоте я вижу скомпилированный файл javascript, а не исходный файл машинописи, который должен отображаться, если исходная карта разрешена. Кроме того, мне интересно, как файловая система отображается с левой стороны. Это chrome, открытый по ссылке, такой как devtools://… ?
2. Я сделал вопрос чище, как я открываю панель инструментов разработчика. Если есть другая возможность открыть его по ссылке и в том, как работают исходные карты, я был бы искренне признателен за получение информации об этом.
3. Да, отладчик работает с файлом машинописного текста. Я добавил несколько скриншотов к ответу. 1 показывает отладчик в файле ts, а другой показывает, что http-url тоже работает.
4. Да, файловая система, показанная там, потому что я добавил папку в рабочую область, используя ссылку добавить папку в рабочую область над представлением файловой системы. Он работает и без него, файл js и разрешенный файл ts работают.
5. Вы уверены, что не отлаживаете файл js просто так, как он был открыт непосредственно в браузере? Целью GraalVM для запуска файлов js является выполнение внутренней логики. Например: Вызов функций java из javascript/typescript. Например: Введите переменную с помощью контекстных привязок GraalVM. Доступна ли эта переменная во время отладки? Если он доступен, мне очень жаль, и мне действительно нужна информация о том, как вы подключились к контексту graalvm для отладки.