Сократите JavaScript с помощью компилятора Google Closure и Gradle

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

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

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

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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 019
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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.

Вы все еще используете это решение сегодня? Есть обновления?

xtian 29.07.2019 16:24

Вы проверили и отклонили плагин eriwen? github.com/eriwen/gradle-js-plugin

xtian 29.07.2019 16:27

@Nate Vaughan, чтобы этот пример работал, как называется плагин, который вы использовали в своем скрипте Gradle.

Sunil 24.12.2019 11:37

Другие вопросы по теме