Estou interessado em saber como você prefere automatizar a minificação de Javascript para seus aplicativos da Web Java. Aqui estão alguns aspectos nos quais estou particularmente interessado:
- Como se integra? Faz parte da sua ferramenta de construção, um filtro de servlet, um programa independente pós-processamento do arquivo WAR ou outra coisa?
- É fácil ativar e desativar ? É muito engraçado tentar depurar um script minificado, mas também é útil para um desenvolvedor poder testar se a minificação não quebra nada.
- Funciona de forma transparente ou tem algum efeito colateral (além dos inerentes à minificação) que devo considerar no meu trabalho cotidiano?
- Qual minifier ele usa?
- Será que não têm todas as características que você pode pensar?
- O que você gosta sobre isso?
- Do que você não gosta?
Isso servirá principalmente como referência para meus projetos futuros (e, esperançosamente, outros SOs acharão informativo também), portanto todos os tipos de ferramentas são interessantes.
(Observe que essa não é uma pergunta sobre qual minifier é melhor . Já temos muitos deles por aí.)
java
javascript
automation
minify
gustafc
fonte
fonte
Respostas:
Postagem de arredondamento
Se você postar algo novo neste tópico, edite esse post para criar um link para o seu.
apply
Tarefa Ant (usando o Compressor YUI)exec
Tarefa Ant usando Terserfonte
Estamos usando a tarefa Ant para minificar arquivos js com o YUICompressor durante a construção da produção e colocar o resultado em uma pasta separada. Em seguida, carregamos esses arquivos em um servidor web. Você pode encontrar alguns bons exemplos para a integração do YUI + Ant neste blog .
Aqui está um exemplo:
fonte
script src
compilações on dev ou apenas copia arquivos não minificados para o diretório / js compactado?<fileset dir="${generatedScriptsDir}" includes="**/*.js"/>
mas ele não funciona. Como posso fazer para gerar o arquivo no${generatedScriptsDir}
?Acho que uma das melhores e melhores ferramentas para o trabalho é o wro4j Confira https://github.com/wro4j/wro4j
Faz tudo o que você precisa:
Pode ser executado nos modos de depuração e produção. Apenas especifique todos os arquivos que ele deve manipular / pré-processar e faz o resto.
Você pode simplesmente incluir recursos mesclados, minificados e compactados como este:
fonte
wro
servidor de aplicativos) no servidor daapache
Web?Escrevi macros para o compilador Google Closure e o compressor Yahoo e incluí esse arquivo em diferentes projetos da web.
Integração:
<import file="build-minifier.xml" />
em seu build.xml, invoque as tarefas ant comuns:<gc-js dir="${build.js.dir}" src="prototype" />
<yc-js-all dir="${build.js.dir}" />
Escolha de dois minifiers: compilador do Google Closure e compressor do Yahoo, você deve baixá-los manualmente e colocar perto do arquivo xml
Os minimizadores pulam arquivos já compactados (terminando com
-min*
)Geralmente, faço três versões de script: descompactado (por exemplo
prototype.js
) para depuração, compactado com o compilador de fechamento (prototype-min-gc.js
) para servidor de produção, compactado com o Yahoo (prototype-min-yc.js
) para solução de problemas porque o compilador de fechamento usa otimizações de risco e às vezes produz arquivos compactados inválidos e o compressor do Yahoo é mais seguroO compressor do Yahoo pode reduzir todos os arquivos em um diretório com uma única macro. O compilador de fechamento não pode
fonte
Eu tentei de duas maneiras:
Obviamente, a última solução é melhor, pois não consome recursos em tempo de execução (meu webapp está usando o google app engine) e não complica o código do aplicativo. Portanto, assuma este último caso nas seguintes respostas:
usando maven
você o ativa apenas ao montar a guerra final; no modo de desenvolvimento, você vê a versão não compactada de seus recursos
absolutamente
Compressor YUI
não, é muito completo e fácil de usar
está integrado à minha ferramenta favorita (maven) e o plug-in está no repositório central (um bom cidadão maven)
fonte
Eu acho que você precisa de uma biblioteca de compactação, por exemplo, tag Granule.
http://code.google.com/p/granule/
Gzip e combina javascripts envolvidos pelo g: compress tag usando métodos diferentes, também possui a tarefa Ant
amostra de código é:
fonte
Estou realmente surpreso que ninguém tenha mencionado JAWR - https://jawr.github.io
É bastante maduro e suporta todos os recursos padrão que são esperados, e um pouco mais. Aqui está como ele se compara aos excelentes critérios do OP.
Originalmente, o processamento / levantamento pesado na inicialização e veiculação do aplicativo era baseado em um servlet . A partir do 3.x, eles adicionaram suporte para integração no tempo de construção .
O suporte a JSP e Facelets é fornecido por meio de uma biblioteca de tags JSP customizada para importar recursos processados. Além disso, é implementado um carregador de recursos JS que suporta o carregamento de recursos de páginas HTML estáticas .
Uma
debug=on
opção está disponível para uso antes da inicialização do aplicativo e umGET
parâmetro personalizado pode ser especificado em solicitações individuais na produção para alternar o modo de depuração seletivamente em tempo de execução para a solicitação.Para JS, ele suporta YUI Compressor e JSMin; para CSS, não tenho certeza.
SASS
suporte vem à mente. Dito isto, ele suportaLESS
.fonte
Nosso projeto lidou com isso de várias maneiras, mas continuamos usando o Compressor YUI em nossas diferentes iterações.
Inicialmente, tivemos um servlet manipulando a compactação para JavaScript na primeira vez em que um arquivo específico foi acessado; foi então armazenado em cache. Já tínhamos um sistema instalado para lidar com arquivos de propriedades personalizadas, portanto, simplesmente atualizamos nossos arquivos de configuração para permitir a ativação ou desativação do compressor, dependendo do ambiente em que estávamos trabalhando.
Agora, os ambientes de desenvolvimento nunca usam JavaScript compactado para fins de depuração. Em vez disso, lidamos com a compactação em nosso processo de compilação ao exportar nosso aplicativo para um arquivo WAR.
Nosso cliente nunca levantou preocupações sobre a compactação e os desenvolvedores não notam até decidirem depurar o JavaScript. Então, eu diria que é bastante transparente com o mínimo, se houver, de efeitos colaterais.
fonte
Isso funcionou para mim: https://bitbucket.org/m6_russell_francis/yui-compressor-ant-task/wiki/
fonte
Estou escrevendo uma estrutura para gerenciar ativos da web, chamada humpty . Ele pretende ser mais simples e mais moderno que o jawr ou o wro4j usando WebJars e ServiceLoaders.
No desenvolvimento, um servlet processa os ativos conforme necessário. Os ativos seriam pré-compilados antes da produção e colocados em uma pasta pública, para que a única parte usada fosse gerar as inclusões corretas no HTML.
Isso seria feito alternando entre os modos de desenvolvimento e produção.
Eu acredito que é transparente, mas favorece fortemente o uso de WebJars.
Qualquer que seja o plug-in que você coloca no seu caminho de classe. Atualmente, está escrevendo um plug-in para o Google Closure Compiler.
Ainda pré-lançamento, embora eu esteja usando na produção. O plugin maven ainda precisa de muito trabalho.
A simplicidade de apenas adicionar uma dependência para configurar a estrutura
É meu bebê, eu amo tudo;)
fonte
Muito atrasado para a festa aqui, mas achei que isso poderia ajudar alguém ainda procurando uma resposta diferente:
Depois de tentar usar o YUI Compressor, fiquei desapontado por ser incompatível com versões mais recentes do jQuery e Prism (as duas principais bibliotecas JS de terceiros necessárias para o meu projeto, que eu queria compactar em um único arquivo). Decidi usar o Terser , que é um fork do Uglify-JS que suporta o ES6 +. Não consegui executá-lo diretamente usando a
<exec>
tarefa, mas usar o método de linha de comando do Windows funciona pelo menos para o Windows 10 (sem dizer que não pode funcionar de outra maneira, mas essa foi uma solução muito fácil). Não há necessidade de adicionar mais nada à variável de sistema Path (como o Node.JS geralmente é adicionado durante a instalação). Primeiro uso a<concat>
tarefa ANT para criar um arquivo grande e não compactado. Use<fileset>
como preservará a ordem (se isso for importante, de qualquer maneira).Em seguida, use a
<exec>
tarefa para executar qualquer programa NPM, como o Terser. A página de manual do Apache nesta tarefa indicou que esta é a solução alternativa do Windows para a execução de arquivos .bat, mas realmente permite que você execute praticamente qualquer aplicativo de linha de comando (mesmo aqueles que<exec>
misteriosamente não podem encontrar de outra maneira).Integrar? Faz parte de um script de construção ANT (um plug-in DITA Open Toolkit para suportar JavaScript personalizado, entre outras coisas - não um aplicativo Java Web, por si só, mas usando Java para criar saída HTML5), portanto, a integração não foi muito mais do que adicionar aqueles tarefas para um novo destino (há mais código relacionado à configuração de padrões e à verificação de parâmetros de entrada!).
Fácil de ativar / desativar? No meu caso, tenho um parâmetro que passo para o ANT Build para incluir a construção e a minificação do arquivo JS. Então, sim, ele só executa esse destino se eu definir o parâmetro como 'Sim'. Isso é algo muito fácil de configurar em uma compilação do ANT.
Transparente Até agora, parece não ter efeito em nenhum dos vários arquivos JS que estou incluindo. Alguns deles são meus (e não sou especialista em JS, por qualquer meio) e alguns são, como mencionei, bibliotecas JS comuns.
Minifier Terser, mas você pode usar praticamente qualquer minificado com entrada de linha de comando com esse método.
Falta recursos? O Terser funciona apenas com JavaScript. Se eu quiser fazer o mesmo com meus arquivos CSS (o que eu faço), uso o Compressor YUI.
O Like That é um projeto atualmente ativo e tem um bom suporte. Além disso, a implementação atual (apenas chamando-a através do
<exec>
alvo ANT ) permite que eu troque os minificadores, caso eu precise usar outra coisa no caminho.Não gosto disso, requer Node.JS. Nada contra o Node.JS, lembre-se, apenas que esse projeto em particular não precisa dele de outra forma. Eu preferiria usar um arquivo Java .jar como o YUI Compressor para isso (posso distribuir isso facilmente com um plugin, se necessário).
fonte