otimização de aplicações web

Post on 08-May-2015

766 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Otimização de aplicações webÍTALO LELIS DE VIETRO

JOÃO DE ARAÚJO NETO

O que iremos ver?

Entendendo a otimização

Organizando o server-side

GZIP

Headers Etags

Caching

Reduzindo a quantidade de requests

Minificar e mesclar css e js Yahoo CLI

Otimização de imagens Css Sprite

Organização do HTML

Otimização do CSS

Carregamento modular js

HTML5 Boilerplate

Ferramentas de diagnostico

Entendendo a otimização

As aplicações web estão cada vez mais robustas, muitas delas recebem milhões de usuários por dia, mas será que elas realmente aguentam essa quantidade de requisições mantendo a qualidade de seus serviços?

Nosso objetivo hoje é de aprender a otimizar nossas aplicações front-end para que o usuário tenha a melhor experiência possível.

Configurando nossa aplicaçãoOTIMIZANDO A APLICAÇÃO

Organizando o server-side

Apesar do foco dessa apresentação ser o front-end, não podemos deixar de mencionar algumas configurações do servidor para interagirmos com nosso front-end, aqui vão algumas dicas:

Habilitar o GZIP

Configure os headers de resposta

Como configuramos nossos servidores para utilizar o gzip? Muito simples, basta informarmos ao .htaccess que queremos utiliza-lo. Exemplo:

O Gzip é um software para compressão e descompressão de arquivos. Ele é altamente utilizado em websites para aumentar a performance.

Sites que utilizam o o Gzip podem ser até 80% mais rápidos.

  # Compress all output labeled with one of the following MIME-types  <IfModule mod_filter.c>    AddOutputFilterByType DEFLATE application/atom+xml \                                  application/javascript \                                  application/json \                                  application/rss+xml \                                  application/vnd.ms-fontobject \                                  application/x-font-ttf \                                  application/xhtml+xml \                                  application/xml \                                  font/opentype \                                  image/svg+xml \                                  image/x-icon \                                  text/css \                                  text/html \                                  text/plain \                                  text/x-component \                                  text/xml  </IfModule>

Configure o cache Configure as Etags

Invalide o cache

Defina o tempo de cache para cada tipo de arquivo

Faça as requisições Ajax com cache

Muitas vezes pensamos que o browser do cliente irá fazer o cache automático de nossa aplicação, mas precisamos informa-lo de como fazer o cache da maneira correta.

Para isso utilizamos os recursos de headers.

ETags

A Etag é um mecanismo para identificação de um componente em cache. Em outras palavras um componente é identificado por uma string única e o browser pode verificar se ela foi modificada ou não.

O problema das Etags é que elas são geradas para um único servidor sendo inviável valida-la em outro servidor

A melhor solução então é cancelar o uso da Etag, dessa forma o browser não irá verificar o componente. Isso trás uma performance significativa para o website

# FileETag None is not enough for every server.<IfModule mod_headers.c>  Header unset ETag</IfModule>

# Since we're sending far-future expires, we don't need ETags for# static content.# developer.yahoo.com/performance/rules.html#etagsFileETag None

Invalide o cache

Invalidar o cache também é uma ótima estratégia para alteração de conteúdo.

Podemos utilizar uma estratégia de versionamento de componentes, assim o servidor saberá quando um arquivo foi alterado e precisa ser recarregado.

Utilize helpers server-side para versionamento dos arquivos.

<link rel=“stylesheet” src=“http://domain.com/style.css?v=1”>

<link rel=“stylesheet” src=“http://domain.com/normalize.css?v=1”>

Defina o tempo de cache para cada tipo de arquivo

O famoso Expires dos servidores é uma das melhores soluções para controle de cache

Utilizamos diversos “tempos” diferentes para cada tipo de arquivo, por exemplo, arquivos como imagem

<IfModule mod_expires.c>  ExpiresActive on

# Perhaps better to whitelist expires rules? Perhaps.  ExpiresDefault "access plus 1 month"

# Your document html  ExpiresByType text/html "access plus 0 seconds“

# Data  ExpiresByType text/xml "access plus 0 seconds"  ExpiresByType application/xml "access plus 0 seconds"  ExpiresByType application/json "access plus 0 seconds"

# Favicon (cannot be renamed)  ExpiresByType image/x-icon "access plus 1 week"

# Media: images, video, audio  ExpiresByType image/gif "access plus 1 month"  ExpiresByType image/png "access plus 1 month"  ExpiresByType image/jpeg "access plus 1 month"

# Webfonts  ExpiresByType application/x-font-ttf "access plus 1 month"  ExpiresByType font/opentype "access plus 1 month"  ExpiresByType application/x-font-woff "access plus 1 month"  ExpiresByType image/svg+xml "access plus 1 month"  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"

# CSS and JavaScript  ExpiresByType text/css "access plus 1 year"  ExpiresByType application/javascript "access plus 1 year"

</IfModule>

Reduzindo as requisições

Reduzir a quantidade de requisições que a aplicação faz para nossos servidores é uma ótima solução para otimizarmos o carregamento da página, mas para isso precisamos entender como fazer isso.

