GUJS

O Maior Fórum Javascript do Brasil

Compactação JavaScript

Compactação javascript consiste na otimização de código, a fim de diminuir ao máximo o tamanho dos arquivos que o browser deverá fazer o download na hora que um usuário acessa um determinado site. Além de deixar uma página muito mais leve e rápida, os arquivos compactados ocuparão menos espaço no servidor também. Como JavaScript é uma linguagem interpretada, o que os compactadores fazem é aplicar técnicas específicas como nome de variáveis com poucos caracteres, tirar espaços desnecessários, comentários, etc.

Um método simples de compactação é feito com o JSMIN. O que ele faz é simplesmente tirar comentários e espaços em branco desnecessários. Segue uma demonstração da compactação feita pelo JSMIN:

<script type="text/javascript">
//TAMANHO: 932 bytes

// The -is- object is used to identify the browser.  Every browser edition
// identifies itself, but there is no standard way of doing it, and some of
// the identification is deceptive. This is because the authors of web
// browsers are liars. For example, Microsoft's IE browsers claim to be
// Mozilla 4. Netscape 6 claims to be version 5.

var is = {
    ie:      navigator.appName == 'Microsoft Internet Explorer',
    java:    navigator.javaEnabled(),
    ns:      navigator.appName == 'Netscape',
    ua:      navigator.userAgent.toLowerCase(),
    version: parseFloat(navigator.appVersion.substr(21)) ||
             parseFloat(navigator.appVersion),
    win:     navigator.platform == 'Win32'
}
is.mac = is.ua.indexOf('mac') >= 0;
if (is.ua.indexOf('opera') >= 0) {
    is.ie = is.ns = false;
    is.opera = true;
}
if (is.ua.indexOf('gecko') >= 0) {
    is.ie = is.ns = false;
    is.gecko = true;
}
</script>

ficaria:

<script type="text/javascript">
// TAMANHO: 440 bytes
var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}
</script>

Como podem ver, apenas uma lógica simples já diminuiu em pouco mais de 50%. Esse é objetivo do JSMIN. Mas ainda existe uma outra maneira de compactar mais ainda seu código.

Essa outra técnica consiste em pegar as palavras usadas repetidas, como “function”, “var”, “alert”, e usar em seu lugar, uma variável de nome pequeno, como a, b, c. Depois, é feito um eval desse resultado que, via expressão regulares, irão substituir os a, b, c por seus nomes originais como “function”, “var”, “alert”, etc. Para pequenos códigos, essa técnina não faz muita diferença, mas para grandes códigos é muito mais eficiente. O mesmo código do exemplo anterior compactado ficaria:

<script type="text/javascript">
eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp('\b'+c.toString(a)+'\b','g'),k[c])}}return p}('j 1={5:2.7=='m k i',g:2.h(),6:2.7=='l',3:2.u.s(),t:9(2.b.r(q))||9(2.b),n:2.o=='p'}1.a=1.3.4('a')>=0;d(1.3.4('c')>=0){1.5=1.6=e;1.c=8}d(1.3.4('f')>=0){1.5=1.6=e;1.f=8}',31,31,'|is|navigator|ua|indexOf|ie|ns|appName|true|parseFloat|mac|appVersion|opera|if|false|gecko|java|javaEnabled|Explorer|var|Internet|Netscape|Microsoft|win|platform|Win32|21|substr|toLowerCase|version|userAgent'.split('|')))
</script>

Neste caso ficou com 529 bytes. Mas experimente pegar grandes arquivos e passar essa compactação. Uso o framework MooTools e baixei uma versão compactada, e outra normal. A versão normal tem 140kb, já a compactada ficou com 49kb. Muita diferença neh. Só não esqueça de ao usar essas compactações javascript, sempre guarde a versão original do arquivo, pois muitas vezes o código fica ilegível. Não é a toa que os compactadores são chamados também de ofuscadores.

11 Comentários para “Compactação JavaScript”

  1. Gustavo Says:

    Olá, realmente o arquivo fica menor… Mas acredito que o processamento do browser para executar o JS será um pouco maior do que se executasse o código normal.

    Seria interessante fazer um teste e verificar qual dos scripts roda mais rápido.

    []s
    Gustavo

  2. Rafael Quines Says:

    Pois é, a função eval é uma função bem custosa de ser executada para o javascript. porém, daqui a pouco, o custo de executar o eval é bem menor, em questão de tempo, do que o tempo de baixar um arquivo bem menor. Teria que ver a necessidade. Certos casos não valem a pena. Mas para grandes implementações, acredito que seja uma boa alternativa. Boa observação. Valeu. Flw

  3. Jerônimo Queiroz Says:

    Pessoal neste caso é muito melhor e com muito mais efeito é a
    utilização de compactação http. e todo o browser suporta esta
    feature.

  4. Luis Eduardo Bohrer da Silva Says:

    Acho que a compactação http é um complemento sobre esta.
    Tendo em vista que esta provem menor massa de dados a ser transferida, e só então compactada para transferência (server X browser).

  5. Marcus Vinicius Bastos Leandro Says:

    Eu estou usando compactação de javascript da forma mais hard.
    E realmente observei um processamento bem maior do brownser.

    Porém, não tem como não usar na minha aplicação, pois recebo mais de 500.000 visitas por dia! Haja banda né!

  6. Eliseu Says:

    Olá, sou novo por aqui, começei assinar a RSS faz 1 semana e vim fazer meu primeiro post para agradecer pelo conteúdo. Minha área é design de interfaces web, mas não posso deixar de lado a programação, principalmente php/mysql e javascript que fazem parte do meu cotidiano de desenvolvimento e sempre procuro conteúdo ricos e mais uma vez parei por aqui. Abraço ao autor e aos visitantes. Obrigado!

  7. Neidson Alencastro Says:

    Olá, eu também sou novo nessacoisa de javra HI HI HIHI .
    Mas quero aprender e tentei fazer uma contagem regressiva para o dia 12 de agosto de 2012 quando termina o Calendário Maia, e tudo saiu errado. Como eu faço.
    grato
    Neidsom

  8. Rafael Quines Says:

    Dá uma olhada nesse link:
    http://gujs.com.br/blog/2007/04/contagem-regressiva/

    flw

  9. Crisangela Says:

    sera que alguem pode me ajuda a criar um projeto javaScript em eclipse????
    preciso de ajuda terei uma prova amanha…se algm tiver disposto a me ajuda passo a passo tiver paciencia….passa o msn pra q eu adicione…POR FAVOR ME AJUDEEEEEEEEEEE…ahuahua
    desde ja agradeço

  10. hyloaceacle Says:

    I’d prefer reading in my native language, because my knowledge of your languange is no so well. But it was interesting! Look for some my links:

  11. Willie Says:

    Existe algum script ou ferramenta que faça o trabalho inverso?

    Estou com um código compactado mas preciso analisá-lo só que tá osso com essa versão compactada.

Comentários

©2008 GUJS. Todos os direitos reservados.