2016-07-26 130 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