2016-07-26 49 views
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。

回答

1

您必须泵Node.js的消息循环:

while(nodeJS.isRunning()) { 
    nodeJS.handleMessage(); 
} 

一下添加到你的代码的底部,它应该工作。另外,我注意到你有onSuccess(c),我认为c应该是pageContent