2
我试图通过J2V8在Java项目中使用inline-css NPM包,将样式表内联到样式属性中。在J2V8中使用承诺
final NodeJS nodeJS = NodeJS.createNodeJS();
final V8Object inlineCss = nodeJS.require(new File(
"path/to/node_modules/inline-css/index.js"
));
final V8 jsRuntime = nodeJS.getRuntime();
final Map<String, Object> inlineOptions = new HashMap<>();
inlineOptions.put("applyLinkTags", false);
inlineOptions.put("removeStyleTags", false);
inlineOptions.put("url", "http://example.com");
jsRuntime.add("inlineCss", inlineCss);
jsRuntime.add("inlineOptions", V8ObjectUtils.toV8Object(jsRuntime, inlineOptions));
try (FileInputStream inputStream = new FileInputStream(pageFile)) {
byte[] data = new byte[(int) pageFile.length()];
inputStream.read(data);
String pageContent = new String(data, "UTF-8");
JavaVoidCallback successCallback = new JavaVoidCallback() {
@Override
public void invoke(V8Object v8Object, V8Array v8Array) {
//...
}
};
JavaVoidCallback errorCallback = new JavaVoidCallback() {
@Override
public void invoke(V8Object v8Object, V8Array v8Array) {
//...
}
};
jsRuntime.add("pageContent", pageContent);
jsRuntime.registerJavaMethod(successCallback, "onSuccess");
jsRuntime.registerJavaMethod(errorCallback, "onError");
jsRuntime.executeObjectScript("inlineCss(pageContent, inlineOptions).then(onSuccess).catch(onError)");
} catch (IOException | V8ScriptExecutionException | V8ScriptCompilationException e) {
//...
}
但是,成功和错误回调都不会被调用,也不会引发错误。我无法找到J2V8的任何适当文档,所提供的示例在这里并不真正有用。有没有人使用过J2V8来处理JavaScript的承诺?或者有人看到一个错误?另外,如果你知道一个好的Java库来内联CSS,那也是有帮助的。当你有多个类和元素上的id时,到目前为止我遇到的那些实际上并不可靠。 CSSBox看起来像一个有前途的解决方案,但它似乎并没有妥善处理供应商前缀规则。
另一种方法是使用CLI脚本,但这对我来说是最后一招,因为这意味着我还需要在我的Java应用程序旁边部署NodeJS。