gpt4 book ai didi

java - 有没有高性能的 Java API 来格式化 JavaScript 文件?

转载 作者:行者123 更新时间:2023-12-01 09:07:32 25 4
gpt4 key购买 nike

我的Web项目中有超过2000个JS文件需要格式化。我知道 Google 闭包编译器很擅长这样做,实际上我正在使用它来编写一个用于整个 JS 文件格式化的工具。我的要求是格式化后的JS文件会在同一个地方替换原来的JS文件。

我写了一个Java程序来查找Web项目中的每个JS文件,当找到文件时,就会有一个线程负责执行命令

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 文件吗?实际上我需要的只是删除空行和用户注释,但不需要压缩文件。

最佳答案

通过命令行启动所有这些任务会产生巨大的开销,因为它还需要启动一个新的 jvm。

您可以从 java 代码的 jar list 中运行主类的 main 方法(afaik com.google.javascript.jscomp.CommandLineRunner):

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

关于java - 有没有高性能的 Java API 来格式化 JavaScript 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41143064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com