2016-12-14 16 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