Как интегрировать JavaScript инструменты для сжатия CSS в Java приложение через GraalVM?
Я использую GraalVM для выполнения npm модулей из Java кода. Мне нужно подключить что-то вроде PurgeCSS для уменьшения размера CSS файлов в Spring приложении. Идея в том, чтобы контроллер вызывал PurgeCSS, который бы кешировал CSS файл и потом отдавал кешированную версию.
Похоже, что GraalVM Polyglot поддерживает два типа JavaScript: Node версию (доступна только через командную строку) и ECMAScript версию (доступна только программно). И кажется, что они не могут взаимодействовать друг с другом.
Что я пробовал:
Использовал npm install purgecss
через GraalVM, это сработало хорошо, но следующий код не работает:
@Service
public class CssProcessor {
String script = "var PurgeCSS = require('purgecss')\n" +
"const processor = new PurgeCSS({\n" +
" content: ['**/*.html'],\n" +
" css: ['**/*.css']\n" +
"})\n" +
"const result = processor.purge()";
public void processCss() {
try (Context ctx = Context.create()) {
Value func = ctx.eval("js", this.script);
assert func.canExecute();
String output = func.execute().asString();
System.out.println(output);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Проблема в том, что require
это node-специфичная функция, поэтому она не работает. К сожалению, вся библиотека PurgeCSS полна require
вызовов.
Вопросы:
- Нужно ли искать single-file
.mjs
CSS библиотеку (ESM версию)? - Есть ли способ указать node вариант JavaScript, чтобы включить
require
? - Можно ли заменить все
require
наload
?
Буду благодарен за любую помощь с настройкой JavaScript функциональности GraalVM для этого случая.
PS: Запускаю Spring через Gradle. Раньше думал о подключении Spring к Gulp через Gradle Wrapper и выполнении CSS задач через Gulp. Хостинг на Heroku, где можно использовать несколько buildpack (Java и Node).