我有一个用Gradle构建的小型Java Web应用程序,其中包含一些自定义的原始JavaScript。我想使用Google Closure Compiler缩小自定义JS代码。
Closure Compiler的所有文档似乎都是使用CLI或JSON API来缩小JS。我更喜欢直接从Gradle中调用Java API,例如复制任务。
我想避免
java -jar
This example已过期,不能反映最新的Java API。 This question已有数年历史,尽管大多数API调用似乎都与当前的Java API类似。
是否还有其他人直接使用Google Closure Compiler Java API从Gradle中缩小了JavaScript?
答案 0 :(得分:0)
我有一个可行的解决方案:
task processWebapp(type: Copy) {
from('src/main/webapp') {
include "**/*"
}
eachFile {
if (it.sourceName.endsWith('.js') && !it.sourceName.endsWith('.min.js')) {
it.exclude()
Reader reader = it.file.newReader()
String source = ""
try {
source = reader.readLines().join("\r\n")
} finally {
reader.close()
}
com.google.javascript.jscomp.Compiler compiler = new com.google.javascript.jscomp.Compiler(System.err)
CompilerOptions options = new CompilerOptions()
CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(
options)
SourceFile extern = SourceFile.fromCode("externs.js", "")
SourceFile input = SourceFile.fromCode(it.sourceName, source)
compiler.compile(extern, input, options)
String transpiled = compiler.toSource()
def directoryPath = it.relativePath - it.sourceName
File theDir = new File("build/resources/main/${directoryPath}")
if (!theDir.exists()) {
theDir.mkdirs()
}
PrintWriter writer = new PrintWriter("build/resources/main/${it.relativeSourcePath}", "UTF-8")
try {
writer.println(transpiled)
} finally {
writer.close()
}
}
}
destinationDir = file('build/resources/main')
}
此任务将所有内容从src/main/webapp
复制到build/resources/main
,同时在途中转储(最小化)所有以.js
结尾(但不以.min.js
结尾)的文件。然后Gradle将这些资源打包并将其嵌入到生成的jar中。
希望这可以使用Google Closure Compiler和Gradle帮助其他人。