Este é o sexto post de uma série de posts que estou escrevendo sobre a ASP.NET 4.5. 
 
Os
 próximos lançamentos do .NET e Visual Studio incluem vários novos e 
ótimos recursos e capacidades. Com a ASP.NET 4.5 você vai ver um monte
 de melhorias realmente emocionantes em formulários da Web ( Web Forms )
 e MVC - assim como no núcleo da base de código da ASP.NET, no qual 
estas tecnologias são baseadas.
 
O post de hoje cobre um pouco do 
trabalho que estamos realizando para adicionar suporte nativo para combinação e minificação de arquivos JavaScript e CSS dentro da ASP.NET - o que torna mais fácil 
melhorar o desempenho das aplicações. Este recurso pode ser utilizado 
por todas as aplicações ASP.NET, incluindo tanto a ASP.NET MVC quanto a 
ASP.NET Web Forms.
 Noções básicas sobre Combinação e Minificação  
Como
 mais e mais pessoas usando dispositivos móveis para navegar na web, 
está se tornando cada vez mais importante que os websites e aplicações 
que construímos tenham um bom desempenho neles. Todos nós já tentamos 
carregar sites em nossos smartphones - apenas para, eventualmente, 
desistirmos em meio à frustração porque os mesmos são carregados lentamente 
através da lenta rede celular. Se o seu site/aplicação carrega 
lentamente assim, você está provavelmente perdendo clientes em potencial
 por causa do mau desempenho/performance. Mesmo com máquinas desktop poderosas, o 
tempo de carregamento do seu site e o desempenho percebido podem 
contribuir enormemente para a percepção do cliente.
 
A maioria dos 
websites hoje em dia são construídos com múltiplos arquivos de 
JavaScript e CSS para separar o código e para manter a base de código 
coesa. Embora esta seja uma boa prática do ponto de vista de 
codificação, muitas vezes isso leva a algumas consequências negativas no
 tocante ao desempenho geral do site. Vários arquivos de JavaScript e 
CSS requerem múltiplas solicitações HTTP provenientes do navegador - o 
que pode retardar o tempo de carregamento do site.  
 
Exemplo Simples
 
A
 seguir eu abri um site local no IE9 e gravei o tráfego da rede usando 
as ferramentas do desenvolvedor nativas do IE (IE Developer Tools) que 
podem ser acessadas com a tecla F12. Como mostrado abaixo, o site é 
composto por 5 arquivos CSS e 4 arquivos JavaScript, os quais o 
navegador tem que fazer o download. Cada arquivo é solicitado 
separadamente pelo navegador e retornado pelo servidor, e o processo 
pode levar uma quantidade significativa de tempo proporcional ao número 
de arquivos em questão. 
 
 
Combinação
 
A
 ASP.NET está adicionando um recurso que facilita a "união" ou 
"combinação" de múltiplos arquivos CSS e JavaScript em menos 
solicitações HTTP. Isso faz com que o navegador solicite muito menos 
arquivos, o que por sua vez reduz o tempo que o mesmo leva para 
buscá-los. A seguir está uma versão atualizada do exemplo mostrado 
acima, que tira vantagem desta nova funcionalidade de combinação de 
arquivos (fazendo apenas um pedido para JavaScript e um pedido para 
CSS):
 
 
O
 navegador agora tem que enviar menos solicitações ao servidor. O 
conteúdo dos arquivos individuais foram combinados/unidos na mesma 
resposta, mas o conteúdo dos arquivos permanece o mesmo - por isso o 
tamanho do arquivo geral é exatamente o mesmo de antes da combinação (somando o tamanho dos arquivos separados). Mas note como mesmo em uma máquina de desenvolvimento local (onde a 
latência da rede entre o navegador e o servidor é mínima), o ato de 
combinar os arquivos CSS e JavaScript ainda consegue reduzir o tempo de 
carregamento total da página em quase 20%. Em uma rede lenta a melhora 
de desempenho seria ainda maior.
 
Minificação
 
A
 próxima versão da ASP.NET também está adicionando uma nova 
funcionalidade que facilita reduzir ou "minificar" o tamanho do 
download do conteúdo. Este é um processo que remove espaços em branco, 
comentários e outros caracteres desnecessários dos arquivos CSS e 
JavaScript. O resultado é arquivos menores, que serão enviados e 
carregados no navegador muito mais rapidamente. O gráfico a seguir 
mostra o ganho de desempenho que estamos tendo quando os processos de combinação e 
minificação dos arquivos são usados ??em conjunto:
 
 
Mesmo
 no meu computador de desenvolvimento local (onde a latência da rede é 
mínima), agora temos uma melhoria de desempenho de 40% a partir de onde 
originalmente começamos. Em redes lentas (e especialmente com clientes 
internacionais), os ganhos seriam ainda mais significativos.
 Usando Combinação e Minificação de Arquivos dentro da ASP.NET 
