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。