Сократите JavaScript с помощью Google Closure Compiler и Gradle - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть небольшое веб-приложение на Java, созданное с помощью Gradle, которое включает в себя некоторый пользовательский JavaScript.Я хотел бы минимизировать пользовательский код JS с помощью Google Closure Compiler.

Вся документация для Closure Compiler, кажется, посвящена использованию CLI или JSON API для минимизации JS.Я бы предпочел вызывать API Java напрямую из Gradle, например, в задаче копирования.

Я бы хотел избежать

  • Узловые решения
  • Вызовк CLI и с использованием java -jar
  • HTTP-вызовов к JSON API

Этот пример устарел и не отражает самые последниеJava API. Этому вопросу уже несколько лет, хотя большинство вызовов API похоже на текущий Java API.

Кто-нибудь еще сократил JavaScript из Gradle с помощью Java API Google Closure Compiler напрямую?

1 Ответ

0 голосов
/ 19 ноября 2018

У меня есть рабочее решение:

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 упаковывает и встраивает эти ресурсы в полученный файл.

Надеюсь, что это поможет кому-то еще, используя Google Closure Compiler и Gradle.

...