A
 próxima versão da ASP.NET torna realmente fácil tirar proveito da 
combinação e minificação de arquivos dentro de projetos, possibilitando 
ganhos de desempenho como os que foram mostrados nos cenários acima. A 
forma como ela faz isso, te permite evitar a execução de ferramentas 
personalizadas/customizadas, como parte do seu processo de construção da 
aplicação/website - ao invés disso, a ASP.NET adicionou suporte no tempo
 de execução/runtime para que você possa executar a 
combinação/minificação dos arquivos dinamicamente (cacheando os 
resultados para ter certeza de que a performance seja realmente 
satisfatória). Isto permite uma experiência de desenvolvimento 
realmente limpa e torna super fácil começar a tirar proveito destas 
novas funcionalidades.
 
Vamos supor que temos um projeto simples com 4 arquivos JavaScript e 6 arquivos CSS:
 
 
Combinando e Minificando os Arquivos CSS
 
Digamos
 que você queira referenciar em uma página todas as folhas de estilo que
 estão dentro da pasta "Styles" mostrada acima. Hoje você tem que 
adicionar múltiplas referências para os arquivos CSS para obter todos 
eles - o que se traduziria em seis requisições HTTP  separadas:
 
 
O
 novo recurso de combinação/minificação agora permite que você combine e
 minifique todos os arquivos CSS da pasta Styles - simplesmente enviando
 uma solicitação de URL para a pasta (neste caso, "styles"), com um 
caminho adicional "/css" na URL. Por exemplo:
 
   
 
Isso
 fará com que a ASP.NET verifique o diretório, combine e minifique os 
arquivos CSS que estiverem dentro da pasta, e envie uma única resposta 
HTTP para o navegador com todo o conteúdo CSS.
 
Você não precisa
 executar nenhuma ferramenta ou pré-processamento para obter esse 
comportamento. Isso te permite separar de maneira limpa seus estilos em
 arquivos CSS separados e condizentes com cada funcionalidade da 
aplicação mantendo uma experiência de desenvolvimento extremamente limpa
 - e mesmo assim você não terá um impacto negativo de desempenho no 
tempo de execução da aplicação. O designer do Visual Studio também vai 
honrar a lógica de combinação/minificação - assim você ainda terá uma 
experiência WYSWIYG no designer dentro VS.
 
Combinando e Minificando os Arquivos JavaScript
 
Como
 a abordagem CSS mostrada acima, se quiséssemos combinar e minificar 
todos os nossos arquivos de JavaScript em uma única resposta, poderíamos
 enviar um pedido de URL para a pasta (neste caso, "scripts"), com um 
caminho adicional "/js":
 
  
 
Isso
 fará com que a ASP.NET verifique o diretório, combine e minifique 
os arquivos com extensão .js dentro dele, e envie uma única resposta 
HTTP para o navegador com todo o conteúdo JavaScript. Mais uma vez - 
nenhuma ferramenta customizada ou etapas de construção foi necessária 
para obtermos esse comportamento. Este processo funciona em todos os navegadores.
 
Ordenação dos Arquivos dentro de um Pacote
 
Por
 padrão, quando os arquivos são combinados pela ASP.NET, eles são 
ordenados em ordem alfabética primeiramente, exatamente como eles são 
mostrados no Solution Explorer. Em seguida, eles são automaticamente 
reorganizados de modo que as bibliotecas conhecidas e suas extensões 
personalizadas, tais como jQuery, MooTools e Dojo sejam carregadas antes
 de qualquer outra coisa. Assim, a ordem padrão para a combinação dos 
arquivos da pasta Scripts, como a mostrada acima será:
 
jquery-1.6.2.js
jquery-ui.js
jquery.tools.js
a.js
 
Por padrão, os arquivos CSS também são classificados em ordem alfabética e depois são reorganizados de forma que o arquivo reset.css e normalize.css
 (se eles estiverem presentes na pasta) venham sempre antes de qualquer 
outro arquivo. Assim, o padrão de classificação da combinação dos 
arquivos da pasta "Styles", como a mostrada acima será:
 
