Сокращение ресурсов JS и CSS с Maven
1. обзор
В этой статье показано, как минимизировать ресурсы Javascript и CSS в качестве шага сборки и обслуживать полученные файлы с помощью Spring MVC.
Мы будем использоватьYUI Compressor в качестве базовой библиотеки минификации иYUI Compressor Maven plugin, чтобы интегрировать его в наш процесс сборки.
2. Конфигурация плагина Maven
Во-первых, нам нужно объявить, что мы будем использовать плагин компрессора в нашем файлеpom.xml и выполнить цельcompress. Это сжимает все файлы.js и.css вsrc/main/webapp, так чтоfoo.js будет минимизирован какfoo-min.js, аmyCss.css будет минимизирован какmyCss-min.css:
net.alchim31.maven
yuicompressor-maven-plugin
1.5.1
compress
Нашsrc/main/webapp directory содержит следующие файлы:
js/
├── foo.js
├── jquery-1.11.1.min.js
resources/
└── myCss.css
После выполненияmvn clean package сгенерированный файл WAR будет содержать следующие файлы:
js/
├── foo.js
├── foo-min.js
├── jquery-1.11.1.min.js
├── jquery-1.11.1.min-min.js
resources/
├── myCss.css
└── myCss-min.css
3. Сохранение одинаковых имен файлов
На этом этапе, когда мы выполняемmvn clean package, плагин создаетfoo-min.js иmyCss-min.css. Поскольку мы изначально использовалиfoo.js иmyCss.css при обращении к файлам, наша страница по-прежнему будет использовать исходные неминифицированные файлы, так как минифицированные файлы имеют другие имена, чем исходные.
Чтобы предотвратить использованиеfoo.js/foo-min.js иmyCss.css/myCss-min.css и минимизацию файлов без изменения их имен, нам необходимо настроить плагин с опциейnosuffix следующим образом:
net.alchim31.maven
yuicompressor-maven-plugin
1.5.1
compress
true
Теперь, когда мы выполняемmvn clean package, у нас будут следующие файлы в сгенерированном файле WAR:
js/
├── foo.js
├── jquery-1.11.1.min.js
resources/
└── myCss.css
4. Конфигурация плагина WAR
Сохранение имен файлов имеет побочный эффект. Это заставляет плагин WAR перезаписывать уменьшенные файлыfoo.js иmyCss.css исходными файлами, поэтому в окончательном выводе у нас не будет уменьшенных версий файлов. Файлfoo.js до минификации содержит следующие строки:
function testing() {
alert("Testing");
}
Когда мы исследуем содержимое файлаfoo.js в сгенерированном WAR-файле, мы видим, что он имеет исходное содержимое вместо минимизированного содержимого. Чтобы решить эту проблему, нам нужно указатьwebappDirectory для плагина компрессора и ссылаться на него из конфигурации плагина WAR.
net.alchim31.maven
yuicompressor-maven-plugin
1.5.1
compress
true
${project.build.directory}/min
maven-war-plugin
${project.build.directory}/min
Здесь мы указали каталогmin в качестве каталога вывода для минифицированных файлов и настроили плагин WAR, чтобы он включал его в окончательный вывод.
Теперь у нас есть миниатюрные файлы в сгенерированном WAR-файле с их исходными именамиfoo.js иmyCss.css.. Мы можем проверитьfoo.js, чтобы увидеть, что теперь он имеет следующий минимизированный контент:
function testing(){alert("Testing")};
5. Исключение уже минифицированных файлов
Сторонние библиотеки Javascript и CSS могут иметь уменьшенные версии, доступные для скачивания. Если вам случится использовать один из них в своем проекте, вам не нужно обрабатывать их снова.
Включение уже минимизированных файлов выдает предупреждающие сообщения при сборке проекта.
Например,jquery-1.11.1.min.js - это уже уменьшенный файл Javascript, и во время сборки он вызывает предупреждающие сообщения, подобные следующим:
[WARNING] .../src/main/webapp/js/jquery-1.11.1.min.js [-1:-1]:
Using 'eval' is not recommended. Moreover, using 'eval' reduces the level of compression!
execScript||function(b){a. ---> eval <--- .call(a,b);})
[WARNING] ...jquery-1.11.1.min.js:line -1:column -1:
Using 'eval' is not recommended. Moreover, using 'eval' reduces the level of compression!
execScript||function(b){a. ---> eval <--- .call(a,b);})
Чтобы исключить уже минифицированные файлы из процесса, настройте плагин компрессора с параметромexcludes следующим образом:
net.alchim31.maven
yuicompressor-maven-plugin
1.5.1
compress
true
${project.build.directory}/min
**/*.min.js
Это исключит все файлы во всех каталогах, имена которых заканчиваются наmin.js. При выполненииmvn clean package теперь не появляются предупреждающие сообщения, и сборка не пытается минимизировать уже уменьшенные файлы.
6. Заключение
В этой статье мы описали хороший способ интеграции минимизации файлов Javascript и CSS в рабочий процесс Maven. Чтобы использовать эти статические ресурсы в приложении Spring MVC, см. Нашу статьюServe Static Resources with Spring.
Вы можете найти код для этой статьи наGitHub.