2016-12-14 61 views
0

我的web項目中有超過2000個JS文件需要格式化。我知道Google的閉包編譯器擅長這樣做,實際上我正在使用它來爲整個JS文件的格式編寫一個工具。我的要求是格式化的JS文件將在同一個地方替換原來的文件。任何用於格式化JavaScript文件的高性能Java API?

我寫了一個Java程序來查找每一個JS文件中的web項目,當發現某文件,一個線程將負責執行命令

java -jar compiler.jar --js C:/project/xyz/abc.js --js_output_file C:/project/xyz/abc.js` 

和原來的JS文件(ABC .js)將被格式化。

但我發現這種方式不是那麼高效。事情是我使用ExecutorService來運行線程,每個線程花費大約10秒來爲文件進行格式化。所以你可以想象完成超過2000個文件需要多長時間。

下面是代碼片段。

ExecutorService executor = Executors.newFixedThreadPool(10); 
// ... 
for(File jsFile : root.listFiles()) { 
    Runnable formatThread = new FormatThread(jsFilePath.getAbsolutePath()); 
    //execute command "java -jar compiler.jar in run(), handled by ProcessBuilder 
    executor.execute(formatThread); 
} 

我曾嘗試增加線程池大小,但CPU和內存很快在程序啓動後消耗很高。

我的問題是

  1. 什麼是格式化等一大批由Java編寫的應用程序文件的有效方法?
  2. ExecutorService在我的程序中的用法是否正確,適合我的用例?
  3. 任何其他Java API可以快速格式化Javascript文件?其實我需要的只是刪除空行和用戶評論,但不需要壓縮文件。
+0

你真的不應該合併多個不相關的問題 – byxor

+0

'其實我需要的是簡單地刪除空行和用戶comments'聽起來並不像代碼格式化了良好的條件。 – Azodious

+0

我正在研究一個名爲'crem'的項目,它可以讓您從源代碼中刪除評論。到目前爲止,Java是唯一支持的語言,但我還沒有發佈,並且不想在這裏做廣告。你可以在github上找到它。 – byxor

回答

1

通過命令行啓動所有這些任務會產生巨大的開銷,因爲它還需要啓動新的jvm。

您可以運行雖然從JAR清單形式的Java代碼的主類(據我所知com.google.javascript.jscomp.CommandLineRunner)的main方法:

for(File jsFile : root.listFiles()) { 
    Runnable formatThread =() -> com.google.javascript.jscomp.CommandLineRunner.main(new String[] {"--js", jsFilePath.getAbsolutePath(), "--js_output_file", jsFilePath.getAbsolutePath()})); 
    executor.execute(formatThread); 
} 

甚至有可能是調用API的一個更有效的方法...

編輯:

的API以不同的方式更好地調用。例如

CompilerOptions options = new CompilerOptions(); 
CompilationLevel.ADVANCED_OPTIMIZATIONS.setOptionsForCompilationLevel(options); 
options.setCheckGlobalThisLevel(CheckLevel.OFF); 
options.setOutputCharset("utf-8"); 
com.google.javascript.jscomp.Compiler compiler = new com.google.javascript.jscomp.Compiler(System.err); 
compiler.disableThreads(); 
compiler.compile(SourceFile.fromFile(externsFile), 
     SourceFile.fromFile(jsFile), 
     options); 
String result = compiler.toSource(); 
// TODO: write result to file