reset.css
content.css
forms.css
globals.css
menu.css
styles.css
 
A
 ordenação/classificação é totalmente personalizável, e pode ser 
facilmente alterada para acomodar a maioria dos casos e qualquer padrão 
de nomenclatura que você prefira. O objetivo com a experiência pronta 
para uso, porém, é ter padrões inteligentes que você pode simplesmente 
usar e ter sucesso com os mesmos.
 
Qualquer número de Diretórios/Subdiretórios é Suportado
 
No
 exemplo acima, nós tivemos apenas uma única pasta "Scripts" e "Styles" 
em nossa aplicação. Isso funciona para alguns tipos de aplicação (por 
exemplo, aplicações com páginas simples). Muitas vezes, porém, você vai
 querer ter múltiplos pacotes/combinações de arquivos CSS/JS dentro de 
sua aplicação - por exemplo: um pacote "comum", que tem o núcleo dos 
arquivos JS e CSS que todas as páginas usam, e então arquivos 
específicos para páginas ou seções que não são utilizados globalmente.
 
Você
 pode usar o suporte à combinação/minificação em qualquer número de 
diretórios ou subdiretórios em seu projeto - isto torna mais fácil 
estruturar seu código de forma a maximizar os benefícios da 
combinação/minificação dos arquivos. Cada diretório por padrão pode ser
 acessado como um pacote separado e endereçável através de uma URL.  
 Extensibilidade para Combinação/Minificação de Arquivos 
O
 suporte da ASP.NET para combinar e minificar é construído com 
extensibilidade em mente e cada parte do processo pode ser estendido ou 
substituído. 
 
Regras Personalizadas
 
Além
 de permitir a abordagem de empacotamento - baseada em diretórios - que 
vem pronta para ser usada, a ASP.NET também suporta a capacidade de 
registrar pacotes/combinações personalizadas usando uma nova API de 
programação que estamos expondo.  
 
O código a seguir demonstra 
como você pode registrar um "customscript" (script personalizável) 
usando código dentro da classe Global.asax de uma aplicação. A API 
permite que você adicione/remova/filtre os arquivos que farão parte do 
pacote de maneira muito granular:
 
    
 
O
 pacote personalizado acima pode ser referenciado em qualquer lugar 
dentro da aplicação usando a referência de <script> mostrada a 
seguir:
 
    
 
Processamento Personalizado
 
Você
 também pode substituir os pacotes padrão CSS e JavaScript para suportar
 seu próprio processamento personalizado dos arquivos do pacote (por 
exemplo: regras personalizadas para minificação, suporte para Saas, LESS
 ou sintaxe CoffeeScript, etc). 
 
No exemplo mostrado a seguir, 
estamos indicando que queremos substituir as transformações nativas de 
minificação com classes MyJsTransform e MyCssTransform personalizadas. 
Elas são subclasses dos respectivos minificadores padrão para CSS e 
JavaScript, e podem adicionar funcionalidades extras:
 
    
 
O
 resultado final desta extensibilidade é que você pode se plugar dentro 
da lógica de combinação/minificação em um nível profundo e fazer algumas
 coisas muito legais com este recurso.
 Vídeo de 2 Minutos sobre Combinação e Minificacão de Arquivos em Ação 
Mads Kristensen tem um ótimo vídeo de 90 segundo (em Inglês) que demonstra a utilização do recurso de Combinação e Minificação de Arquivos. Você pode assistir o vídeo de 90 segundos aqui.
 Sumário 
O
 novo suporte para combinação e minificação de arquivos CSS e JavaScript dentro da próxima versão da 
ASP.NET tornará mais fácil a construção de  aplicações web 
performáticas. Este recurso é realmente fácil de usar e não requer 
grandes mudanças no seu fluxo de trabalho de desenvolvimento existente. Ele também suporta uma rica API de extensibilidade que permite a você 
personalizar a lógica da maneira que você achar melhor.
 
Você pode facilmente tirar vantagem deste novo suporte dentro de aplicações baseadas em ASP.NET MVC e ASP.NET Web Forms.
 
Espero que ajude,
 
Scott
 
P.S. Além do blog, eu uso o Twitter para disponibilizar posts rápidos e para compartilhar links.Lidar com o meu Twitter é: @scottgu
  
Texto traduzido do post original por
 Leniel Macaferi.
 
google_ad_client = "pub-8849057428395760";
/* 728x90, created 2/15/09 */
google_ad_slot = "4706719075";
google_ad_width = 728;
google_ad_height = 90;