Minificação de ativos JS e CSS com Maven
1. Visão geral
Este artigo mostra como reduzir os recursos Javascript e CSS como uma etapa de construção e servir os arquivos resultantes com o Spring MVC.
UsaremosYUI Compressor como a biblioteca de minificação subjacente eYUI Compressor Maven plugin para integrá-la em nosso processo de construção.
2. Configuração do Maven Plugin
Primeiro, precisamos declarar que usaremos o plugin compressor em nosso arquivopom.xmle executaremos a metacompress. Isso compactará todos os arquivos.jse.css emsrc/main/webapp de modo quefoo.js será reduzido comofoo-min.jsemyCss.css será reduzido comomyCss-min.css:
net.alchim31.maven
yuicompressor-maven-plugin
1.5.1
compress
Nossosrc/main/webapp directory contém os seguintes arquivos:
js/
├── foo.js
├── jquery-1.11.1.min.js
resources/
└── myCss.css
Depois de executarmvn clean package, o arquivo WAR gerado conterá os seguintes arquivos:
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. Mantendo os mesmos nomes de arquivo
Neste estágio, quando executamosmvn clean package,foo-min.jsemyCss-min.css são criados pelo plugin. Como usamos originalmentefoo.jsemyCss.css ao nos referirmos aos arquivos, nossa página ainda usará os arquivos originais não minimizados, pois os arquivos minimizados têm nomes diferentes dos originais.
Para evitar terfoo.js/foo-min.js emyCss.css/myCss-min.css e ter os arquivos minimizados sem alterar seus nomes, precisamos configurar o plugin com a opçãonosuffix da seguinte maneira:
net.alchim31.maven
yuicompressor-maven-plugin
1.5.1
compress
true
Agora, quando executarmosmvn clean package, teremos os seguintes arquivos no arquivo WAR gerado:
js/
├── foo.js
├── jquery-1.11.1.min.js
resources/
└── myCss.css
4. Configuração do plugin WAR
Manter os nomes dos arquivos iguais tem um efeito colateral. Isso faz com que o plugin WAR sobrescreva os arquivosfoo.jsemyCss.css minimizados com os arquivos originais, portanto, não temos as versões reduzidas dos arquivos na saída final. O arquivofoo.js contém as seguintes linhas antes da minificação:
function testing() {
alert("Testing");
}
Quando examinamos o conteúdo do arquivofoo.js no arquivo WAR gerado, vemos que ele possui o conteúdo original em vez do conteúdo reduzido. Para resolver esse problema, precisamos especificar umwebappDirectory para o plug-in do compressor e fazer referência a isso na configuração do plug-in WAR.
net.alchim31.maven
yuicompressor-maven-plugin
1.5.1
compress
true
${project.build.directory}/min
maven-war-plugin
${project.build.directory}/min
Aqui, especificamos o diretóriomin como o diretório de saída para os arquivos minificados e configuramos o plugin WAR para incluí-lo na saída final.
Agora temos os arquivos minimizados no arquivo WAR gerado, com seus nomes de arquivo originaisfoo.jsemyCss.css. Podemos verificarfoo.js para ver se ele possui o seguinte conteúdo reduzido agora:
function testing(){alert("Testing")};
5. Excluindo Arquivos Já Minificados
Bibliotecas Javascript e CSS de terceiros podem ter versões minificadas disponíveis para download. Se acontecer de você usar um desses em seu projeto, não será necessário processá-los novamente.
A inclusão de arquivos já minificados produz mensagens de aviso ao criar o projeto.
Por exemplo,jquery-1.11.1.min.js é um arquivo Javascript já reduzido e causa mensagens de aviso semelhantes às seguintes durante a compilação:
[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);})
Para excluir arquivos já minimizados do processo, configure o plugin do compressor com uma opçãoexcludes da seguinte forma:
net.alchim31.maven
yuicompressor-maven-plugin
1.5.1
compress
true
${project.build.directory}/min
**/*.min.js
Isso excluirá todos os arquivos em todos os diretórios cujos nomes terminem commin.js. Executarmvn clean package não produz mensagens de aviso agora e a compilação não tenta minificar arquivos já minimizados.
6. Conclusão
Neste artigo, descrevemos uma boa maneira de integrar a minificação de arquivos Javascript e CSS em seu fluxo de trabalho Maven. Para atender a esses ativos estáticos com seu aplicativo Spring MVC, consulte nosso artigoServe Static Resources with Spring.
Você pode encontrar o código deste artigo emGitHub.