使用Google Closure编译器和Gradle缩小JavaScript

时间:2018-11-16 14:56:42

标签: javascript java gradle google-closure-compiler

我有一个用Gradle构建的小型Java Web应用程序,其中包含一些自定义的原始JavaScript。我想使用Google Closure Compiler缩小自定义JS代码。

Closure Compiler的所有文档似乎都是使用CLI或JSON API来缩小JS。我更喜欢直接从Gradle中调用Java API,例如复制任务。

我想避免

  • 节点解决方案
  • 调出CLI并使用java -jar
  • 对JSON API的HTTP调用

This example已过期,不能反映最新的Java API。 This question已有数年历史,尽管大多数API调用似乎都与当前的Java API类似。

是否还有其他人直接使用Google Closure Compiler Java API从Gradle中缩小了JavaScript?

1 个答案:

答案 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帮助其他人。