Um browser pode carregar até 3 arquivos em paralelo para cada servidor.

Deixe os arquivos estáticos em servidores CDN com subdomínios, dessa forma o browser poderá carregar 3 arquivos para cada subdomínio em paralelo.

Exemplo: Um website com 9 js sendo carregados no mesmo servidor, irá carregar 3 deles em paralelos depois mais 3 e mais 3. Já com o CDN com 3 subdomínios ele poderá carregar os 9 em paralelo.

Minificar e mesclar js e css

Essa estratégia é considerada uma das melhores para obtermos uma boa performance, o problema é que a maioria dos desenvolvedores não utiliza. Vamos entender como funciona:

• O arquivo é escrito normalmente

Arquivos js/css normais

Ferramentas para comprimir arquivos

YUI Compressor – Ferramenta de Yahoo que promete ser a mais segura e eficiente de todas.

Packer – Comprime JS pela web

JSCompress.com – Usa JSMin ou Packer para reduzir o tamanho dos arquivos.

CSS Compressor – Comprime arquivos CSS.

Easy YUI compressor – Versão visual do YUI compressor

Ferramentas para unificar arquivos

Normalmente essas ferramentas são executadas em tempo de execução, elas comprimem e unificam os arquivos, logo em seguida armazenam os arquivos gerados em cache.

Minify – Ferramenta em PHP que utiliza a biblioteca YUI compressor

Zend_Minify – API do Zend Framework para YUI compressor

Easy Minify – API do Easy Framework para YUI compressor

YUI compressor for .net. – Biblioteca para .NET

Ant – Biblioteca para Java

ExemplosComo as ferramentas funcionam

Otimização de imagens

As imagens são os maiores responsáveis pela baixa performance de websites e aplicações. Felizmente existem formas de contornar esse problema:

Não coloque imagens maiores do que o necessário

Comprima as imagens

Use os formatos corretos para cada ocasião

Defina o tamanho e a largura da imagem no HTML

Use Sprites onde possível

Css Sprite

Sprite é uma imagem que contém outras imagens dentro dela, onde nós podemos pega-las através do css e manipula-la de diversas formas.

Diminui significativamente as requisições para o servidor

As imagens são manipuladas pelo css através da posição no arquivo

Boas práticasAPRENDENDO AS BOAS PRATICAS DA OTIMIZAÇÃO WEB

Organização do HTML

Arquivos css no topo do documento

Arquivos js no final do arquivo

Deixe os arquivos de mesmo tipo próximos

Crie arquivos css e js externos

Evite duplicação de scripts

Fazer carregamento tardio de components

Pré carregamento dos componentes

Quebre os componentes em vários subdominios

Diminiua o uso de iframes

Mantenha seus componentes abaixo de 25k

Otimização de CSS

Use css sprites

Coloque os arquívos no topo do documento

Evite expressões no HTML

{background-color: expression((new Date().getHours()%2 ? “#00000” : “#FFFFF”))}

Use arquivos externos (evite inline e tag style)

Prefira <link> ao invés de @import

Carregamento modular js

Utilizamos o carregamento modular do js quando precisamos de mais performance e organização. Através do carregamento modular podemos carregar apenas os arquivos, funções ou classes especificas que iremos usar. Para isso podemos utilizar o Require JS.

Vantagens:

Carregamento otimizado, não precisamos carregar tudo

Podemos carregar apenas uma função ou classe

Integrado com NodeJs

Jquery incorporado

UglifyJS para comprimir e unificar todos os js requeridos

Carregamento modular js

require(["jquery", "jquery.alpha", "jquery.beta"], function($) {

//the jquery.alpha.js and jquery.beta.js plugins have been loaded.

$(function() {

$('body').alpha().beta();

});

});

O requireJS trabalha de forma simples, apenas uma função chamada “require(“file”, function)”.

O grande diferencial é que o arquivo será carregado somente quando você precisar.

HTML5 Boilerplate

O HTML5 boilerplate é um conjunto de boas práticas para você iniciar o seu projeto otimizado em HTML5. Com ele você tem um arquivo .htaccess totalmente configurado para trabalhar da melhor maneira possível, além disso também contamos com:

Suporte cross-browser

Compatibilidade com browsers legados

Estrutura padrão de um documento HTML5 otimizado

Estrutura padrão para criação de plug-ins js

Estutura padrão para css cross-browser

Ferramentas de diagnostico

Com as ferramentas de diagnostico podemos saber como está o fluxo de nossas aplicações, além de sabermos exatamente quais arquivos ou recursos estão deixando o site lento. Aqui vai uma lista dos mais populares:

Chrome Developer Tools – Para debugação do js, analise de recursos e elementos

Firebug – Para debugação do js, analise de recursos e elementos

GzipTest – Verifica se determinado domínio usa GZIP

HTTP Analysis Tools – Diversas ferramentas de analise, como compressão, cache, invalid caches

Page Speed – Verifica se sua aplicação segue as diretrizes de um site otimizado

Dúvidas?

top related